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];
任何幫助將不勝感激。
非動態物體不會產生接觸事件 – LearnCocos2D 2014-09-04 01:17:58