2013-12-08 43 views
0

我必須在這裏丟失真正明顯的東西。我的目標是:在屏幕中心創建一個盒子,彈跳球留在盒子裏。我正在嘗試爲邊界框創建一個基於邊緣的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; 
} 

回答

1

1)你的物理模擬不排隊的原因你的視覺表現是你已經設置了的x/yScale屬性至0.25。這些屬性影響你的精靈的視覺表現,但不影響底層的物理模型。基本的問題是,你的球和盒子的尺寸在每個維度上都減少了四倍,但球的下降距離根本不會減少。

我懷疑這個解決方案只是簡單地將所有東西的大小縮小4倍,而不是依靠x/yScale屬性。當我將BGTILE_SIZE減少到25和圓的半徑時,在CGPathAddArcbodyWithCircleOfRadius:之間,到15,球就會停在iPad模擬器盒子的底部。

正如你所說,你沒有設置self.physicsWorld.contactDelegate = self;

+0

謝謝,這是一個很好的觀點。在減少BGTILE_SIZE之後,我確實可以將屏幕中的物理框放入適當的位置。但是,這是事情,它仍然比與SKSpriteNode相關的紅色框大。由於我在計算精靈和物理體的大小時使用了相同的因子,因此我期望它們在大小上匹配(並且一起縮放)。爲什麼物理體的盒子不與精靈的對齊? – Thunk

+0

@Thunk對不起,當我將代碼複製到測試項目中時,我錯過了設置'xScale'和'yScale'的行。我已經更新了我的答案,以解釋爲什麼你仍然沒有看到所有事情。 – godel9

+0

謝謝,這使我走上了正確的道路。縮放整個場景而不是layerSubSpace產生了期望的結果。我可以改變相對於屏幕的框(子空間)的大小,並且無論縮放如何,球仍保持在內部。 – Thunk