我有一个游戏我用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);
}
}
任何建议都将不胜感激。
答案 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);
}
}];
}