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

最近自己写RPG,发现在角色对象运动上面还是可以运动到不少的以前数学知识(经理各种纠结的脑补),好久没有写博客了,趁热总结一下算法思路,免得自己过两天又忘了。

已知角色速度和目的地,求每帧位置

已经知道了一个角色 bodyA 速度为 像素/秒

float speed  = 5

目的地为  Point  destination

当前地点为 Point currentPosition = bodyA.getPosition()

那么帧循环里面应该怎样计算角色的 当前位置呢?

方案1. 计算量小但是不精确

Vec2 vec =  destination - currentPosition;

vec.normalize();  单位化

Point nextPosition = vec * speed + currentPosition

方案2. 运动旋转函数 rotateByAngle   精确,计算量大

参数1. 角色当前位置

参数2. 速度向量

参数3. 速度

返回:从Point startPoint开始,沿着某个向量方向移动 range 个像素的Point

inline Point getPointAlongDirection(Point startPoint, Vec2 dir, float range)

{

float radians = vec.getAngle(Vec2(0,1));  //顺时针为正,逆时针负

Point zeroDegreePos = startPoint;

zeroDegreePos.y = startPoint.y + range;

Point des2 = zeroDegreePos.rotateByAngle(startPoint, -radians); //负->顺时针转动

}

方案3.在方案2的思路上, 通过向量公式来优化一下算法

运用向量共线公式 和 向量求模公式进行推到:

向量共线的几何表示:

,其中,当且仅当时,向量共线。

(1)若,则

(2)若,那么

参数1. 角色当前位置

参数2. 速度向量

参数3. 速度

返回:从Point startPoint开始,沿着某个向量方向移动 range 个像素的Point

inline Point getPointAlongDirection(Point startPoint, Vec2 dir, float range)

{

assert(range > 0);

dir.normalize();

float x1 = dir.x;

float y1 = dir.y;

float factor = sqrt(1/(x1 * x1 + y1 * y1)) * range;

float x2 = factor * x1;

float y2 = factor * y1;

Point des = startPoint;

des .x += x2;

des .y += y2;

return des;

}

原文地址

http://write.blog.csdn.net/postedit/47190919

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

时间: 2024-12-26 21:32:38

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

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

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

基于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::playHe

基于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