如何在Objective-C中让多个精灵从场景的边界反弹

时间:2014-09-02 18:02:19

标签: objective-c sprite-kit sprite

我有一个游戏我用sprite-kit创建了25个sprite,它们都是一个精灵节点BOMNeutNode的子节点。在游戏开始时,我使用for循环在场景中创建了25个子节点,并使用physicsBody.velocity将它们全部设置为随机方向。

我想要做的是让它们在到达边缘时从场景的边界反弹。我假设下面的代码可以开始使用,但它似乎只适用于25个节点中的1个(对于那个节点,它运行得非常好)。我认为这必须归功于我在GamePlayScene代码中放置此代码的位置。我认为把它放在游戏运行循环的更新部分是合适的。也许我必须在节点本身设置此规则?

我还认为可能需要识别名为@"Neut"的所有节点,但我无法找到执行此操作的语法。如果您需要的代码多于我提供的代码,请与我们联系。

(void) update:(NSTimeInterval)currentTime {
    BOMNeutNode *neut = (BOMNeutNode*)[self childNodeWithName:@"Neut"];

    if (neut.position.y > self.frame.size.height-50) {
    neut.physicsBody.velocity = CGVectorMake(0, -100);
    } else if (neut.position.y < 50) {
    neut.physicsBody.velocity = CGVectorMake(0, 100);
    } else if (neut.position.x > self.frame.size.height-50) {
    neut.physicsBody.velocity = CGVectorMake(-100, 0);
    } else if (neut.position.x < 50) {
    neut.physicsBody.velocity = CGVectorMake(100, 0);
    }
}

任何建议都将不胜感激。

2 个答案:

答案 0 :(得分:1)

执行此操作的一种简单方法是将SKPhysicsBody创建的SKScene添加到SKScene。这样物理引擎可以为你处理所有的弹跳(具有正确的角度和一切)。

通常,您希望在didMoveToView:的{​​{1}}方法中添加它。类似的东西:

- (void)didMoveToView:(SKView*)view {
    // ... any other setup you might need ...

    self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:CGRectMake(50, 50, self.size.width - 100, self.size.hight - 100)];
}

如果你走这条路,应该照顾好一切;您不应该使用update:方法中的当前代码。

答案 1 :(得分:0)

问题是你有很多名为Neut的节点,它找到其中一个并检查它是否在框架内,你需要做的是找到所有具有该名称的节点并在所有节点上运行代码

-(void)update:(NSTimeInterval)currentTime {
    [self enumerateChildNodesWithName:@"Neut" usingBlock:^(SKNode *node, BOOL *stop) { 
        if (node.position.y > self.frame.size.height-50) { 
            node.physicsBody.velocity = CGVectorMake(0, -100); 
        } else if (node.position.y < 50) { 
            node.physicsBody.velocity = CGVectorMake(0, 100); 
        } else if (node.position.x > self.frame.size.height-50) { 
            node.physicsBody.velocity = CGVectorMake(-100, 0); 
        } else if (node.position.x < 50) { 
            node.physicsBody.velocity = CGVectorMake(100, 0); 
        } 
   }]; 
}