在循环中以编程方式创建具有相同名称的 SKSpriteNodes 上使用 repeatActionForever?

Posted

技术标签:

【中文标题】在循环中以编程方式创建具有相同名称的 SKSpriteNodes 上使用 repeatActionForever?【英文标题】:Using repeatActionForever on SKSpriteNodes programmatically created with same name in a loop? 【发布时间】:2014-04-02 19:44:14 【问题描述】:

就上下文而言,我正在 ios 中制作一个砖块破坏游戏,并希望我创建的砖块随着球在场景中反弹而不断地左右移动。

我的代码中有一个方法,当呈现场景时调用一次,它将几行精灵节点作为砖块添加到场景中,如下所示

-(void) addBricks:(CGSize)size     

    // add a new row of bricks
    for (int j = 1; j <= 3; j++) 

        // add top column of bricks
        for (int i = 0; i < 5; i++) 


            SKSpriteNode *brick = [SKSpriteNode spriteNodeWithImageNamed:@"brick"];

            brick.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:brick.frame.size];
            brick.physicsBody.dynamic = NO;
            brick.physicsBody.categoryBitMask = brickCategory;

            int xPos = ((brick.frame.size.width / 2) + 20) + ((brick.frame.size.width / 2) + 30) * i;
            int yPos = size.height - (30 * j);


            // generate the sequence that the brick will perform
            SKAction *moveHorizontal = [SKAction moveToX:xPos + 20 duration:1.0f];
            moveHorizontal.timingMode = SKActionTimingEaseOut;
            SKAction *moveBack = [moveHorizontal reversedAction];
            SKAction *wait = [SKAction waitForDuration:0.4f];
            SKAction *backAndForth = [SKAction sequence:@[moveHorizontal, wait, moveBack, wait]];
            SKAction *repeatHorizMove = [SKAction repeatActionForever:backAndForth];


            brick.position = CGPointMake(xPos, yPos);

            // add the brick
            [self addChild:brick];

            // make it move back and forth
            [brick runAction:repeatHorizMove];
        

    

我的问题是,虽然场景开始时所有的积木都会向右移动,但它们不会像我希望的那样一遍又一遍地向后移动并重复动作。我认为这可能与以编程方式创建它们时为它们赋予相同的名称有关,但我知道场景保留了所有的砖块,尽管它们具有相同的名称。

我怎样才能让我创建的所有 SpriteNode(砖块)永远来回移动?

【问题讨论】:

【参考方案1】:

moveToX action 不可逆。总是检查这样的 cmets 的参考。

这应该可以解决它:

        SKAction *moveHorizontal = [SKAction moveToX:xPos + 20 duration:1.0f];
        moveHorizontal.timingMode = SKActionTimingEaseOut;
        SKAction *moveBack = [SKAction moveToX:xPos duration:1.0];

【讨论】:

以上是关于在循环中以编程方式创建具有相同名称的 SKSpriteNodes 上使用 repeatActionForever?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在iPhone中以编程方式启用热点模式?

多个ListViews在android中以编程方式创建

在 C++ 中以编程方式在编译时创建静态数组

如何区分具有相同名称的多个进程并杀死所有在 C# 中以我的 USERNAME 运行的进程?

如何在 Swift 中以编程方式更改设备方向?

是否可以在C ++中以编程方式查询不同的DNS名称服务器,忽略系统设置?