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];
您的代码可能有点不同,但您可以使用上面的内容来了解要使其工作的要点。
所以,我有一个游戏,塔在屏幕右侧生成并向左移动,就像它们在滚动一样。塔不断地移动 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];
您的代码可能有点不同,但您可以使用上面的内容来了解要使其工作的要点。