游戏底层逻辑,运动&&寻路(三)

本文介绍了游戏中的两种复杂行为:徘徊(Wander)和避开障碍(Obstacle Avoidance)。在徘徊行为中,通过辅助圆实现平滑转向,通过控制目标点在圆周上随机移动来实现不规则路径。避障算法中,利用预估圆检测障碍,并计算斥力点来计算控制力,使游戏实体能避开障碍。文章还提到辅助图形在游戏行为控制中的重要性,以及实际实现中的注意事项和代码示例。
摘要由CSDN通过智能技术生成

上篇文章我们解释了几种基本的控制力,今天我们会讨论几种较为复杂的行为,涉及了碰撞,以及辅助图形进行运动控制。

7、Wander徘徊(巡逻)

徘徊(四处巡逻)是一种很常见的行为,但是要得到smoothly平滑的转向行为,并不是特别容易,这里有一种借用辅助圆实现的平滑移动。

这里写图片描述

如图,我们在物体前面构造了一个辅助圆,我们控制目标点,从而用seek方法控制运动行为,如果我们让目标点在圆周上运动,就可以产生一个力,他有如下属性:

  • 一定向前(分力向物体的当前运动方向)
  • 单帧转角范围为切线与x轴的夹角
  • 大小为圆与x轴交点的范围

这样我们就可以控制辅助圆的相对位置来控制wander行为,比如我们想要总的运动轨迹为一个不规则的圆,我们可以将圆放到第一象限(逆时针旋转)或者第四象限(顺时针旋转),圆的位置为max_double,则进行直线运动。

接下来我们只需要写一个关于目标点在圆周上随机移动的方法就行(这里可以随便写,比如用三角函数),这里有一种实现:

  • 目标点一定范围内随机移动
  • 将其投影到圆上(获取其单位向量)

我们首先为SteeringBehaviors类添加新的成员变量:

//wander attributes
    Vec2 _wanderTarget;//目标点

    double _wanderRadius;//辅助圆半径

    double _wanderDistance;//辅助圆离物体的距离

    double _wanderJitter;//给目标点的随机位置一个限制值,这是为了减少速度变化过快产生的抖动

接下来是wander函数的实现:

Vec2 SteeringBehaviors::wander()
{
    //random move
    _wanderTarget = Vec2(Random::Rand(-1, 1)*_wanderJitter,
        Random::Rand(-1, 1)*_wanderJitter);
    //project it onto the circle
    _wanderTarget = _wanderTarget.getNormalized()*_wanderRadius;
    //add jitter
    Vec2 targe
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值