標籤: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 個像素的Pointinline 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
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
基於cocos2dx的RPG簡單實用演算法之一 - 角色的移動