首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >-[SKScene didBeginContact]多次执行

-[SKScene didBeginContact]多次执行
EN

Stack Overflow用户
提问于 2015-08-15 04:08:27
回答 1查看 77关注 0票数 0

我在为我的游戏创造一个护盾。它的工作方式是,如果你拍摄一个权力上升图标,你会得到一个盾,随着时间的推移。当岩石击中盾牌时,它就会被摧毁,产生碎片。问题是,在游戏的过程中,当你点击多个盾牌图标时,产生的碎片数量会显著增加。当只有一个护盾的时候,就好像有多个盾牌。我该怎么解决这个问题?

代码语言:javascript
运行
复制
My Code: 
- (void) didBeginContact:(SKPhysicsContact *)contact{
         ...
    else if (firstBody.categoryBitMask == CollisionCategoryRocks && secondBody.categoryBitMask == CollisionCategoryShield){
        // Rock hits Shield
        if (!_shield.hidden){
            if (firstBody.categoryBitMask == CollisionCategoryRocks){
                SpaceRockNode *spaceRock = (SpaceRockNode *) firstBody.node;
                [spaceRock removeFromParent];
                [self createDebrisAtPosition:contact.contactPoint];
            } 
        }
    }

    else if ((firstBody.categoryBitMask == CollisionCategoryLaser || firstBody.categoryBitMask == CollisionCategoryPlasmaShot ||firstBody.categoryBitMask == CollisionCategoryProjectile) && secondBody.categoryBitMask == CollisionCategoryShieldIcon){
    // Projectile hits Shield Icon

        if (!self.shieldIsActive){
            self.shield = [ShieldNode shieldAtPosition:CGPointMake(CGRectGetMidX(self.frame)+4, CGRectGetMidY(self.frame)-210)];
            [self addChild:self.shield];
            self.shieldIsActive = YES;
            SKAction *wait = [SKAction waitForDuration:ShieldTimer];
            [self runAction:wait completion:^{
               self.shield.hidden = YES;
               self.shieldIsActive = NO;
            }];
       }
   }
           ...
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-15 05:56:45

你的问题是,当碎片疯狂地飞出来时,会发生两次碰撞:

  1. 空间岩石X和盾构1
  2. 空间岩石X和盾构2

这导致didBeginContact:被称为2倍,因此,会有两倍多的碎片飞出。

我要修正的一件事,就是把你的代码缩短一点,就是改变这个说法.

代码语言:javascript
运行
复制
SpaceRockNode *spaceRock = (SpaceRockNode *) firstBody.node;
[spaceRock removeFromParent];

变成..。

代码语言:javascript
运行
复制
[firstBody.node removeFromParent];

如果您不对该Space Rock做任何其他操作,那么就没有理由仅仅将该节点作为节点使用到一个空间岩石中。

接下来,转这个if语句..。

代码语言:javascript
运行
复制
if (!self.shieldIsActive) {
    ...
}

变成..。

代码语言:javascript
运行
复制
if (!self.shieldIsActive && ![self.children containsObject:self.shield]) {
    ...
}

在第二次将self.shield self.children 添加到self.children之前,修改后的声明确保self.shieldself.children 的成员。如果只有一个盾牌,那么只有一堆碎片会飞出来。

如果将self.shield nil设置为(换句话说,还没有分配给),则containsObject:方法将计算为NO,因为self.children 不包含 nil**.** Xcode,如果尝试添加nil节点,实际上会出现异常。因此,如果self.shieldnil,则该表达式将始终计算为NO

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32021430

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档