/* 说明:
**1.本次游戏实例是《cocos2d-x游戏开发之旅》上的最后一个游戏,这里用3.0重写并做下笔记
**2.我也问过木头本人啦,他说:随便写,第一别完全照搬代码;第二可以说明是学习笔记---好人
**3.这里用cocos2d-x 3.0版本重写,很多地方不同,但是从重写过程中也很好的学习了cocos2d-x
*/
***每一步对应的所有代码以及用到的资源都会打包在最后给出
***为避免代码过多,每一步的代码都做了标记--一看就晓得是第几步实现的避免出错改不回去(难不成还用Git?)
***为了方便移植到手机上,对于每一步都进行编译android测试;因为很多时候代码在win32下可以,编译就会出错,给出的代码会是测试过后的。
本次笔记内容:
1、直接思路&代码
2、下次内容预览
3、本次源码&资源下载
一:思路&代码
让英雄攻击怪物的话,就要用到update函数,自动判断,进入锁定目标攻击,出去就找下一个目标
那么这里首先要解决的就是,英雄必须和当前游戏中的怪物有联系;解决联系问题:
在怪物管理器中添加:
在怪物管理器中添加:
//**9**get MonsterList Vector<Monster*>* getMonsterList(){return &_monsterList;};
我这里偷懒,直接放在.h 的class里面作为public成员;这里需要注意的是传地址
在MapLayer中
//**9** Vector<Monster*>* getMonsterList(){ if(_monsterMgr == NULL) return NULL; return _monsterMgr->getMonsterList(); };
那么,之后,我们就可以在英雄的update函数-->checkAtkMonster中,获得怪物信息
看看英雄是怎么样来攻击怪物的:
首先,英雄有一个当前的攻击目标_atkMonster,最开始构造函数赋值为NULL,然后,获取了怪物信息之后,进行判断
其次,英雄需要一个攻击冷却,_isAtkCoolDown 初始
1、如果没攻击目标,那么,从怪物列表中chooseAim
2、如果有,判断目标是否死了,已经死了就从怪物列表中删除,目标清空NULL,本次攻击结束return;
3、有目标,其攻击冷却结束,那么atk函数进行攻击
4、有目标,判断是否离开攻击范围
先看看 update函数
void Hero::checkAtkMonster(float dt){ //**9**获取怪物列表 auto scene = Director::getInstance()->getRunningScene(); MapLayer* layer = (MapLayer*)scene->getChildByTag(TAG_MAP_LAYER); Vector<Monster*>* monsterList = layer->getMonsterList(); if(layer->getMonsterList() == NULL) return; if(_atkMonster != NULL){ if(_atkMonster->isDead()){ monsterList->eraseObject(_atkMonster); CC_SAFE_RELEASE_NULL(_atkMonster); return; } if(_isAtkCoolDown == false){ atk(); } //**9**看看目标是否走出攻击范围 if(isInAtkRange(_atkMonster->getPosition()) == false){ CCLOG("out out out out out "); CC_SAFE_RELEASE_NULL(_atkMonster); //清空目标 } } else{ //**9**从怪物列表取得攻击目标 chooseAim((*monsterList)); } }
其他函数
void Hero::chooseAim(Vector<Monster*>monsterList){ for(auto monster : monsterList){ if(monster != NULL){ if(isInAtkRange(monster->getPosition())){ //**9**选择目标在范围内,就锁定目标 CCLOG("In Atk Range !!"); CC_SAFE_RELEASE(_atkMonster); CC_SAFE_RETAIN(monster); _atkMonster = monster; break; } } } } bool Hero::isInAtkRange(Point pos){ int atkRange = getAtkRange(); Point heroPos = getPosition(); float dis = ccpDistanceSQ(pos,heroPos); if(dis <= atkRange*atkRange){ return true; } return false; } void Hero::atk(){ CCLOG("Atk!!"); _isAtkCoolDown = true; //攻击间隔时间后,冷却时间到 this->scheduleOnce(schedule_selector(Hero::atkCollDownEnd),getAtkSpeed()/1000.0f); } void Hero::atkCollDownEnd(float dt){ _isAtkCoolDown = false; }
最后,在init函数中
//**9** this->schedule(schedule_selector(Hero::checkAtkMonster),0.3f);
之后F5调试,添加一个hero,当有怪物走近的时候,就能看到打印的攻击信息
这里由于攻击需要子弹,而子弹也稍微有点点多,留在下次说
关于效果的话,只能在输出看到
二:下次内容预览
让英雄发射子弹& 怪物受伤看得见---血量条装饰
到下次,也差不多结束啦
三:
----------------------------------------
-------------------------------------------
个人愚昧观点,欢迎指正与讨论