[英]Collision detection not working?
我正在嘗試為iOS制作一個非常簡單的SpriteKit應用程序,但是有一個問題:
#import "MyScene.h"
static const uint32_t laserCategory = 0x1 << 0;
static const uint32_t enemyCategory = 0x1 << 0;
@implementation MyScene
- (id) initWithSize: (CGSize) size
{
if (self = [super initWithSize: size])
{
self.backgroundColor = [SKColor colorWithRed: 1.0 green: 1.0 blue: 1.0 alpha: 1.0];
self.physicsWorld.gravity = CGVectorMake(0,0);
SKSpriteNode *ship = [SKSpriteNode spriteNodeWithImageNamed: @"Ship"];
ship.position = CGPointMake (CGRectGetMidX (self.frame), 50);
[self addChild: ship];
SKSpriteNode *enemy = [SKSpriteNode spriteNodeWithImageNamed: @"Enemy"];
enemy.position = CGPointMake (CGRectGetMidX (self.frame), 440);
[self addChild: enemy];
enemy.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize: enemy.size];
enemy.physicsBody.dynamic = YES;
enemy.physicsBody.categoryBitMask = enemyCategory;
enemy.physicsBody.contactTestBitMask = laserCategory;
enemy.physicsBody.collisionBitMask = 0;
SKAction *moveEnemy = [SKAction moveByX: 0.0 y: -500.0 duration: 5.0];
[enemy runAction: moveEnemy];
} return self;
}
- (void) touchesBegan: (NSSet *) touches withEvent: (UIEvent *) event
{
SKSpriteNode *laser = [SKSpriteNode spriteNodeWithImageNamed: @"Laser"];
laser.position = CGPointMake (CGRectGetMidX (self.frame), 100);
[self addChild: laser];
laser.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize: laser.size];
laser.physicsBody.dynamic = YES;
laser.physicsBody.categoryBitMask = laserCategory;
laser.physicsBody.contactTestBitMask = enemyCategory;
laser.physicsBody.collisionBitMask = 0;
SKAction *moveLaser = [SKAction moveByX: 0.0 y: 2000.0 duration: 5.0];
[laser runAction: moveLaser];
}
- (void) laser: (SKSpriteNode *) laser didCollideWithEnemy: (SKSpriteNode *) enemy
{
[laser removeFromParent];
[enemy removeFromParent];
}
- (void) didBeginContact: (SKPhysicsContact *) contact
{
SKPhysicsBody *firstBody, *secondBody;
if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask)
{
firstBody = contact.bodyA;
secondBody = contact.bodyB;
}
else
{
firstBody = contact.bodyB;
secondBody = contact.bodyA;
}
if ((firstBody.categoryBitMask & laserCategory) != 0 && (secondBody.categoryBitMask & enemyCategory) != 0)
{
[self laser: (SKSpriteNode *) firstBody.node didCollideWithEnemy: (SKSpriteNode *) secondBody.node];
}
}
@end
這是我的“MyScene.m”文件,一切正常。 唯一不起作用的是激光對象和敵方物體之間的碰撞檢測。 他們只是穿過對方。 有解決方案嗎 歡迎任何其他提示。
謝謝。
您為兩個不同的類別設置了相同的位掩碼:
static const uint32_t laserCategory = 0x1 << 0;
static const uint32_t enemyCategory = 0x1 << 0;
之后,didBeginContact:方法中的if語句錯誤:
if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask)
你應該將其中一個更改為0x1 << 1:
static const uint32_t laserCategory = 0x1 << 0;
static const uint32_t enemyCategory = 0x1 << 1;
//擴展
您還缺少設置聯系委托給phasic world,在initWithSize中設置gravity之后添加此代碼:
self.physicsWorld.gravity = CGVectorMake(0,0);
self.physicsWorld.contactDelegate = self;
我假設您向MyScene類添加了委托聲明:
<SKPhysicsContactDelegate>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.