cocos2d-x 3.0游戏实例学习笔记《卡牌塔防》第九步---英雄发动攻击

/* 说明:

**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,当有怪物走近的时候,就能看到打印的攻击信息

这里由于攻击需要子弹,而子弹也稍微有点点多,留在下次说

关于效果的话,只能在输出看到

二:下次内容预览

让英雄发射子弹& 怪物受伤看得见---血量条装饰

到下次,也差不多结束啦

三:

----------------------------------------

代码&资源

-------------------------------------------

个人愚昧观点,欢迎指正与讨论

时间: 2024-10-13 16:55:01

cocos2d-x 3.0游戏实例学习笔记《卡牌塔防》第九步---英雄发动攻击的相关文章

cocos2d-x 3.0游戏实例学习笔记 《跑酷》第六步--物理碰撞检测(1)

说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程,用cocos2d-x 2.X 版本重写的,目前我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 那么这一步,我们先不急着给主角和金币岩石碰撞检测,我这里把cocos2d-x 3.0 的物理碰撞检测单独抽取出来,之前看了cocos的官网,有一个教程:用新物理引擎完成碰撞检测,就是一个车和猫的碰撞检测,车撞倒猫,猫就消失.我之前也单独试了下.但是那个教程的代码好像完整性不好,不能运行...于是我又借

cocos2d-x 3.0游戏实例学习笔记 《跑酷》第四步--地图循环&amp;主角添加动作

这一步当中,我们主要完成以下功能: 1.地图的无限滚动---让主角看起来真的是在跑动 2.给主角添加Jump跳跃和crouch下蹲动作 那么首先来让背景滚动起来,在PlayScene.h中添加: //初始化背景 void initBG(); //用update函数让地图滚动 virtual void update(float dt); //背景精灵 cocos2d::Sprite* bgSprite1; cocos2d::Sprite* bgSprite2; cocos2d::Sprite* g

cocos2d-x 3.0游戏实例学习笔记 《跑酷》 第三步---主角开跑&amp;同时带着刚体

在这一步,我们主要是把主角加入到游戏场景中来,并且让它跑动,这里的跑动,实际上也就是执行一组动画,让其看起来像是在跑动,而且相对屏幕的位置也不会改变 我们会定义一个主角类:Runner,而这一步就要用到 帧动画 的创建和使用等知识点. 对于Runner,我的设计思路如下: 1.主角有一个动作集合,包括跑动,跳起来,以及蹲下.那么就有不同的帧动画,那么这里借鉴到 晓风残月前辈的方法,将帧动画打包命名,之后根据动作名来执行动作 2.主角需要绑定刚体,并且在不同的动作下的刚体大小不同 3.我们给主角设

cocos2d-x 3.0游戏实例学习笔记 《跑酷》 第五步--按钮控制主角Jump&amp;Crouch

这一步当中,我们给PlayScene中 添加两个按钮,让主角Jump and Crouch,按钮功能如下: Jump按钮,按下主角跳起来 Crouch按钮,按下主角下蹲,一直按着一直蹲,松开之后主角才站起来 这里用按钮包含头文件"cocos-ext.h"会遇到一点点问题,后面给出详细解决方法: 首先PlayScene.h中要包含头文件: <span style="font-size:14px;">#include "cocos-ext.h&qu

cocos2d-x 3.0游戏实例学习笔记 《跑酷》 完结篇--源码放送

说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程,用cocos2d-x 2.X 版本重写的,目前我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 OK,到昨天为止,我们已经将游戏基本上写完了,这里本来就是别人开源的东西,我这里重写,当然要公布源码.那么这里有两种方式: 第一种:将我运行成功的整个项目打包,VS2012+win7下的,这种方式就比较大,但是可以打开打开 Run/proj.win32/Run.sln 就可以啦 第二种:就是我只打包

cocos2d-x 3.0游戏实例学习笔记 《跑酷》 完结篇--源代码放送

说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程,用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 OK,到昨天为止,我们已经将游戏基本上写完了,这里本来就是别人开源的东西,我这里重写,当然要发布源代码.那么这里有两种方式: 第一种:将我执行成功的整个项目打包,VS2012+win7下的,这样的方式就比較大,可是能够打开打开 Run/proj.win32/Run.sln 就能够啦 另外一种:就是我

cocos2d-x 3.0游戏实例学习笔记 《卡牌塔防》第0步---知识点总结&amp;效果预览

/* 说明: **1.本次游戏实例是<cocos2d-x游戏开发之旅>上的最后一个游戏,这里用3.0重写并做下笔记 **2.我也问过木头本人啦,他说:随便写,第一别完全照搬代码:第二可以说明是学习笔记 **3.这里用cocos2d-x 3.0版本重写,很多地方不同,但是从重写过程中也很好的学习了cocos2d-x */ 环境:Win7 .cocos2d-x 3.0final .C++ .VS2012 笔记思路:后面就按这种思路写笔记啦 1.首先给出每次实现的效果截图 2.然后给出设计思路 3.

cocos2d-x 3.0游戏实例学习笔记 《跑酷》移植到android手机

说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程,用cocos2d-x 2.X 版本重写的,目前我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 好吧,自从上次<跑酷>完结之后,就什么没做什么的,主要是修复了一点点bug ,也在相应的文章里面做出了相应的改动.不过,只能在window上看着玩又有什么太大意思呢!!!于是乎又尝试着弄到手机上试试--OK,初生牛犊不要脸,哦不!不怕喷.这里记录一下我的移植过程.(这里会用到新的大小的资源.待会也会

cocos2d-x 3.0游戏实例学习笔记 《跑酷》一 开始界面

开始界面和前辈的基本上差不多:cocos2d-x游戏开发 跑酷(一)开始界面     但是也有不同 下面先给出游戏过程中用到的所有资源 开始界面定义为:MainScene 有如下功能: 1.背景 2.进入游戏界面按钮 3.预先加载背景音乐文件 .h文件 #ifndef __MainScene__H__ #define __MainScene__H__ #include "cocos2d.h" class MainScene : cocos2d::Layer{ public: virtu

coco2d-x 3.0游戏实例学习笔记 《跑酷》 二 游戏界面--全新的3.0物理世界

从这里开始,就和之前前辈的有很多不同啦. 在MainScene中,开始按钮中,我们就要通过回调函数,进入到我们的游戏场景啦. 那么在游戏场景中我们定义为:PlayScene ,而且是一个带物理世界的场景,cocos2d-x 3.0中要创建物理Scene是很简单的,因为它都帮我们封装好了. 那么这一步,我们在PlayScene 中主要完成以下功能: 1.物理世界创建 2.创建一个地面的物理刚体 相关知识个人见解: 所谓的创建物理世界,个人觉得是一个抽象的东东,作为新手,开始并不能理解,开始你可以就