ios - 防止 "stacking"的 Sprite 节点相互重叠?

标签 ios iphone sprite-kit skspritenode

我正在尝试为我的 iOS spritekit 游戏创建一个盾牌加电,而不是刷新当前盾牌,它在顶部堆叠另一个盾牌。我的代码:

    -(void)didMoveToView:(SKView *)view {
               ...
    self.shieldIsActive = NO;
               ...
}
    -(void)didBeginContact:(SKPhysicsContact *)contact{
               ...
   else if (firstBody.categoryBitMask == CollisionCategoryLaser | firstBody.categoryBitMask == CollisionCategoryPlasmaShot |firstBody.categoryBitMask == CollisionCategoryProjectile && secondBody.categoryBitMask == CollisionCategoryShieldIcon){
        // Projectile OR Plasma Shot Or Laser hits Shield Icon
        ShieldIconNode *shieldIcon = (ShieldIconNode *)secondBody.node;
        ShieldNode *shield = [ShieldNode shieldAtPosition:CGPointMake(CGRectGetMidX(self.frame)+4, CGRectGetMidY(self.frame)-210)];
        [shieldIcon removeFromParent];
        if (firstBody.categoryBitMask == CollisionCategoryProjectile){
            ProjectileNode *projectile = (ProjectileNode *)firstBody.node;
            [projectile removeFromParent];
        }
        if (!self.shieldIsActive){
            [self addChild:shield];
            self.shieldIsActive = YES;
        }
        // Remove shield after a period of time. BUG: Adds multiple shields if one is already active
        if (self.shieldIsActive){
            SKAction *wait = [SKAction waitForDuration:ShieldTimer];
            [self runAction:wait completion:^{[shield removeFromParent];}];
            self.shieldIsActive = NO;

... }

最佳答案

正如 Domsware 所指出的,按位 | 需要在您的第一个 if 中替换为逻辑 ||(并添加适当的括号) > 声明。奇怪的是,由于 | 运算符的优先级低于 == 运算符,因此您的 if 语句可能会按您的预期工作。

此外,您应该考虑隐藏/显示盾牌,而不是像 Whirlwind 建议的那样添加/移除盾牌。

也就是说,一些想法......

  1. if (!self.shieldIsActive)if (self.shieldIsActive) 的条件将始终为 true(除非 shieldIsActive 设置在代码的其他地方),这可能会导致场景中一次出现多个盾牌
  2. self.shieldIsAction = NO 移动到操作的完成 block 中将解决此问题

还有一些代码...

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

关于ios - 防止 "stacking"的 Sprite 节点相互重叠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31742491/

相关文章:

ios - 解析 UniMag II 加密刷卡数据以获得 Track1 和 Track 2?

iphone - 按字符串值对字符串的 NSMutableArray 进行排序

ios - 函数仅适用于第一个生成的 Sprite ,而不适用于另一个

ios - 缩小我的世界 : Joints and their positions are not adjusted

ios - 有更好的方法吗?

c# - 如何在没有文本框的情况下获取键盘事件?

iphone - 如何将为iPhone创建的项目更改为ipad(通用)?

iphone - 如何使用 UITextRange 从 UITextField 获取子字符串

iphone - 如何在iPhone SDK中设置gcov进行代码覆盖率分析?

ios - 在其他场景中显示插页式广告 - Admob、SpriteKit、Swift