想问下子弹如何准确的追踪目标

正在做一个塔防游戏,怪物一直在动、塔不会动。
子弹打出去,到达目标位置后怪物早就跑掉的,这样效果很不好。
想实现子弹追踪目标但是效果一直都不太满意,来问问思路。

我说下我的思路。
1、注册一个定时器,每一帧更新目标位置,对子弹为坐标操作。
但是我想做一个抛物线效果,坐标操作不知道怎么实现抛物线:12:

2、注册一个定时器,每一帧更新目标位置,获取上一次的action并停止action,更新目标位置重新注册一个action
但是感觉效果也不是很好,有没有大牛有更好的思路啊:12:

思路2代码

void BombBullet::moveToAim(float dt){
    //计数器,防止无限次执行action
    if(m_moveCount >= m_moveMaxCount){
        return;
    }

    //获取上一次的action
    auto action = this->getActionByTag(BOMB_BULLET_MOVE_TO_AIM);
    if(action != NULL){
        this->stopAction(action);
    }

    //获取目标位置
    Vec2 aimPos = this->getParent()->convertToNodeSpace(getAim()->getPosition());
    Vec2 startPos = this->getPosition();

    //这段请无视,贝塞尔曲线实现抛物线
    Vec2 midPos = (aimPos+startPos)/2;
    midPos.y += getCurBezierHight();

    ccBezierConfig config;
    config.controlPoint_1 = startPos;
    config.controlPoint_2 = midPos;
    config.endPosition = aimPos;
    auto bezier = BezierTo::create(dt*2,config);

    auto delay = DelayTime::create(dt);
    auto callBack = CallFunc::create(CC_CALLBACK_0(BombBullet::moveEnd,this));

    //重新注册action
    auto seq = Sequence::create(bezier,delay,callBack,NULL);
    seq->setTag(BOMB_BULLET_MOVE_TO_AIM);
    this->runAction(seq);

    m_moveCount++;
}


```

:10:都没人吗?
还有一种思路是算目标即将到的位置,哪个比较好呢

我也遇到了这样的问题 现在子弹跟踪打到人 但是又有一些需要实现贝塞尔曲线 请问你解决了么?

今天刚问的呢。
楼上有效果不好的代码

个人感觉如果不借助物理引擎,应该注册x和y方向两个MOVE,根据上一帧和这一帧目标的位置变化,通过某函数修改某个方向的速度,并根据总速率值不变,计算另一个方向的速度分量。这样估计能不用贝塞尔曲线。

update里面设置rotation啊,我做过类似的追踪导弹,效果还可以:2::2:

对了,设置rotation的时候要判断如果当前rotation+需要转的rotation>5就只转当前rotation+5(或者更小的数,4,3)就行了,效果看起来就连贯了

如果你要做到很牛的效果的话,会很复杂,但是其实你可以这样子。

位置:
if x1 < x2 x1++
if y1 < y2 y2++
setposition(x1, y1)

角度用三角函数什么的算一下、弄出来是弧度值,转成角度就可以

1赞

:14:感谢回答,如果这样做实现曲线运动会很麻烦吧。现在觉得计算未来的位置会比较靠谱

感谢回答,这样只能做直线的运动了,做曲线运动会很麻烦吧。

感谢回答,设rotation只是精灵在旋转吧。

个人感觉rotation和move的方向都改变,这样6楼的回答就应该可以实现。

其实我觉得一般的子弹本来就是做直线运动的,不会去追踪目标。不打中那就是不打中啊,如果有追踪,那只要发一发子弹都会击中目标,这样不太好吧…
当然可以做一些子弹是特殊的子弹可以这么做,6楼的可以实现但是当x,y距离不一样时,到最后会向一个方向运动,会不好看。
建议可以在6楼的基础上做一些改动:++操作可以认为是+=speed,那speed应该是不一样的,可以根据x,y方向的距离做一个比值,来得到不一样的speed。
还有,如果目标是运动的,那speedx,speedy应该是要在每个时间片段上重新计算的。

应该是这样吧…呵呵

你不就是要子弹转动然后去撞击怪吗?我说的是在你的基础上。。。update里面已经有setposition了,再加个setrotation,我的处理是setposition里x,y的距离是根据rotation来得,就是先设置一个初始速度sp,然后sin rotation * sp和cos rotation * sp来算出setposion的x,y方向的值,这样速度也是变速,也有旋转,就和你的贝塞尔曲线差不多的效果,因为旋转角度大得地方某一方向的速度比另一方向的速度大,这样看起来就稍微真实点了:14::14:

曲线是直线拼出来的啊,每帧走一段直线,最后出来就是曲线。我是觉得要从现实的导弹的原理入手,现实中导弹不可能预测目标位置的,你可以把它想象成有一个竖向推进器,一个横向推进器,按最大输出功率输出。

楼主,使用向量,一个表示速度,一个表示方向,可以根据怪物的速度和方向,预先判断他下一帧的位置,然后导弹的向量和怪物的向量做下处理就行,每帧更新导弹位置和角度,推荐看下一本书《AI游戏引擎程序设计》,里面对追踪有详细的描述。

:2: :2: 感谢提供思路,我去试试

因为做的是塔防,我感觉还是打中的效果比较好

其实我还没做旋转额。运动轨迹让我很纠结

感谢回复。
主要是move方向怎么改变的问题
其实是我太懒了:12: