Sprite kit Can';不要让敌人在碰撞时消失

Sprite kit Can';不要让敌人在碰撞时消失,sprite-kit,Sprite Kit,我一直在尝试我所有的资源,感谢我亲爱的朋友Sangon,他是这里的一名成员,还有来自Ray Wenderlich的IOS Games by tutorial book,我试图做的是首先为每个节点设置类别,然后如果我的玩家的子弹与敌人相撞,我希望敌人消失。现在我得到了一些从哪里开始的建议,但这件事让我发疯,我已经尝试了很多次,敌人并没有消失。请帮我做这个。谢谢 static const uint32_t EnemyCategory = 1; static const uint32_t

我一直在尝试我所有的资源,感谢我亲爱的朋友Sangon,他是这里的一名成员,还有来自Ray Wenderlich的IOS Games by tutorial book,我试图做的是首先为每个节点设置类别,然后如果我的玩家的子弹与敌人相撞,我希望敌人消失。现在我得到了一些从哪里开始的建议,但这件事让我发疯,我已经尝试了很多次,敌人并没有消失。请帮我做这个。谢谢

static const uint32_t EnemyCategory        = 1;
static const uint32_t bulletCategory       = 2;

- (void) fire:(float)targetAngle {
         bullet = [SKSpriteNode spriteNodeWithImageNamed:@"cannonbullet"];
         bullet.position = _Player.position;
         bullet.physicsBody = [SKPhysicsBody 
                              bodyWithCircleOfRadius:bullet.frame.size.width/2];
         bullet.physicsBody.categoryBitMask = bulletCategory;
         bullet.physicsBody.collisionBitMask = bulletCategory | EnemyCategory;
         bullet.physicsBody.contactTestBitMask = bulletCategory | EnemyCategory;
         [self addChild:bullet];
         int x = _Player.position.x + 1000 * cos(targetAngle);
         int y = _Player.position.y + 1000 * sin(targetAngle);
         [bullet runAction:[SKAction moveTo:CGPointMake(x, y) duration:2]];
}

- (void) didBeginContact:(SKPhysicsContact *)contact {
         SKPhysicsBody *temp;
    if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask) {
         temp = contact.bodyB;
    } else {
         temp = contact.bodyA;
    }
    if (temp.categoryBitMask == EnemyCategory) {
        [temp.node removeFromParent];
    }
}


- (void) Enemy:(CGSize)size  {   
     Enemy = [SKSpriteNode spriteNodeWithImageNamed:@"enemy1@2x"];
     Enemy.position = CGPointMake(self.size.width/2, self.size.height/2);
     Enemy.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:Enemy.frame.size];
     Enemy.physicsBody.dynamic =  NO;
     Enemy.physicsBody.categoryBitMask = EnemyCategory;
     [self addChild:Enemy];
}
static const uint32\u t EnemyCategory=1;
静态常数32\u t bulletCategory=2;
-(无效)火力:(浮动)目标角{
bullet=[SKSpriteNode SPRITENODEWITHIMAGENAME:@“cannonbullet”];
bullet.position=_Player.position;
bullet.physicsBody=[SKPhysicsBody
带有圆形半径的车身:子弹、框架、尺寸、宽度/2];
bullet.physicsBody.categoryBitMask=bulletCategory;
bullet.physicsBody.collisionBitMask=bulletCategory | EnemyCategory;
bullet.physicsBody.contactTestBitMask=bulletCategory | EnemyCategory;
[自我添加的孩子:子弹];
int x=_Player.position.x+1000*cos(targetAngle);
int y=_玩家位置y+1000*sin(目标角度);
[项目符号运行操作:[SKAction moveTo:CGPointMake(x,y)持续时间:2]];
}
-(无效)didBeginContact:(SKPhysicsContact*)联系人{
SKPhysicsBody*温度;
if(contact.bodyA.categoryBitMask
我看到的唯一问题是您没有正确设置
skphysiccontactdelegate
委托

您必须执行以下操作:

@interface MyScene : SKScene<SKPhysicsContactDelegate>
self.physicsWorld.contactDelegate = self;
完成后,您的场景将自动收到
didBeginContact:
didEndContact:
消息。这些方法不是您手动调用的

您可以找到使用碰撞检测(并在碰撞检测后删除对象)的教程

从“SKPhysicContactDelegate”

当两个物理实体在物理世界中相互接触时,实现SKPhysicContactDelegate协议的对象可以响应。要接收联系人消息,请设置SKPhysicsWorld对象的contactDelegate属性。当联系人开始或结束时,将调用委托


希望这有帮助

您是否将场景设置为physicsWorld代理?didBeginContact是否运行?正如Ray所建议的,您首先需要确保调用了didBeginContact。一旦它被调用,它只是一个检查你的位掩码的问题,对碰撞采取行动并移除一个或两个碰撞的精灵。是的,巴德,但是我怎么称呼didBeginMethod?我试图在initWithSize主方法中调用它,但是我得到了各种各样的错误。我的意思是,为了便于学习,你能给我一个提示,我该如何称呼这个方法?我知道如何调用方法,但这个有点棘手。嗨,雷。你曾经解决过你的问题吗?在某种程度上是的,因为我使用了Ray教程中的调试图,似乎方形碰撞区域对于球的碰撞来说不够大,但是,有时在第一次启动时,会出现延迟启动的小故障,并且不是每个与敌人的点都是可合并的。