所以,我有一个游戏,其中塔在屏幕右侧产生并向左移动,就像它们滚动一样。塔楼一直在上下移动,但我想拥有它,当我触摸屏幕时,最左边的塔 向上和向下移动 将停止上下移动(当然,还在滚动)。
我没有太多时间去思考它,但我提出了一些好主意。首先,我想我会创造一个“感动”的
函数,并在调用touchesBegan()
时调用它。我必须这样做,原因很复杂,我不解释。到目前为止,我想出了这段代码:
- (void)touched
{
SKSpriteNode *lastSprite;
for (SKSpriteNode *sprite in self.scene.children) {
if (lastSprite && sprite) {
if (sprite.position.x < lastSprite.position.x) {
[sprite removeAllActions];
}
}
lastSprite = sprite;
}
}
但这似乎不起作用。我在使用fast-enumeration“for-in”语句时逐位注释掉了代码并出现了问题。塔楼将向左滚动,但它们根本不会上下颠倒;即使这个函数永远不会被调用!
所以这是我尝试过的一件事。我也尝试使用enumerateChildNodesWithName:usingBlock:
,但这不起作用,因为它需要是SKNode
,而我的塔是SKSpriteNodes
。另外,我很难抓住场景中的所有孩子。但我认为使用塔的名称会有所帮助,对吗?
请帮帮我!一些代码片段也会有所帮助!
修改
我尝试将touched()
方法更改为:
- (void)touched
{
NSArray *sceneNodes = self.scene.children;
SKSpriteNode *lastNode = nil;
for (SKSpriteNode *sprite in sceneNodes) {
if (lastNode && sprite) {
if (sprite.position.x < lastNode.position.x) {
[sprite removeAllActions];
}
}
}
}
这个功能本身就起作用了,塔楼继续上下,但是当我把它放在touchesBegan()
时,即使我不接触,它也会停止上下和以前一样。
答案 0 :(得分:1)
以下是我建议您遵循的基本步骤:
如果你是子类化(SKSpriteNode)你的塔然后创建一个BOOL属性,比如BOOL movingUpDown,并为任何有垂直移动的塔设置为YES。
如果您没有对塔进行子类化,请使用userData字典创建一个条目,告诉您是否存在垂直移动。
接下来,将所有塔对象添加到可变数组中。我个人更喜欢在创建时为每个对象添加唯一名称。像“node-0”,“node-1”等等。您可以通过使用计数器并将值添加到每个对象的名称来完成此操作。
在touchesBegan方法中,您可以使用停止垂直移动代码。如果要按顺序添加塔对象,则第一个塔对象应该是最左边的对象。
SKSpriteNode *myNode = [self.myArray firstObject];
// set vertical movement to zero
// remove the first object in the array
[self.myArray removeObjectAtIndex:0];
您的代码可能略有不同,但您可以使用上述内容来了解您可以采取哪些措施使其正常工作。