我已经在Stack溢出中寻找了一个解决方案,但是没有找到一个解决随机NPC运动问题的方法。本质上,到目前为止,我已经编写了一个简单的2D平台游戏,使用Sprite : NPC对象有一个单独的类。我在我的GameScene (SKScene)中初始化它,没有问题&到目前为止,它是与我正确设置的physicsWorld一起运行的。现在我在这部分,它只需要向任意方向随机移动。我已经设置了边界&让它与SKActions这样的东西一起移动,使用像CGPointMake这样的东西,在需要的时候随机移动NPC,让它在那个位置等一会儿&恢复移动。BOOL帮了这个忙。然而,我很难让雪碧在向左移动时向左看,在向右移动时向右看(根本不需要上下查找)。因此,我在一本书中找到了一种使用向量的方法。我在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.
}现在所有这些都起作用了。但是当前的问题是在update方法中适当地调用这个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‘删除npcMoving,那么'update’方法将调用SKActions上每个帧的整个序列,而这又不会使NPC移动太远。它只需改变每一个帧的目标位置,从而创建一个“多动症”NPC。有谁能推荐一下该怎么做吗?我绝对需要保留方向属性和其他未来事物的向量运动,但是我不知道如何用'update‘方法正确地实现这一点。
发布于 2014-12-23 12:05:07
动作在一段时间内执行一项任务。如果您的npcMoving标志是假的,您将运行每个帧的动作序列,这意味着超过10个帧,您将有10个动作序列同时运行。这将导致未定义的行为。
接下来,即使您要停止现有的序列并重新运行它,在至少一个操作具有持续时间的情况下运行每个帧都是毫无意义的。因为这样,具有持续时间的操作将无法在给定的时间内完成其任务,因为它将被替换为下一个框架。
摘要:具有持续时间的操作不适合于需要调整每个帧的任务。
解决办法:
https://stackoverflow.com/questions/27619008
复制相似问题