基于cocos2dx的RPG简单实用算法之2 - 角色跟随移动

本文探讨了游戏角色跟随机制中的抖动问题,并提供了两种解决方案:一种是使用lerp插值来平滑跟随过程,另一种是实现完全跟随以确保跟随者与被跟随者路径一致。详细介绍了如何通过记录和获取路径点来实现这一目标。
摘要由CSDN通过智能技术生成

1. 最朴素的思路:

如果让 B 跟随 A ,并且两者保持距离X(什么,你要让B和A重叠?那你真的不需要看下去了) 。

每一帧 检查 B 与A 的距离, 如果距离 > X ,那么就让B 想A 移动一步。 但是当B的速度 > A 的速度,问题来了,B跟随A 的时候抖得很厉害。


2. 解决抖动

这里有一个比较水的小技巧来解决抖动:lerp 插值

m_heroFollowList 为一角色列表,通过每帧调用playHeroFollow()来实现跟随

void MapTileLayer::playHeroFollow()

{

    if (m_heroFollowList.empty())

        return;

    

    auto prev =m_heroFollowList.at(0);

    prev->setPosition(m_moveLayer->getPosition());

    for (auto hero : m_heroFollowList)

    {

        if (hero->getPosition().distance(prev->getPosition()) >80)

        {

            hero->setPosition(hero->getPosition().lerp(prev->getPosition(),0.03));

            hero->setLocalZOrder(getZOrderOnForeground(hero->getPosition()));

            prev = hero;

        }

    }

}


3. 完全跟随

上面说了,lerp是一个比较水的技巧,因为我们会发现,跟随者的移动轨迹并不是和被跟随者一模一样!有时候我们需要的是完全一样的移动路径,比如实现“贪吃蛇”

(1)实现一个每帧记录角色位置的函数recordCaptainPath

    list<Point> captainPathQueue; //100个点
    void Hero::recordCaptainPath(float dt)
{
    while(captainPathQueue.size() >= 100)
    {
        captainPathQueue.erase(captainPathQueue.begin());
    }
    Point curPos = getCenterPoint();
    captainPathQueue.push_back(curPos);
}


(2)为跟随者提供一个获得路径点的函数

const int queue_max_frame_length = 15;  //跟随着和被跟随者的差距是15帧

queue_max_frame_length 的大小决定了队形的紧密程度


Point Hero::getNextPathRecord()
{
    if(captainPathQueue.size() < queue_max_frame_length) 
        return Point::ZERO;
    else
    {
        Point first = captainPathQueue.front();
        captainPathQueue.pop_front();
        return first;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值