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

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

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

1. 确定到一个阵型中心对象。

也许是一个英雄,也可以是一个隐藏的对象。也就是下文种的 GrIDCenter

2. 预先计算号每个阵型“槽” 相对中心对象的 向量。

voID GameControlManager::startGrIDMode()
{
if(m_MainScene->heroList.empty())
return;
m_IsstartGrIDMode = true;
Point GrIDCenter = findGrIDCenter();
if(memberNumber == 1)
return;
else if(memberNumber == 2)
{
// 0
// 1
originrelativeVec[0] = Vec2(0,GrID_Slot_Radius);
originrelativeVec[1] = Vec2(0,-GrID_Slot_Radius);
}
else if(memberNumber == 3)
{
Point firstPos = GrIDCenter + Vec2(0,GrID_Slot_Radius);
Point secondPos = firstPos.rotateByAngle(GrIDCenter,CC_degrees_TO_radians(-120));
Point thirdPos = secondPos.rotateByAngle(GrIDCenter,CC_degrees_TO_radians(-120));

// 0
//
// 1 2
originrelativeVec[0] = firstPos - GrIDCenter;
originrelativeVec[1] = secondPos - GrIDCenter;
originrelativeVec[2] = thirdPos - GrIDCenter;
}
else if(memberNumber == 4)
{
Point firstPos = GrIDCenter + Vec2(0,CC_degrees_TO_radians(-90));
Point thirdPos = secondPos.rotateByAngle(GrIDCenter,CC_degrees_TO_radians(-90));
Point fourthPos = thirdPos.rotateByAngle(GrIDCenter,CC_degrees_TO_radians(-90));

// 0 战士
// 1 2 猎人 法师
// 3 牧师
originrelativeVec[0] = firstPos - GrIDCenter;
originrelativeVec[1] = fourthPos - GrIDCenter;
originrelativeVec[2] = secondPos - GrIDCenter;
originrelativeVec[3] = thirdPos - GrIDCenter;
}


//认领slot位置
int slotIndex = 0;
int minSpeed = 999;
for(auto hero : m_MainScene->heroList) //已经排序
{
if(!hero->getIsAlly() && !hero->getIsDead())
{
hero->setSlotIndex(slotIndex);
slotIndex ++;

auto actorInfo = GameData::getActorInfoFromMap(hero->getUnitID());
if(actorInfo->speed < minSpeed)
minSpeed = actorInfo->speed;
}
}

3. 根据一号英雄相对中心对象的方向来确定阵型初始朝向

Point firstmanPos = m_MainScene->heroList.front()->getCenterPoint();
// crossover_point(firstmanPos,GrIDCenter,)

Vec2 heroVec = firstmanPos - GrIDCenter;
heroVec.normalize();
m_GrIDAngle = getDirectionByChIEf(heroVec);

for(int index = 0; index < memberNumber; index++)
{
Vec2 cur = originrelativeVec[index];
Point curPoint = cur + GrIDCenter;
curPoint = curPoint.rotateByAngle(GrIDCenter,m_GrIDAngle);
cur = curPoint - GrIDCenter;
slotrelativeVec[index] = cur;
}

4. 所有英雄各就各位

for(auto hero : m_MainScene->heroList)
{
if(!hero->getIsAlly() && !hero->getIsDead())
{
Vec2 curVec = slotrelativeVec[hero->getSlotIndex()];
Point des = GrIDCenter + curVec;
hero->setDestinationPoint(des);
}
}
....
}


5. 当阵型移动,根据 ”中心对象“相对目的地位置 targetPos来更新阵型朝向角度GrIDAngle

再根据GrIDAngle刷新 每个槽的相对向量 cur

voID GameControlManager::setGrIDDirection(Point targetPos)
{
//更新阵型朝向
auto GrIDCenter = getGrIDCenter();
Vec2 chIEfVec = targetPos - GrIDCenter;
chIEfVec.normalize();
m_GrIDAngle = getDirectionByChIEf(chIEfVec);
for(int index = 0; index < memberNumber; index++)
{
Vec2 cur = originrelativeVec[index];
Point curPoint = cur + m_gridobject->getposition();
curPoint = curPoint.rotateByAngle(m_gridobject->getposition(),m_GrIDAngle); //在原基础上旋转
cur = curPoint - m_gridobject->getposition();
slotrelativeVec[index] = cur;
}
m_gridobject->setRotation(CC_radians_TO_degrees(-m_GrIDAngle));
}


6. 每一帧让角色移动到自己对应的槽

voID GameControlManager::updateGrIDDirection() { Point slot = getSlotPosByIndex(hero->getSlotIndex()); if(hero->getCenterPoint().distance(slot) > getElasticRange()) { hero->movetoward(slot); } }

总结

以上是内存溢出为你收集整理的基于cocos2dx的RPG简单实用算法之3 - 多角色跟随阵型移动全部内容,希望文章能够帮你解决基于cocos2dx的RPG简单实用算法之3 - 多角色跟随阵型移动所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1069710.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存