Objective-C SpriteKit:仅停止左塔

时间:2015-06-26 19:53:32

标签: objective-c scroll sprite-kit touchesbegan skaction

所以,我有一个游戏,其中塔在屏幕右侧产生并向左移动,就像它们滚动一样。塔楼一直在上下移动,但我想拥有它,当我触摸屏幕时,最左边的塔 向上和向下移动 将停止上下移动(当然,还在滚动)。

我没有太多时间去思考它,但我提出了一些好主意。首先,我想我会创造一个“感动”的 函数,并在调用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()时,即使我不接触,它也会停止上下和以前一样。

1 个答案:

答案 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];

您的代码可能略有不同,但您可以使用上述内容来了解​​您可以采取哪些措施使其正常工作。