Objective-C SpriteKit:只停止左塔

Objective-C SpriteKit: Stopping left tower only

所以,我有一个游戏,塔在屏幕右侧生成并向左移动,就像它们在滚动一样。塔不断地移动 up-and-down,但我想要它所以当我触摸屏幕时,最左边的塔 移动 up-and-down 会停止移动up-and-down(当然,还在滚动)。

我真的没有太多时间考虑它,但我想出了一些好主意。首先,我想我会创建一个 "touched" 函数,并在调用 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" 语句时出现问题。塔将全部向左滚动,但它们根本不会 up-and-down;即使这个函数永远不会在任何地方被调用!

这是我尝试过的一件事。我也尝试过使用 enumerateChildNodesWithName:usingBlock:,但这不起作用,因为它需要 SKNode,而我的塔是 SKSpriteNodes。另外,我很难以这种方式抓住场景中的所有 children。但我认为使用塔的名称会有所帮助,对吗?

请帮帮我!一些代码片段也会有帮助!


编辑:

我尝试将 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];
            }
        }
    }
}

这个功能本身起作用了,塔继续走 up-and-down,但是当我把它放在 touchesBegan() 中时,即使我不碰,它也停止走 up-and-down 和以前一样。

以下是我建议您遵循的基本步骤:

如果您正在子类化您的塔 (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];

您的代码可能有点不同,但您可以使用上面的内容来了解​​要使其工作的要点。