我必須在這裏丟失真正明顯的東西。我的目標是:在屏幕中心創建一個盒子,彈跳球留在盒子裏。我正在嘗試爲邊界框創建一個基於邊緣的SKSpriteNode,併爲內部球創建一個基於體積的SKShapeNode。球在盒子中心產生,從盒子中落下,從屏幕上掉落,顯然在屏幕底部下方碰到某物,並在底部邊緣上方彈回幾次,最後消失。一直以來,didBeginContact都不會開火。將SKShapeNode保存在SKSpriteNode的範圍內
問題1:爲什麼我的球從可見框中掉下來,然後接觸到屏幕邊緣以下的東西?我的物理學家是否與實際的精靈錯位?
問題2:爲什麼didBeginContact沒有發射? [編輯,好吧,這很簡單。忘了設置physicsworld.delegate]
謝謝!
Scene.h
#define MAX_WORLD_CELLS_X 10
#define MAX_WORLD_CELLS_Y 10
#define BGTILE_SIZE 100
typedef enum : uint32_t {
TYPE_SUBSPACE = 1,
TYPE_WORLD = 2,
TYPE_CHILD = 4
} ColliderTypes;
@interface helloScene : SKScene
<SKPhysicsContactDelegate>
{
SKSpriteNode *layerSubSpace,*layerWorld;
}
@end
Scene.m,didBeginContact
-(void) didBeginContact:(SKPhysicsContact *)contact
{
NSLog(@"Function: GameScene.m:didBeginContact");
}
Scene.m,initWithSize
-(id)initWithSize:(CGSize)size
{
if (self = [super initWithSize:size])
{
self.backgroundColor = [SKColor colorWithRed:0.15 green:0.15 blue:0.3 alpha:1.0];
CGSize layerSize = CGSizeMake(MAX_WORLD_CELLS_X * BGTILE_SIZE *2, MAX_WORLD_CELLS_Y * BGTILE_SIZE *2);
layerSubSpace = [SKSpriteNode spriteNodeWithColor:[UIColor redColor] size:layerSize];
//center subSpace on the screen's center
layerSubSpace.position = CGPointMake(CGRectGetMidX(self.frame),
CGRectGetMidY(self.frame));
CGRect subspaceRect = CGRectMake(-layerSubSpace.size.width/2, -layerSubSpace.size.height/2, layerSubSpace.size.width, layerSubSpace.size.height);
layerSubSpace.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:subspaceRect];
layerSubSpace.physicsBody.affectedByGravity = NO;
layerSubSpace.physicsBody.categoryBitMask = TYPE_SUBSPACE;
layerSubSpace.physicsBody.contactTestBitMask = TYPE_WORLD;
layerSubSpace.physicsBody.collisionBitMask = TYPE_WORLD;
[self addChild:layerSubSpace];
SKShapeNode *ball = [[SKShapeNode alloc] init];
CGMutablePathRef myPath = CGPathCreateMutable();
CGPathAddArc(myPath, NULL, 0,0, 60, 0, M_PI*2, YES);
ball.path = myPath;
ball.lineWidth = 1.0;
ball.fillColor = [SKColor blueColor];
ball.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:60];
ball.physicsBody.restitution = 1;
ball.physicsBody.categoryBitMask = TYPE_WORLD;
ball.physicsBody.collisionBitMask = TYPE_SUBSPACE;
ball.physicsBody.contactTestBitMask = TYPE_SUBSPACE;
[layerSubSpace addChild:ball];
}
layerSubSpace.xScale = 0.25;
layerSubSpace.yScale = 0.25;
return self;
}
謝謝,這是一個很好的觀點。在減少BGTILE_SIZE之後,我確實可以將屏幕中的物理框放入適當的位置。但是,這是事情,它仍然比與SKSpriteNode相關的紅色框大。由於我在計算精靈和物理體的大小時使用了相同的因子,因此我期望它們在大小上匹配(並且一起縮放)。爲什麼物理體的盒子不與精靈的對齊? – Thunk
@Thunk對不起,當我將代碼複製到測試項目中時,我錯過了設置'xScale'和'yScale'的行。我已經更新了我的答案,以解釋爲什麼你仍然沒有看到所有事情。 – godel9
謝謝,這使我走上了正確的道路。縮放整個場景而不是layerSubSpace產生了期望的結果。我可以改變相對於屏幕的框(子空間)的大小,並且無論縮放如何,球仍保持在內部。 – Thunk