1

我正在做一個拖放遊戲,並試圖使用physicsBody來檢測1靜態對象和被用戶拖動的對象之間的聯繫。SK遊戲 - didBeginContact/didEndContact沒有被調用

我在這裏搜索了幾個小時,並在線觀看了教程,但我一直看到的是接觸檢測與動態節點(如投射物)一起工作。我不需要碰撞,因爲任何節點在交叉時都不會發生任何碰撞,我只需要接觸檢測來實現遊戲邏輯。

我最初有一個使用CGRectContainsPoint和CGRectContainsRect的工作解決方案,但它是超級越野車,在做了一些研究之後,我意識到它不是在SK中實現接觸/碰撞的正確方法。

我有我的掩碼設置,如下所示:

//contact bit masks 
typedef NS_OPTIONS(uint32_t, ContactCategory) { 
    ContactCategoryTile  = 1 << 0, //0000 
    ContactCategoryKey  = 1 << 1, //0010 
    ContactCategoryRotor = 1 << 2, //0100 
}; 

我選擇的節點的設置,像這樣:

#import "TileNode.h" 
#import "Utilities.h" 

@interface TileNode() 

@end 

@implementation TileNode 

+(instancetype)tileNodeAtPosition:(CGPoint)position 
       tileComboScore:(NSInteger)comboScore 
       tileArray:(NSArray*)array 
       randomNumber:(int)randomNumber 
       initialCombo:(NSInteger)initCombo 
{ 
    //custom node properties 
    TileNode *tileNode = [array objectAtIndex:randomNumber]; 
    tileNode.position = position; 
    tileNode.size = CGSizeMake(23, 63); 

    //using label property from .h file and parenting to generated tileNode 
    tileNode.comboLabel = [SKLabelNode labelNodeWithFontNamed:@"Arial"]; 
    tileNode.comboLabel.fontColor = [UIColor whiteColor]; 
    tileNode.comboLabel.text = [NSString stringWithFormat: @"%d",initCombo]; 
    tileNode.comboLabel.fontSize = 12; 
    tileNode.comboLabel.position = CGPointMake(13, 45); 

    [tileNode setupPhysicsBody]; 
    [tileNode addChild:tileNode.comboLabel]; 

    return tileNode; 
} 

-(void)setupPhysicsBody 
{ 
    self.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.frame.size]; 
    NSLog(@"tileframe %@", NSStringFromCGRect(self.frame)); 
    self.physicsBody.dynamic = NO; 
    self.physicsBody.categoryBitMask = ContactCategoryTile; 
    self.physicsBody.contactTestBitMask = ContactCategoryTile | ContactCategoryRotor | ContactCategoryKey; 
    self.physicsBody.collisionBitMask = 0; 
} 

我的目標節點類型的設置像這樣:

#import "KeyNode.h" 
#import "Utilities.h" 

@implementation KeyNode 

+(instancetype)keyNodeAtPosition:(CGPoint)position 
{ 
    //custom class properties for generic yellow nodes in UI 
    KeyNode *keyTile = [KeyNode spriteNodeWithImageNamed:@"key"]; 
    keyTile.position = position; 
    keyTile.size = CGSizeMake(25, 65); 
    keyTile.anchorPoint = CGPointMake(0.5, 0.5); 
    keyTile.name = @"keyNode"; 

    [keyTile setupPhysicsBody]; 

    return keyTile; 
} 

-(void)setupPhysicsBody 
{ 
    self.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.frame.size]; 
    NSLog(@"keyframe %@", NSStringFromCGRect(self.frame)); 
    self.physicsBody.dynamic = NO; 
    self.physicsBody.categoryBitMask = ContactCategoryKey; 
    self.physicsBody.contactTestBitMask = ContactCategoryTile; 
    self.physicsBody.collisionBitMask = 0; 
} 

和我的接觸檢測代理方法如下:

-(void)didEndContact:(SKPhysicsContact *)contact 
{ 
    NSLog(@"Working!"); 
    //Condition for tile and key contact 
    if (contact.bodyA.categoryBitMask == ContactCategoryTile && contact.bodyB.categoryBitMask == ContactCategoryKey) 
    { 
     NSLog(@"Tile contact with key"); 
    } 
    //condition for tile and tile contact 
    else if (contact.bodyA.categoryBitMask == ContactCategoryTile && contact.bodyB.categoryBitMask == ContactCategoryTile) 
    { 
     NSLog(@"Tile contact with tile"); 
    } 
    //condition for tile and rotor contact 
    else if(contact.bodyA.categoryBitMask == ContactCategoryTile && contact.bodyB.categoryBitMask == ContactCategoryRotor) 
    { 
     NSLog(@"Tile contact with rotor"); 
    } 
} 

並且兩個節點都被實例化在initWithSize像這樣:

CGPoint position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame) - 180); 
TileNode *tileNode1 = [TileNode tileNodeAtPosition:position tileComboScore:self.comboScore tileArray:tileImagesArray randomNumber:randomTileGenerator initialCombo:self.initialCombo]; 
[self addChild:tileNode1]; 

KeyNode *keyNode1 = [KeyNode keyNodeAtPosition:CGPointMake(CGRectGetMidX(self.frame) - 100, CGRectGetMidY(self.frame) - 15)]; 
[self addChild:keyNode1]; 

任何幫助將不勝感激。

+1

非動態物體不會產生接觸事件 – LearnCocos2D 2014-09-04 01:17:58

回答

0

我在去年的一個主題中找到了答案。您可以解決需要靜態物體發生碰撞的問題。

如果設置重力是不存在的,讓你的靜態節點動態工作原理:

self.physicsWorld.gravity = CGVectorMake(0, 0); 
self.physicsBody.dynamic = YES;