Sprite Kit NPC在平台游戏中随机移动

时间:2014-12-23 11:00:34

标签: vector sprite-kit ios8 game-physics

我已经查看了Stack Overflow的解决方案,但没有找到一个问题,我随机NPC移动。基本上,我现在编写的是一个使用Sprite Kit的简单2D平台游戏:NPC对象是一个单独的类。我在我的GameScene(SKScene)中初始化它没问题&到目前为止它与我已经正确设置的physicsWorld一起表现。现在,我只是需要在任何方向上随机移动的部分。我已经建立了界限&已经使用像SKActions这样的东西,利用CGPointMake这样的东西,根据需要随机移动NPC,让它在那个位置等待一点点。恢复运动。 BOOL帮助了这个过程。然而,当我向左和向前移动时,我很难让精灵向左看。向右移动时向右看(根本不需要向上看和向下看)。所以我通过使用Vector找到了一本书的方法。我在NPC类中设置了一个用于GameScene的方法:

-(void)moveToward:(CGPoint)targetPosition
{
    CGPoint targetVector = CGPointNormalize(CGPointSubtract(targetPosition, self.position));
    targetVector = CGPointMultiplyScalar(targetVector, 150); //150 is interpreted as a speed: the larger the # the faster the NPC moves.
    self.physicsBody.velocity = CGVectorMake(targetVector.x, targetVector.y); //Velocity vector measured in meters per second.


    /*SPRITE DIRECTION*/
    [self faceCurrentDirection]; //Every time NPC begins to move, it will face the appropriate direction due to this method.
}

现在所有这些都有效。但是手头的问题是在更新方法中适当地调用此moveToward方法。我试过的第一件事是:

-(void)update:(NSTimeInterval)currentTime
{
    /*Called before each frame is rendered*/

    if (!npcMoving)
    {
        SKAction *moving            = [SKAction runBlock:^{ npcMoving = YES }]; //THIS IS THE CULPRIT!
        SKAction *generate          = [SKAction runBlock:^{ [self generateRandomDestination]; }]; //Creates a random CGFloat X & CGFloat Y.
        SKAction *moveTowards       = [SKAction runBlock:^{ _newLocation = CGPointMake(fX, fY);
                                                            [_npc moveToward:_newLocation]; }]; //Moves NPC to that random location.
        SKAction *wait              = [SKAction waitForDuration:4.0 withRange:2.0]; //NPC will wait a little...
        [_npc runAction:[SKAction sequence:@[moving, generate, moveTowards, wait]] completion:^{ npcMoving = NO; }]; //...then repeat process.
    }
}

矢量方法' moveToward'需要更新' NPC运动发生的方法。我用“  npcMoving = YES'在一开始就希望NPC能够转移到目标位置&再次开始这个过程。不是这种情况。如果我使用“npcMoving = YES'”删除SKAction,则会更新'方法每帧调用上面SKActions的整个序列,这反过来又不会使我的NPC移动远。它只是改变了每一帧的目标位置,反过来创造了一个“多动症”。 NPC。有人可以建议做什么?我绝对需要保留矢量运动的方向性和&其他未来的事情,但我不知道如何通过更新'正确实现这一点。方法

1 个答案:

答案 0 :(得分:1)

操作会随着时间的推移执行任务。如果您的npcMoving标志为false,则每帧运行一个动作序列,这意味着超过10帧您将同时运行10个动作序列。这将导致未定义的行为。

接下来,即使你要停止现有的序列并重新运行它,每个帧运行一个动作,其中至少有一个动作有持续时间几乎没有意义。因为那个持续时间的动作将无法在给定时间内完成任务,因为它将被替换为下一帧。

摘要:持续时间的操作不适合需要每帧调整的任务。

解决方案:

  • 通过在需要时(即每一帧)更改演员的属性(即位置等)来执行任务
  • 决定actor的任务,然后为该任务运行相应的操作序列,并等待它在您决定新任务之前结束
相关问题