首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >雪碧套件NPC随机运动的平台游戏

雪碧套件NPC随机运动的平台游戏
EN

Stack Overflow用户
提问于 2014-12-23 11:00:34
回答 1查看 376关注 0票数 0

我已经在Stack溢出中寻找了一个解决方案,但是没有找到一个解决随机NPC运动问题的方法。本质上,到目前为止,我已经编写了一个简单的2D平台游戏,使用Sprite : NPC对象有一个单独的类。我在我的GameScene (SKScene)中初始化它,没有问题&到目前为止,它是与我正确设置的physicsWorld一起运行的。现在我在这部分,它只需要向任意方向随机移动。我已经设置了边界&让它与SKActions这样的东西一起移动,使用像CGPointMake这样的东西,在需要的时候随机移动NPC,让它在那个位置等一会儿&恢复移动。BOOL帮了这个忙。然而,我很难让雪碧在向左移动时向左看,在向右移动时向右看(根本不需要上下查找)。因此,我在一本书中找到了一种使用向量的方法。我在NPC类中设置了一个方法,该方法用于GameScene:

代码语言:javascript
复制
-(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方法。我试过的第一件事是:

代码语言:javascript
复制
-(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‘方法正确地实现这一点。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-23 12:05:07

动作在一段时间内执行一项任务。如果您的npcMoving标志是假的,您将运行每个帧的动作序列,这意味着超过10个帧,您将有10个动作序列同时运行。这将导致未定义的行为。

接下来,即使您要停止现有的序列并重新运行它,在至少一个操作具有持续时间的情况下运行每个帧都是毫无意义的。因为这样,具有持续时间的操作将无法在给定的时间内完成其任务,因为它将被替换为下一个框架。

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

解决办法:

  • 根据需要(即每帧)更改参与者的属性(如位置等)来执行任务
  • 为参与者确定一个任务,然后为该任务运行相应的操作序列,然后等待它结束,然后再决定一个新任务。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27619008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档