Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 目标-C SpriteKit:仅停止左塔_Objective C_Scroll_Sprite Kit_Touchesbegan_Skaction - Fatal编程技术网

Objective c 目标-C SpriteKit:仅停止左塔

Objective c 目标-C SpriteKit:仅停止左塔,objective-c,scroll,sprite-kit,touchesbegan,skaction,Objective C,Scroll,Sprite Kit,Touchesbegan,Skaction,所以,我有一个游戏,塔楼在屏幕的右侧生成,然后向左移动,就像滚动一样。塔楼不断地上下移动,但我希望这样,当我触摸屏幕时,最左边的塔楼上下移动将停止上下移动(当然,仍在滚动) 我真的没有太多的时间去考虑它,但我想出了一些好主意。首先,我想我会创造一个“感动” 函数,并在调用touchesbeated()时调用它。我必须这么做,原因很复杂,我不会解释。到目前为止,我提出了以下代码: - (void)touched { SKSpriteNode *lastSprite; for (SK

所以,我有一个游戏,塔楼在屏幕的右侧生成,然后向左移动,就像滚动一样。塔楼不断地上下移动,但我希望这样,当我触摸屏幕时,最左边的塔楼上下移动将停止上下移动(当然,仍在滚动)

我真的没有太多的时间去考虑它,但我想出了一些好主意。首先,我想我会创造一个“感动” 函数,并在调用
touchesbeated()
时调用它。我必须这么做,原因很复杂,我不会解释。到目前为止,我提出了以下代码:

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

该函数本身起作用,塔楼继续上下移动,但当我将其放入
触摸开始()
,即使我不触摸,它也会像以前一样停止上下移动。

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

如果要对塔楼进行子类化(SKSpriteNode),则创建一个BOOL属性,类似于BOOL movingUpDown,并对任何具有垂直移动的塔楼将其设置为“是”

如果您没有对塔进行子分类,请使用userData字典创建一个条目,告诉您是否存在垂直移动

接下来,将所有塔对象添加到可变数组中。我个人更喜欢在创建时为每个对象添加唯一的名称。类似于“node-0”、“node-1”等。您可以通过使用计数器并将值添加到每个对象的名称中来实现这一点

在ToucheSBegind方法中,您有停止垂直移动代码。如果要按顺序添加塔对象,则第一个塔对象应该是最左侧的对象

SKSpriteNode *myNode = [self.myArray firstObject];
// set vertical movement to zero

// remove the first object in the array
[self.myArray removeObjectAtIndex:0];

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

对于您想要的内容有点困惑。你说“不移动的最左边的塔将停止移动…”。如果最左边的塔“不移动”必须“停止移动”。。。这没有道理。你到底想干什么?还有,你是如何确定你要针对哪个塔采取行动的?@sangony这是我的错。我将把粗体/斜体部分编辑为“上下移动”。我的目标是所有的塔最初都是从右向左滚动,然后上下滚动。当我点击屏幕时,它会发现所有的塔仍在上下移动,然后找到最左边的一个。它抓住那座塔,阻止它上下移动(当我点击屏幕时)。但右边的其他塔仍在向左滚动并上下移动。我的游戏使用视差滚动技术,当它们到达屏幕左侧时,它不会移除塔,它只是将它们放置在右侧并重复使用。这个密码会把事情弄糟吗?@ChristianKRider-没关系。在这种情况下,您不会从阵列中删除塔对象,但必须使用代码标识阵列中最左侧的塔。之后会发生什么取决于你的代码。这是个好主意,@sangony!有点不对劲,但那是因为你对我的项目不了解。我把它调整了一点,但它在赛后工作得非常好!我会把这个标记为已接受(尤其是因为没有其他人回答)。@ChristianKRider-很高兴我能帮上忙。
SKSpriteNode *myNode = [self.myArray firstObject];
// set vertical movement to zero

// remove the first object in the array
[self.myArray removeObjectAtIndex:0];