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

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;

}

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-27 07:56:36

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

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

最近自己写RPG,发现在角色对象运动上面还是可以运动到不少的以前数学知识(经理各种纠结的脑补),好久没有写博客了,趁热总结一下算法思路,免得自己过两天又忘了. 已知角色速度和目的地,求每帧位置 已经知道了一个角色 bodyA 速度为 像素/秒 float speed  = 5 目的地为  Point  destination 当前地点为 Point currentPosition = bodyA.getPosition() 那么帧循环里面应该怎样计算角色的 当前位置呢? 方案1. 计算量小但是不

基于cocos2dx的RPG简单实用算法之3 - 多角色跟随阵型移动

1. 确定到一个阵型中心对象. 也许是一个英雄,也可以是一个隐藏的对象.也就是下文种的 GridCenter 2. 预先计算号每个阵型"槽" 相对中心对象的 向量. void GameControlManager::startGridMode() { if(m_MainScene->heroList.empty()) return; m_IsStartGridMode = true; Point GridCenter = findGridCenter(); if(memberNu

基于BP神经网络的简单字符识别算法自小结(C语言版)

本文均属自己阅读源码的点滴总结,转账请注明出处谢谢. 欢迎和大家交流.qq:1037701636 email:[email protected] 写在前面的闲话: 自我感觉自己应该不是一个很擅长学习算法的人,过去的一个月时间里因为需要去接触了BP神经网络.在此之前一直都认为算法界的神经网络.蚁群算法.鲁棒控制什么的都是特别高大上的东西,自己也就听听好了,未曾去触碰与了解过.这次和BP神经网络的邂逅,让我初步掌握到,理解透彻算法的基本原理与公式,转为计算机所能识别的代码流,这应该就是所谓的数学和计

基于Jquery 简单实用的弹出提示框

引言: 原生的 alert 样子看起来很粗暴,网上也有一大堆相关的插件,但是基本上都是大而全,仅仅几句话可以实现的东西,可能要引入好几十k的文件,所以话了点时间自己写了个弹出效果,放到项目上去发现效果还不错,这里贴出来,做个备忘,有需要的同学可以拿去,也可以作为一个参考. 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.d

基于Cocos2d-x的2D空间中的OBB(Orient Bounding Box)碰撞检测算法

基于Cocos2d-x的2D空间中的OBB(Orient Bounding Box)碰撞检测算法 尊重原创:http://cn.cocos2d-x.org/tutorial/show?id=1577

【线性表基础】基于线性表的简单算法【Java版】

本文描述了基于线性表的简单算法及其代码[Java实现] 1-1 删除单链表中所有重复元素 // Example 1-1 删除单链表中所有重复元素 private static void removeRepeat(LinkList L) { Node node = L.head.next; // 首结点 while (node != null) // 一重循环,遍历L中的每一个元素 { // Object data=p.data; Node p = node; // q结点的前驱 Node q =

程序员必须知道的10大基础实用算法及其讲解

程序员必须知道的10大基础实用算法及其讲解 原文出处: cricode 算法一:快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2)次比 较,但这种状况并不常见.事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构 上很有效率地被实现出来. 快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子

程序员必知的10大基础实用算法

    算法一:快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2) 次比较,但这种状况并不常见.事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的 架构上很有效率地被实现出来. 快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists). 算法步骤: 1 从数列中挑出一个元

十大基础实用算法之快速排序和堆排序

快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见.事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来. 快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists). 算法步骤: 1 从数列中挑出一个元素,称为 "基准"(pi