Cocos2d-x游戏实例《忍者飞镖》之对象管理
推荐移步至《忍者飞镖射幽灵》之对象管理阅读
配置环境:win7+Cocos2d-x.2.0.3+VS2012
目标读者:需了解游戏帧率以及回调函数的概念
一、引言
对具体游戏demo的分析,是学习Cocos2d-x引擎的最好方法。本文基于懒骨头的博文Cocos2dx游戏开发系列笔记3:牛刀小试->忍者飞镖射幽灵的Demo写就,可以移步了解详细解说以及下载源码。懒骨头应该是根据引擎包自带的SimpleGame项目写的,也可以看看,在samples目录下面。
本文关于对象的管理以这样一个问题为基础:游戏中会不断产生幽灵来进攻忍者,怎样合理地管理许多个幽灵对象,避免占用系统过多的内存?Cocos2d-x引擎其实已经帮我们做了很多工作,管理对象的操作变得相当简单。
二、对象管理流程
1、思路
利用一个CCArray来管理所有幽灵对象。新的幽灵添加到CCArray中,死亡或者越过屏幕的幽灵移出CCArray。
说明:这一节中的代码均非《忍者飞镖射幽灵》中的实际代码,并且只讨论幽灵相关的部分。这样处理是为了方便理解。读者莫被误导。
2、CCArray 的使用
CCArray *enemyArray = new CCArray;//创建CCArray对象
enemyArray->addObject(CCObject *);//添加需要管理的CCObject对象
CCARRAY_FOREACH(_array_ , _obj_)//遍历CCArray列表中的每一个CCObject对象
{
//对_obj_进行操作
}
//以上,宏CCARRAY_FOREACH中,_array_为CCArray对象 ,_obj_为CCArray列表遍历过程中当前操作对象。
enemyArray->removeObject(CCObject *);//移除对象
delete ememyArray;//回收CCArray对象ememyArray
3、CCLayer 部分
虽然已经使用CCArray来管理幽灵,但是幽灵的显示仍需要通过CCLayer。
layer->addChild(enemy);//CCLayer对象layer,CCSprite对象enemy
layer->removeChild(enemy);
4、定时器部分
《忍者飞镖射幽灵》中用到了CCLayer下的两个定时器。
myLayer->scheduleUpdate();//MyCCLayer对象myLayer,MyCCLayer继承自CCLayer,这条语句启用重载的update函数。
void MyCCLayer::update(float dt)//每一帧自动调用一次,传入的dt为相邻帧的 实际 时间间隔
{
//具体更新操作
}
myLayer->schedule(schedule_selector(MyCCLayer::addEnemy),float);////参数1 用于设置回调函数,参数2 设置调用回调函数的时间间隔,秒为单位。
void MyCCLayer::addEnemy(float dt)
{
//具体更新操作
}
Tip:光标移到宏schedule_selector,按F12可以转到定义,查看回调函数的传入参数和返回值应当是什么。
三、具体代码
涉及对象管理的所有内容都在GameScene类中。下面我只贴出跟enemy对象有关的代码,并做一些删减。贴出的各个函数基本上按照程序的执行顺序书写。
1、GameScene.h
class GameScene : public cocos2d::CCLayerColor
{
public:
virtual bool init();
void addTarget();
void spriteMoveFinished(CCNode* sender);
void gameLogic(float dt);
virtual void update(float delta);
};
2、GameScene.cpp
2.1 bool GameScene::init()
enemyArray=new CCArray;
this->schedule( schedule_selector(GameScene::gameLogic), 1.0 );
this->scheduleUpdate();
2.2 void GameScene::gameLogic(float dt)
每隔1秒就会自动调用这个函数
void GameScene::gameLogic(float dt)
{
this->addTarget();
}
2.3 void GameScene::addTarget()
//创建幽灵精灵
CCSprite *target;
target=CCSprite::create("guai/guai1.png",CCRectMake(0,0,80,72));
//加入游戏图层
this->addChild(target,0,1);//参数分别为子节点对象,z-order(值大的盖住值小的),tag
//加入CCArray列表
enemyArray->addObject(target);
//设置动作,幽灵移动到屏幕对面后调用spriteMoveFinished自毁
//创建一个CCMoveTo的动作
CCFiniteTimeAction *actionMove=CCMoveTo::create((float)actualD,ccp(100-target->getContentSize().width,winSize.height/2));
//创建一个回调函数
CCFiniteTimeAction* actionMoveDone = CCCallFuncN::create(this,callfuncN_selector(GameScene::spriteMoveFinished));
//将MoveTo和回调函数用动作序列CCSequence包装后添加到target中
target->runAction(CCSequence::create(actionMove,actionMoveDone,NULL));
2.4 void GameScene::update(float delta)
CCArray *toDel=new CCArray;
...... //碰撞检测,将需要移除的幽灵添加到toDel列表中
......
//处理死亡对象
CCSprite *s;
CCObject *o;
CCARRAY_FOREACH(toDel,o)
{
s=dynamic_cast<CCSprite*>(o);//
enemyArray->removeObject(s);
this->removeChild(s);
}
上面代码中dynamic_cast<Type-id>(expression)把expression转换成Type-id类型的对象。Type-id必须是类的指针、类的引用或者void*。
2.5 void GameScene::spriteMoveFinished(CCNode* sender)
void GameScene::spriteMoveFinished(CCNode* sender)
{
CCSprite *sprite = (CCSprite *)sender;
this->removeChild(sprite);
enemyArray->removeObject(sprite);
}
初步学习中,本文疏漏错误之处,欢迎大家指正!从而对博文不断改进,更好地为大家服务!
转载注明出处:
http://www.cnblogs.com/tangyikejun/p/3871461.html
https://www.zybuluo.com/tangyikejun/note/23878
Cocos2d-x游戏实例《忍者飞镖》之对象管理的更多相关文章
- Unity 游戏开发技巧集锦之使用忍者飞镖创建粒子效果
Unity 游戏开发技巧集锦之使用忍者飞镖创建粒子效果 使用忍者飞镖创建粒子效果 游戏中,诸如烟.火.水滴.落叶等粒子效果,都可以使用粒子系统(particle system)来实现.例如,<明 ...
- iOS cocos2d 2游戏开发实战(第3版)书评
2013是游戏爆发的一年,手游用户也是飞速暴增.虽然自己不做游戏,但也是时刻了解手机应用开发的新动向.看到CSDN的"写书评得技术图书赢下载分"活动,就申请了一本<iOS c ...
- Cocos2d-x3.0游戏实例《不要救我》第十篇(结束)——使用Json配置数据类型的怪物
如今我们有2种类型的怪物,并且创建的时候是写死在代码里的,这是要作死的节奏~ 所以.必须可配置.不然会累死人的. ; i < size; ++i) { int id = root[i][&quo ...
- Cocos2d-x3.0游戏实例《不要救我》第一章——前言
我们可以学习? 这是一个非常easy游戏.但更多的东西用(对于初学者).至少,对于它的一个例子,有点多. 笨木头花心贡献.啥?花心?不呢.是用心~ 转载请注明,原文地址:http://www.benm ...
- Cocos2d—X游戏开发之CCToggle(菜单标签切换)CCControlSwitch(开关切换)
Cocos2d—X游戏开发之CCToggle(菜单标签切换) 首先继承子CCMenu,是菜单标签中的一种.‘ class CC_DLL CCMenuItemToggle : public CCMenu ...
- Cocos2d-x3.0游戏实例之《别救我》第七篇——物理世界的碰撞检測
事实上我也非常吃惊-居然写到第七篇了,我估计也就是四篇的内容,感觉非常奇妙,我也不会非常唠叨什么吖); // 0001 ); // 0001 ); // 0001 这样我们才干监听到它们的碰 ...
- Cocos2d-x3.0游戏实例之《别救我》第八篇——TiledMap实现关卡编辑器
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/musicvs/article/details/25368273 好吧.我真心全然搞不懂.我如今仅仅只 ...
- PHP制作的掷色子点数抽奖游戏实例
PHP制作的掷色子点数抽奖游戏实例,通过掷色子点数来达到抽奖的效果,为抽奖活动增添一些趣味性. 我们将在html页面中写下如下的html结构代码,.wrap用来放置色子和提示信息,#prize则是用来 ...
- 123457123457#0#-----com.threeapp.renzhepaoku01----儿童跑酷游戏(忍者版)
com.threeapp.renzhepaoku01----儿童跑酷游戏(忍者版)
随机推荐
- CodeForces985C-Liebig's Barrels
描述 题解 二分加贪心.先确保前 ii 桶可以分配为相邻的 kk 个,并且保证 a[i∗k+j]−a[1]<=la[i∗k+j]−a[1]<=l,这样就能保证所有的差不大于 ll,如果不能 ...
- 【Vuejs】335-(超全) Vue 项目性能优化实践指南
点击上方"前端自习课"关注,学习起来~ 前言 Vue 框架通过数据双向绑定和虚拟 DOM 技术,帮我们处理了前端开发中最脏最累的 DOM 操作部分, 我们不再需要去考虑如何操作 D ...
- Java 从入门到进阶之路(十三)
在之前的文章我们介绍了一下 Java 类的 private,static,final,本章我们来看一下 Java 中的抽象类和抽象方法. 我们先来看下面一段代码: // 根据周长求面积 class S ...
- tabhost改变标签颜色
package uiframe.zyx.uiframe.com.uiframe.fragments;import android.os.Bundle;import android.support.an ...
- eps-07s,编译及其烧写
项目导入 清理并编译 会出现两个bin文件,然后烧写 修改红框中的东西,然后返回操作界面,进行一键烧写 硬件接线图 设备调试
- Scala函数式编程(四)函数式的数据结构 下
前情提要 Scala函数式编程指南(一) 函数式思想介绍 scala函数式编程(二) scala基础语法介绍 Scala函数式编程(三) scala集合和函数 Scala函数式编程(四)函数式的数据结 ...
- 字符串的扩展(ES6)
文章目录 字符串的扩展 1. 字符的Unicode表示法 2. codePointAt() 3. String.fromCodePoint() 4. 字符串的遍历器接口 5. at()(提案) 6. ...
- elasticsearch7.5.0+kibana-7.5.0+cerebro-0.8.5集群生产环境安装配置及通过elasticsearch-migration工具做新老集群数据迁移
一.服务器准备 目前有两台128G内存服务器,故准备每台启动两个es实例,再加一台虚机,共五个节点,保证down一台服务器两个节点数据不受影响. 二.系统初始化 参见我上一篇kafka系统初始化:ht ...
- 关于爬取babycenter.com A-Z为顺序的所有英文名及其详细属性
这一次爬取的内容已经在标题里提到了,下面是详细要求及其图示: 1.首先以A-Z的顺序获取所有英文名,最后爬取该英文名的详细信息. 2.CSV的header以3中的单词为准,请别拼错.如果没有对应的数 ...
- 原生js复制粘贴上传图片前后台代码,兼容firebox,chrome, ie11,亲测有效
需求:粘贴上传图片,截图工具,右键粘贴,或者ctrl+v粘贴 方法1:可直接套用富文本框的图片上传功能,完成复制粘贴 缺点:麻烦,样式难控制 方法2:用原生js完成,以下案例基于此,样式请自己动手调整 ...