【问题标题】:Sprites with same name同名精灵
【发布时间】:2014-04-25 09:09:36
【问题描述】:

嘿,我正在尝试同时移动一些精灵,它们都是相同类型的精灵。所以我只是使用 for 循环在游戏中添加精灵,但是当我尝试仅移动所有精灵时一动。

我正在尝试模拟跑步,当用户点击石头时,石头会向下移​​动,另一块石头会出现在顶部,会有 4 块石头,所以当一个石头落下时,另一块石头会出现在顶部,剩下的石头会向下移​​动。我无法移动屏幕顶部出现的石头,该石头不像其他石头那样移动。

这里是一些代码:

self.Stone = [Stone spriteNodeWithColor:[SKColor blackColor] size:CGSizeMake(80, 142)];


-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
CGPoint location = [touch locationInNode:self];


self.node =[self nodeAtPoint:location];

if ([self.node.name isEqualToString:@"stone"]) {
    SKAction *hey = [SKAction moveToY:self.Stone.position.y - 142 duration:1];
    [self runAction:hey];
}

它们基本上是屏幕上的 4 块石头,每次点击石头都会向下移动。

【问题讨论】:

  • 您好,欢迎来到 Stack Overflow,如果您提供代码示例,我们可以根据您的具体情况为您提供建议。
  • 我还是不明白你在做什么。视图顶部有 4 个对象(石头)。如果您点击 1 个对象,假设所有 4 个对象都会向下移动并移出视图,然后顶部会出现 4 个新石头?
  • 不在视图的顶部 可以这样想 屏幕上有一个 4 x 4 的网格 1 块石头位于每行的 1 个位置 第二列是您点击石头时的位置你点击石头所有的石头,包括你点击的石头向下移动一排,最后一行的石头被移除,一个新的石头被添加到顶行的场景中。这将一直持续到玩家点击背景而不是石头

标签: sprite-kit skspritenode


【解决方案1】:

精灵的名称与运动的识别没有真正的关系。您可以将一个精灵设为父精灵,并将所有其他精灵附加为子精灵。这样做会在您移动父级时使所有子级移动,或者您可以将所有精灵转储到一个数组中并在循环中单独移动每个精灵。

更新为包含父/子示例

以下是父/子的示例。当您点击屏幕时,父精灵在 x 和 y 上移动 +10。孩子将与父母一起移动。

请记住,子位置与父级相关,而不是视图。

#import "MyScene.h"

@implementation MyScene
{
    SKSpriteNode *mainSprite;
}

-(id)initWithSize:(CGSize)size
{
    if (self = [super initWithSize:size])
    {
        self.physicsWorld.contactDelegate = self;

        mainSprite = [SKSpriteNode spriteNodeWithColor:[SKColor redColor] size:CGSizeMake(50, 50)];
        mainSprite.position = CGPointMake(100, 100);
        [self addChild:mainSprite];

         SKSpriteNode *child1 = [SKSpriteNode spriteNodeWithColor:[SKColor blueColor] size:CGSizeMake(20, 20)];
         child1.position = CGPointMake(40, 40);
        [mainSprite addChild:child1];
    }
    return self;
}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
     mainSprite.position = CGPointMake(mainSprite.position.x+10, mainSprite.position.y+10);
}

-(void)update:(CFTimeInterval)currentTime
{
    //
}

@end

【讨论】:

  • 另外,我没有删除代码中的精灵,而是让它们离开屏幕,这似乎将它们删除。跟这个有关系吗?
  • 做什么?如果精灵移出屏幕,它不会被“移除”。只有发出命令 [spriteName removeFromParent] 才能做到这一点。你知道如何执行我提出的 2 条建议吗?
  • 是的,我尝试了数组一,它甚至没有移动任何东西,而父数组的效果与以前相同。当它离开屏幕时,节点数会减少,所以我认为它被移除了。
  • 我添加了一个父/子代码示例。您看到的节点数是当前在视图中显示的精灵(节点)的数量。如果精灵移出视图,则节点数减 1,但实际上并没有移除节点。
  • 你的例子在我的情况下不起作用的原因是我只需要精灵来移动游戏将永远持续下去,除非人们点击背景,每次点击都会插入一个新的精灵当前的精灵。您的示例最终从场景中删除了 mainSprite 我需要 mainSprite 保持静止,所有其他 sprite 做其他事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-17
  • 1970-01-01
  • 2012-03-14
相关资源
最近更新 更多