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

如何使多个精灵从Objective-C中的场景边界反弹,objective-c,sprite-kit,sprite,Objective C,Sprite Kit,Sprite,我有一个用精灵工具包制作的游戏,里面有25个精灵,它们都是一个精灵节点的子节点BOMNeutNode。在游戏开始时,我使用for循环在场景中创建了25个子节点,并使用physicsBody.velocity设置它们沿随机方向移动 我想做的是让它们在到达边缘时从场景边界反弹。我假设下面的代码一开始就可以做到这一点,但它似乎只在25个节点中的1个节点上工作(对于这一个节点,它工作得非常好)。我想这一定是因为我在游戏场景代码中的位置。我认为把它放在游戏运行循环的更新部分是合适的。也许我必须在节点本身中

我有一个用精灵工具包制作的游戏,里面有25个精灵,它们都是一个精灵节点的子节点
BOMNeutNode
。在游戏开始时,我使用for循环在场景中创建了25个子节点,并使用
physicsBody.velocity
设置它们沿随机方向移动

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

我还认为可能需要标识名为
@“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);
    }
}
(void)更新:(NSTimeInterval)currentTime{
BOMNeutNode*neut=(BOMNeutNode*)[self childNodeWithName:@“neut”];
如果(neut.position.y>自身框架尺寸高度-50){
neut.physicsBody.velocity=CGVectorMake(0,-100);
}否则如果(新位置y<50){
neut.physicsBody.velocity=CGVectorMake(01100);
}否则如果(neut.position.x>自身框架尺寸高度-50){
neut.physicsBody.velocity=CGVectorMake(-100,0);
}否则如果(新位置x<50){
neut.physicsBody.velocity=CGVectorMake(100,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); 
        } 
   }]; 
} 
-(void)更新:(NSTimeInterval)currentTime{
[使用block:^(SKNode*node,BOOL*stop){
如果(node.position.y>self.frame.size.height-50){
node.physicsBody.velocity=CGVectorMake(0,-100);
}else如果(node.position.y<50){
node.physicsBody.velocity=CGVectorMake(0100);
}else如果(node.position.x>self.frame.size.height-50){
node.physicsBody.velocity=CGVectorMake(-100,0);
}else如果(node.position.x<50){
node.physicsBody.velocity=CGVectorMake(100,0);
} 
}]; 
} 

一个简单的方法是将创建的
SKPhysicsBody
添加到
SKScene
中。这样,物理引擎可以为你处理所有的反弹(有正确的角度和一切)

通常,您希望将其添加到
SKScene
didMoveToView:
方法中。比如:

- (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)];
}

如果你走这条路,那就应该照顾好一切;您不应该需要
更新:
方法中当前的代码。

这是最合适的答案。不要使用不必要的代码对更新进行云计算。苹果给了你一个非常合法的物理世界,使用它:)谢谢,完美的解决方案:)谢谢,尽管主要的答案解决了我的问题,我也需要知道这一点,非常有用-谢谢!