cocos2dx - 生成怪物及AI
接上一节内容:cocos2dx - tmx地图分层移动处理
本节怪物及简单AI实现
一、怪物
同cocos2dx - v2.3.3编辑器骨骼动画 里创建的CPlalyer一样,新建一个CMonster类,也可以提出一个公共基类IEntity,为了以后扩展其他类型的实体做准备。
这里怪物还要有一个AI的实体类CAIModule类。
相对玩家主要添加以下:
- //init方法中添加如下
- m_pAIModule = CAIModule::create();
- this->addChild(m_pAIModule);
同时对移动和攻击进行修改
- void CMonster::Move(float delta)
- {
- if (isFloatZero(delta))
- {
- PlayAction(enAction::ACT_DEFAULT);
- if (m_pAIModule)
- {
- // 移动结束回调
- m_pAIModule->OnActionCallback();
- }
- }
- else
- {
- float fspeed = ; // px/fps
- float dx = delta;
- if (isFartherThan(dx, fspeed))
- {
- dx = dx > ? fspeed : -fspeed;
- }
- setPositionX(getPositionX() + dx);
- m_deltaX = delta - dx;
- PlayAction(ACT_RUN);
- // 设置当前的方向
- setScaleX(delta >? - : );
- }
- }
// 攻击结束动作处理
m_pAction->play("attack", false);
std::function<void()> func = [this](){
m_pAction->play("default", true);
m_nActType = ACT_DEFAULT;
if (m_pAIModule)
{
// 攻击结束回调
m_pAIModule->OnActionCallback();
}
};
m_pAction->setLastFrameCallFunc(func);
以上主要在移动和攻击结束的时候调用了AI模块的动作回调。
二、AI模块
本节只是实现最简单的AI机制,直接将策略写在了update中,在间隔一个THINKTIME时间后判断当前最优行动,并执行动作。
如下:
- void CAIModule::update(float dt)
- {
- m_nThinkTime += int(dt*);
- if (m_nThinkTime>THINKTIME)
- {
- if (CMonster* pMonster = dynamic_cast<CMonster*>(getParent()))
- {
- m_stepFunc = nullptr;
- if (CPlayer* pPlayer = CBattleMgr::getInstance()->GetPlayer())
- {
- if (m_pTarget)
- {
- m_pTarget->release();
- m_pTarget = nullptr;
- }
- m_pTarget = pPlayer;
- m_pTarget->retain();
- m_nStep = ;
- m_nThinkTime = ;
- float dis = pMonster->getPosition().distance(pPlayer->getPosition());
- if (dis <)
- {
- m_stepFunc = std::bind(&CAIModule::Attack, this, std::placeholders::_1, std::placeholders::_2);
- Attack(pPlayer, m_nStep);
- //attack
- }
- else
- {
- m_stepFunc = std::bind(&CAIModule::Move2Node, this, std::placeholders::_1, std::placeholders::_2);
- Move2Node(pPlayer, m_nStep);
- //move to pos ;
- }
- }
- }
- }
- }
以上直接设定AI执行对象为玩家,在距离小于200执行攻击,否则向玩家节点靠近移动。同时清楚当前 m_nThinkTime时间,在下一个决策时间到来之前怪物会根据动作步骤持续执行当前动作。
所以这里也需要设置一下动作的当前m_nStep为0,同时设置一下执行的函数m_stepFunc。
为了能够在怪物攻击或者移动结束后m_nStep执行到下一步,实现了一个OnActionCallback函数。如下:
- void CAIModule::OnActionCallback()
- {
- if (m_stepFunc)
- {
- ++m_nStep;
- m_stepFunc(m_pTarget, m_nStep);
- }
- }
这样即可实现简单的AI移动效果,让拥有该AI对象的怪物,不断靠近玩家并且攻击玩家。
CAIModule全代码如下:
- #ifndef __CAIModule_H__
- #define __CAIModule_H__
- #include "IGameDef.h"
- #include "cocos2d.h"
- USING_NS_CC;
- class CAIModule : public Node
- {
- public:
- // implement the "static create()" method manually
- CREATE_FUNC(CAIModule);
- virtual bool init();
- void update(float dt);
- void OnActionCallback();
- private:
- void Attack(Node* pEnemy, int step);
- void Move2Node(Node* pNode,int step);
- CAIModule();
- ~CAIModule();
- int m_nStep; // 当前操作的步骤数
- float m_nThinkTime; // 操作的间隔事件
- Node* m_pTarget;
- std::function<void(Node* node, int step)> m_stepFunc;
- };
- #endif __CAIModule_H__
- #include "AIModule.h"
- #include "Monster.h"
- #include "BattleMgr.h"
- #define THINKTIME (1000) // 决策时间
- CAIModule::CAIModule() :m_nThinkTime(THINKTIME), m_pTarget(nullptr), m_stepFunc(nullptr), m_nStep()
- {
- }
- CAIModule::~CAIModule()
- {
- if (m_pTarget)
- {
- m_pTarget->release();
- m_pTarget = nullptr;
- }
- }
- bool CAIModule::init()
- {
- scheduleUpdate();
- return true;
- }
- void CAIModule::update(float dt)
- {
- m_nThinkTime += int(dt*);
- if (m_nThinkTime>THINKTIME)
- {
- if (CMonster* pMonster = dynamic_cast<CMonster*>(getParent()))
- {
- m_stepFunc = nullptr;
- if (CPlayer* pPlayer = CBattleMgr::getInstance()->GetPlayer())
- {
- if (m_pTarget)
- {
- m_pTarget->release();
- m_pTarget = nullptr;
- }
- m_pTarget = pPlayer;
- m_pTarget->retain();
- m_nStep = ;
- m_nThinkTime = ;
- float dis = pMonster->getPosition().distance(pPlayer->getPosition());
- if (dis <)
- {
- m_stepFunc = std::bind(&CAIModule::Attack, this, std::placeholders::_1, std::placeholders::_2);
- Attack(pPlayer, m_nStep);
- //attack
- }
- else
- {
- m_stepFunc = std::bind(&CAIModule::Move2Node, this, std::placeholders::_1, std::placeholders::_2);
- Move2Node(pPlayer, m_nStep);
- //move to pos ;
- }
- }
- }
- }
- }
- void CAIModule::Attack(Node* pEnemy, int step)
- {
- CMonster* pMonster = dynamic_cast<CMonster*>(getParent());
- if (!pMonster)
- {
- return;
- }
- switch (step)
- {
- case :
- {
- if (!pEnemy)
- {
- return;
- }
- // 立即攻击
- if (isFartherThan(pMonster->getPositionX() < pEnemy->getPositionX(), ))
- {
- Attack(pEnemy,);
- }
- else
- {
- // 太近,移动远一点
- m_nStep =;
- Move2Node(pEnemy,);
- }
- }
- break;
- case :
- {
- if (!pEnemy)
- {
- return;
- }
- // 调整方向准备攻击
- pMonster->setScaleX(pMonster->getPositionX() < pEnemy->getPositionX() ? - : );
- ++m_nStep;
- std::function<void()> func = [this]()
- {
- Attack(nullptr,);
- };
- this->runAction(Sequence::create(DelayTime::create(0.3), CallFunc::create(func), NULL));
- }
- break;
- case :
- {
- // 直接攻击
- pMonster->Attack();
- }
- break;
- default:
- // m_nThinkTime = THINKTIME;
- break;
- }
- }
- void CAIModule::Move2Node(Node* pNode, int step)
- {
- if (!pNode)
- {
- return;
- }
- CMonster* pMonster = dynamic_cast<CMonster*>(getParent());
- if (!pMonster)
- {
- return;
- }
- switch (step)
- {
- case :
- {
- if (pMonster->getPositionX() < pNode->getPositionX())
- {
- pMonster->Move(pNode->getPositionX() - - pMonster->getPositionX());
- }
- else
- {
- pMonster->Move(pNode->getPositionX() + - pMonster->getPositionX());
- }
- }
- break;
- default:
- // m_nThinkTime = THINKTIME;
- break;
- }
- }
- void CAIModule::OnActionCallback()
- {
- if (m_stepFunc)
- {
- ++m_nStep;
- m_stepFunc(m_pTarget, m_nStep);
- }
- }
附上实现后的效果图:
1、这是自动朝着玩家走
2、这是在靠近玩家后进行攻击
cocos2dx - 生成怪物及AI的更多相关文章
- 【cocos2d-x 手游研发----怪物智能AI】
原创文章,转载请注明出处:http://www.cnblogs.com/zisou/p/cocos2d-xARPG4.html 谈到怪物AI,我觉得就比较话多了,首先理解一下(Artificial I ...
- Demo_塔防(自动生成怪物,导航,炮塔攻击,怪物掉血死忙)
using UnityEngine; using System.Collections; public struct WaveMsg { //该波次生成的怪物 public GameObject mo ...
- Cocos2d-x 生成真正的随机数
关于随机数 cocos2d-x 定义了一个宏 CCRANDOM_0_1 生成的是 [0, 1] 之间的值 因此,要生成 [0-100] 之间的数 CCRANDOM_0_1 * 100 生成 [ ...
- cocos2d-x生成随机数
//获取系统时间 //time_t是long类型,精确到秒,通过time()函数可以获得当前时间和1970年1月1日零点时间的差 time_t tt; ...
- 随机生成文章的AI(C++)
#include <iostream> #include <cstdlib> #include <ctime> #include <fstream> u ...
- cocos2dx - 伤害实现
接上一节内容:cocos2dx - 生成怪物及AI 本节主要讲如何通过创建简单的矩形区域来造成伤害 在小游戏中简单的碰撞需求应用box2d等引擎会显得过于臃肿复杂,且功能不是根据需求定制,还要封装,为 ...
- 《MFC游戏开发》笔记九 游戏中的碰撞判定初步&怪物运动简单AI
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9374935 作者:七十一雾央 新浪微博:http:// ...
- 七夕节来啦!AI一键生成情诗,去发给你的女朋友吧!
[摘要] Hello大家好,今天就是七夕节了,为了增进和女朋友之间的情感,我写了一个自动生成情诗的AI: 大家可以在ModelArts尝试复现模型,然后快去发给你们的女朋友吧- 大家好,我是b站up主 ...
- 【cocos2d-x 手游研发----地图活起来了】
谈到地图不少人都说要做地图编辑器了,但是我暂时绕过这一步,如果不用寻路地图就不能移动?寻路就是会绕过障碍物的算法. 我做了一个简单的地图的思想,就是地图分层3层:背景层.可行区域层.遮罩层,但是地图就 ...
随机推荐
- 《Java程序设计》终极不改版【下】
package 大学生信息管理系统; import java.awt.event.*; import javax.swing.*; import java.awt.*; import java.uti ...
- 【★】KMP算法完整教程
KMP算法完整教程 全称: Knuth_Morris_Pratt Algorithm(KMP算法) 类型: ...
- html5 javascript 小型计算器
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- 5th-个人总结(Alpha阶段)
一. 总结自己的Alpha过程 1.团队的整体情况 在团队中这次担任队长的职务. alpha阶段完成情况还算理想,大家都完成了指定的任务.但是也少不了犯错,一些需求没有划分的足够细致,后来功能完成后发 ...
- bean的单例
通过改变中的scope属性,默认是singleton单例.而prototype则指定每getbean得到的都是不同实例. 验证代码: ①:验证默认singleton //验证<bean id=& ...
- 201521123106《java程序设计》第一周学习总结
1.本章学习总结 认识了java语言,了解了java的历史,学习了各种java相关文件的使用,能够进行基本的程序操作,学会了使用博客.码云. 2.书面作业 1.为什么java程序可以跨平台运行?执行j ...
- Java多线程高并发学习笔记(二)——深入理解ReentrantLock与Condition
锁的概念 从jdk发行1.5版本之后,在原来synchronize的基础上,增加了重入锁ReentrantLock. 本文就不介绍synchronize了,有兴趣的同学可以去了解一下,本文重点介绍Re ...
- Python爬虫1-----------placekitten 入门
常用的urllib库有三个类:request,parse,error,request主要完成对url的请求,如proxy,opener,urlopen,parse主要完成对html的解析,error负 ...
- Intellij IDEA WEB结构目录说明【转载】
https://my.oschina.net/lujianing/blog/186737?p=1#OSC_h2_1
- 解决在Ubuntu终端下使用cURL获取GBK格式的页面出现乱码问题
问题描述 在Ubuntu下使用终端使用cURL去拿一个GBK的页面,发现返回来的内容里面中文都是乱码 解决方法 通过iconv来处理乱码拿到的内容,进行转码,示例如下: $curl http://ww ...