我已经查看了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。有人可以建议做什么?我绝对需要保留矢量运动的方向性和&其他未来的事情,但我不知道如何通过更新'正确实现这一点。方法
答案 0 :(得分:1)
操作会随着时间的推移执行任务。如果您的npcMoving标志为false,则每帧运行一个动作序列,这意味着超过10帧您将同时运行10个动作序列。这将导致未定义的行为。
接下来,即使你要停止现有的序列并重新运行它,每个帧运行一个动作,其中至少有一个动作有持续时间几乎没有意义。因为那个持续时间的动作将无法在给定时间内完成任务,因为它将被替换为下一帧。
摘要:持续时间的操作不适合需要每帧调整的任务。
解决方案: