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

2024-06-14 02:38

本文主要是介绍基于cocos2dx的RPG简单实用算法之3 - 多角色跟随阵型移动,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!



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,Grid_Slot_Radius);
        Point secondPos = firstPos.rotateByAngle(GridCenter, 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 - 多角色跟随阵型移动的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1059139

相关文章

PostgreSQL中rank()窗口函数实用指南与示例

《PostgreSQL中rank()窗口函数实用指南与示例》在数据分析和数据库管理中,经常需要对数据进行排名操作,PostgreSQL提供了强大的窗口函数rank(),可以方便地对结果集中的行进行排名... 目录一、rank()函数简介二、基础示例:部门内员工薪资排名示例数据排名查询三、高级应用示例1. 每

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

linux重启命令有哪些? 7个实用的Linux系统重启命令汇总

《linux重启命令有哪些?7个实用的Linux系统重启命令汇总》Linux系统提供了多种重启命令,常用的包括shutdown-r、reboot、init6等,不同命令适用于不同场景,本文将详细... 在管理和维护 linux 服务器时,完成系统更新、故障排查或日常维护后,重启系统往往是必不可少的步骤。本文

HTML5实现的移动端购物车自动结算功能示例代码

《HTML5实现的移动端购物车自动结算功能示例代码》本文介绍HTML5实现移动端购物车自动结算,通过WebStorage、事件监听、DOM操作等技术,确保实时更新与数据同步,优化性能及无障碍性,提升用... 目录1. 移动端购物车自动结算概述2. 数据存储与状态保存机制2.1 浏览器端的数据存储方式2.1.

基于Python实现一个简单的题库与在线考试系统

《基于Python实现一个简单的题库与在线考试系统》在当今信息化教育时代,在线学习与考试系统已成为教育技术领域的重要组成部分,本文就来介绍一下如何使用Python和PyQt5框架开发一个名为白泽题库系... 目录概述功能特点界面展示系统架构设计类结构图Excel题库填写格式模板题库题目填写格式表核心数据结构

C/C++ chrono简单使用场景示例详解

《C/C++chrono简单使用场景示例详解》:本文主要介绍C/C++chrono简单使用场景示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录chrono使用场景举例1 输出格式化字符串chrono使用场景China编程举例1 输出格式化字符串示

MySQL 添加索引5种方式示例详解(实用sql代码)

《MySQL添加索引5种方式示例详解(实用sql代码)》在MySQL数据库中添加索引可以帮助提高查询性能,尤其是在数据量大的表中,下面给大家分享MySQL添加索引5种方式示例详解(实用sql代码),... 在mysql数据库中添加索引可以帮助提高查询性能,尤其是在数据量大的表中。索引可以在创建表时定义,也可

JDK9到JDK21中值得掌握的29个实用特性分享

《JDK9到JDK21中值得掌握的29个实用特性分享》Java的演进节奏从JDK9开始显著加快,每半年一个新版本的发布节奏为Java带来了大量的新特性,本文整理了29个JDK9到JDK21中值得掌握的... 目录JDK 9 模块化与API增强1. 集合工厂方法:一行代码创建不可变集合2. 私有接口方法:接口

windows和Linux安装Jmeter与简单使用方式

《windows和Linux安装Jmeter与简单使用方式》:本文主要介绍windows和Linux安装Jmeter与简单使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows和linux安装Jmeter与简单使用一、下载安装包二、JDK安装1.windows设

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.