2014-01-06 44 views
2

我使用Sprite Kit創建了一個涉及氣球的遊戲。氣球圖像是一個長矩形(虛線),但我用氣球(實線)在氣球本身周圍定義了一個物理體。我希望球員能夠「彈出」氣球。我使用下面的代碼塊來實現這一目標:確定某個點是否位於Sprite Kit中物理主體的邊界內

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *touch = [touches anyObject]; 
    NSArray *nodes = [self nodesAtPoint:[touch locationInNode:self]]; 
    for (SKNode *node in nodes) { 
     [node removeFromParent]; 
     SKAction *pop = [SKAction playSoundFileNamed:@"pop.wav" waitForCompletion:NO]; 
     [self runAction:pop]; 
    } 
} 

不幸的是,當有在幫幾個氣球,這種方法可能會導致一個水龍頭爆裂多個氣球。這是因爲精靈圖像重疊(即使物理實體沒有)。還有一個不希望的效果,即在琴絃上點擊會產生與在氣球上點擊相同的效果。

我有權訪問觸點的座標,但是甚至可以檢測某個點是否位於物理體(與節點相對)定義的區域內?

enter image description here

回答

0

我看了,但沒能找到檢查觸摸是否是一個精靈的physicsBody內進行的一種方式。我會建議分開字符串和氣球子彈。

你可以嘗試以下任一:

  1. 使用單獨的精靈節點的氣球和串並使用SKPhysicsJoint連接它們。

  2. 子類SKSpriteNode並添加兩個精靈,即氣球和字符串作爲雪碧的孩子。然後你可以檢查一下精靈上的觸摸是否在氣球上。

此外,對於多個氣球彈出的問題,你可以修改你這樣的代碼:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *touch = [touches anyObject]; 
    NSArray *nodes = [self nodesAtPoint:[touch locationInNode:self]]; 

    //Instead of popping all nodes within the touch, pop only the first object. 
    if ([nodes count] > 0) 
    { 
     SKNode *node = [nodes firstObject]; 
     [node removeFromParent]; 
     SKAction *pop = [SKAction playSoundFileNamed:@"pop.wav" waitForCompletion:NO]; 
     [self runAction:pop]; 
    } 
} 
+0

難道不可能檢測觸摸是否在物理體內? – Confused

1

使用物理世界的bodyAtPoint:方法:

SKPhysicsBody* body = [self.scene.physicsWorld bodyAtPoint:location]; 
+0

這似乎是最好的答案,但它看起來像bodyAtPoint仍然是越野車。我遇到一些奇怪的偏移,看起來像其他人正在經歷同樣的事情:http://stackoverflow.com/questions/19876932/sprite-kit-bodyatpoint-and-bodyinrect-return-incorrect-values –

1

bodyAtPoint是越野車,但你必須一個可行的選擇。 您可以使用氣球多邊形路徑創建光線。

[self.physicsWorld enumerateBodiesAlongRayStart:rayStart end:rayEnd 
    usingBlock:^(SKPhysicsBody *body, CGPoint point,CGVector normal, BOOL *stop) { 

    if(body.categoryBitMask & baloonCategory){ 
     SKPhysicsBody *contactBody=body; 
     CGPoint contactPoint=point; 
     *stop=YES; 
    } 

}]; 
相關問題