本站文章均为[ 李华明Himi ](http://www.himigame.com/about-himi)原创,转载务必在明显处注明:
转载自[【黑米GameDev街区】](http://www.himigame.com/) 原文链接: [http://www.himigame.com/iphone-cocos2dx/699.html](http://www.himigame.com/iphone-cocos2dx/699.html "【iOS-cocos2d-X")
[☞ 点击订阅 ☜](http://list.qq.com/cgi-bin/qf_invite?id=acfc24e272cc4a26debf3b3866edb626a9ea3fc80fd8893c) 本博客最新动态!及时将最新博文通知您!
这里Himi又来了一篇基础篇…..不是因为充博文数量,而是Cocos2dX一个超级群里不少童鞋都有问过很基础的问题,Himi估计这些童鞋要么之前对C++不熟悉,要么就是之前没有接触过Cocos2d,而直接转入了Cocos2dx的开发行列中仂,这里首先给这些童鞋三个建议:
1.Cocos2dx的教程确实不多,但是因为Cocos2dx是Cocos2d一个繁衍的引擎,基本API没有大的变化,你只要将Cocos2d熟悉仂,那么X对你来说不会难的….
2.还是再次提醒大家多看看引擎自带的例子,对于很多基础问题,源码完全能照顾到的,不管是cocos2d的,还是cocos2dX的,但是如果你还不知道Cocos2d/X的引擎示例在哪….无语下…(在引擎包下哦)
3.还有不少童鞋抱着“赶快做完这个功能”的态度来工作来求助。。。这样不好的说,学开发跟学习一样,不思考就来答案的东西真的是浮云。。。建议大家遇到瓶颈的时候考虑下吧,禁忌饭来张口的童鞋;
入正题,开头就说仂本篇主要为了照顾下基础的童鞋,但是本篇也会介绍些在cocos2dx引擎中一些自定义类的模版的创建和使用;介绍过程中顺便把基础也说下,这样一举两得;
首先我们先看一个自定义精灵类如何来做:(先上代码,然后细说)
~~~
自定义精灵模版:
SpriteClassModel.h
//
// SpriteClassModel.h
// Oh!MonsterMR
//
// Created by Himi on 12-3-7.
// Copyright (c) 2012年 Augustimpression. All rights reserved.
//
#ifndef Oh_MonsterMR_SpriteClassModel_h
#define Oh_MonsterMR_SpriteClassModel_h
#include "cocos2d.h"
using namespace cocos2d;
class SpriteClassModel : public cocos2d::CCSprite ,public CCTouchDelegate
{
public:
static SpriteClassModel* spriteModelWithFile(const char *spName); //静态创建(内存自动释放)
void myInit();//自定义初始化函数
virtual ~SpriteClassModel();
//重写触屏相关函数----
virtual void onEnter();
virtual void onExit();
virtual bool ccTouchBegan(CCTouch* touch, CCEvent* event);
virtual void ccTouchMoved(CCTouch* touch, CCEvent* event);
virtual void ccTouchEnded(CCTouch* touch, CCEvent* event);
};
#endif
~~~
~~~
SpriteClassModel.cpp
//
// SpriteClassModel.cpp
// Oh!MonsterMR
//
// Created by Himi on 12-3-7.
// Copyright (c) 2012年 Augustimpression. All rights reserved.
//
#include "SpriteClassModel.h"
using namespace cocos2d;
SpriteClassModel* SpriteClassModel::spriteModelWithFile(const char *spName)
{
SpriteClassModel *pobSprite = new SpriteClassModel();
if (pobSprite && pobSprite->initWithFile(spName))//备注1
{
pobSprite->myInit();
pobSprite->autorelease();
return pobSprite;
}
CC_SAFE_DELETE(pobSprite);
return NULL;
}
void SpriteClassModel::myInit(){
CCLOG("----测试init函数");
}
//---SpriteClassModel 按键-----------------
// 别忘记加入 TouchDispatcher ,TouchDispatcher一般放在onenter 绑定,onexit 删除
bool SpriteClassModel::ccTouchBegan(CCTouch* touch, CCEvent* event)
{
CCLog("%s","精灵111~ccTouchBegan");
return true;
}
void SpriteClassModel::ccTouchMoved(CCTouch* touch, CCEvent* event)
{
//获取当前用户触屏点坐标并将3d坐标映射2d坐标系
CCPoint touchPoint = touch->locationInView( touch->view() );
touchPoint = CCDirector::sharedDirector()->convertToGL( touchPoint );
//touchPoint.x, getPosition().y
if(touchPoint.x> CCDirector::sharedDirector()->getWinSize().width/2){
CCLog("%s","精灵22~~ccTouchMoved");
}
}
void SpriteClassModel::ccTouchEnded(CCTouch* touch, CCEvent* event)
{
CCLog("%s","精灵33~~~ccTouchEnded");
}
//---SpriteClassModel 起始结束的生命周期函数----
void SpriteClassModel::onEnter()
{
//注册监听 1.dele类,2.优先级,3.YES为阻碍其他类的move 和 end
CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this, 0, true);
CCSprite::onEnter();
}
void SpriteClassModel::onExit()
{
//移除监听
CCTouchDispatcher::sharedDispatcher()->removeDelegate(this);
CCSprite::onExit();
}
SpriteClassModel::~SpriteClassModel(){
CCLOG("---析构函数");
}
~~~
这个自定义精灵类的模版重点介绍3个点:
1.构造函数;
static SpriteClassModel* spriteModelWithFile(const char *spName);
此构造函数的实现机制,Himi仿制Cocos2dX引擎来做的,一方面使用方便,另外一方面内存自动释放;
2.在构造函数中,有个备注1,还没有看到的童鞋请回头看下,这里我使用的父类CCSprite的索引文件名的创建方式,如下:
initWithFile(<#const char *pszFilename#>);
那么这里可以根据需要继续自定义使用父类的索引帧缓存文件名的方式,如下:
initWithSpriteFrameName(<#const char *pszSpriteFrameName#>);
当然仂为了方便大家可以在自定义中多写几种构造,留好接口使用即可,那么这里Himi还自定义仂一个myInit()的函数,这个函数主要用途两点:1.用以清晰化操作,代码易读 2.当此类多种构造函数并在的时候可以将此自定义精灵类的独有属性设置等都放入此函数中,代码复用;
3.关于触屏方面的,代码都有注释,不多说,唯一要提醒大家的就是当前Himi的这个精灵是采用触屏事件分发的机制进行处理的,而不是直接开启触屏开关(此方法太过于局限),那么如果对于这两种不太熟悉的童鞋请移步到如下文章:(cocos2d与cocos2dx类似)
【iOS-Cocos2d游戏开发之五】多触点与触屏事件详解(单一监听、事件分发)
关于CCNode的自定义这个不多说仂,类似自定义精灵只是继承父类有所变化,模版如下:
~~~
NodeClassModel.h
//
// NodeClassModel.h
// Oh!MonsterMR
//
// Created by Himi on 12-3-7.
// Copyright (c) 2012年 Augustimpression. All rights reserved.
//
#ifndef Oh_MonsterMR_NodeClassModel_h
#define Oh_MonsterMR_NodeClassModel_h
#include "cocos2d.h"
class NodeClassModel : public cocos2d::CCNode
{
public:
static NodeClassModel* NodeModelWithInit();
void myInit();
virtual ~NodeClassModel();
};
#endif
~~~
~~~
NodeClassModel.cpp
//
// NodeClassModel.cpp
// Oh!MonsterMR
//
// Created by Himi on 12-3-7.
// Copyright (c) 2012年 Augustimpression. All rights reserved.
//
#include "NodeClassModel.h"
using namespace cocos2d;
NodeClassModel* NodeClassModel::NodeModelWithInit()
{
NodeClassModel *mynode = new NodeClassModel();
if (mynode)
{
mynode->myInit();
mynode->autorelease();
return mynode;
}
CC_SAFE_DELETE(mynode);
return NULL;
}
void NodeClassModel::myInit(){
CCLOG("----测试init函数");
}
NodeClassModel::~NodeClassModel(){
CCLOG("---析构函数");
~~~
下面介绍下自定义CCLayer的模版:(先上代码,后剖析)
~~~
LayerClassModel.h
//
// LayerClassModel.h
// Oh!MonsterMR
//
// Created by Himi on 12-3-7.
// Copyright (c) 2012年 Augustimpression. All rights reserved.
//
#ifndef Oh_MonsterMR_LayerClassModel_h
#define Oh_MonsterMR_LayerClassModel_h
#include "cocos2d.h"
using namespace cocos2d;
class LayerClassModel : public cocos2d::CCLayer
{
public:
static LayerClassModel*sharedLayerClassModel(void);
virtual bool init();
static cocos2d::CCScene* scene();
virtual ~LayerClassModel();
LAYER_NODE_FUNC(LayerClassModel);//用于允许CCScene::node();
};
#endif
~~~
~~~
//
// LayerClassModel.cpp
// Oh!MonsterMR
//
// Created by Himi on 12-3-7.
// Copyright (c) 2012年 Augustimpression. All rights reserved.
//
#include "LayerClassModel.h"
using namespace cocos2d;
static LayerClassModel* shredStatic;//备注1
static bool s_bFirstRun = true;//备注2
LayerClassModel* LayerClassModel::sharedLayerClassModel(void)
{
if (s_bFirstRun)//备注3
{
s_bFirstRun=false;
}
return shredStatic;
}
CCScene* LayerClassModel::scene()
{
// 'scene'自动释放内存
CCScene *scene = CCScene::node();
// 'layer' 自动释放内存
LayerClassModel *layer = LayerClassModel::node();
scene->addChild(layer);
return scene;
}
bool LayerClassModel::init(){
if ( !CCLayer::init() )
{
return false;
}
shredStatic=this;
//初始化数据
return true;
}
LayerClassModel::~LayerClassModel(){
CCLOG("---析构函数");
}
~~~
关于自定义CCLayer模版中,我这里将触屏相关代码删除了,与自定义精灵的触屏实现一样没区别;
重点介绍3点:
1.CCLayer和CCScene 两个类都是自动释放内存,这个提示在创建cocos2dx引擎模版默认HelloWorldScene类中已经有提示,可能大家没有注意到,所以这里强调下;
2.CCLayer 经常会用于整个大的UI设计或者游戏中,他都作为主要的父类来使用,将游戏元素CCSprite,CCMenu,粒子等都添加到Layer中,所以此类在游戏中的交互性应该最强,所以在LayerClassModel模版中我添加了一个静态函数用于方便访问和其他类进行数据交互用(备注1),如下函数:
static LayerClassModel*sharedLayerClassModel(void);
好处不用多说,如CCDirector一样使用,如:CCDirector::sharedDirector()->getWinSize();
3.备注2和备注3的作用防止当前类被重复创建,这个提醒下,不多介绍仂;
自定义的静态类与将CCLayer静态出来的方式类似,只是一个继承CCLayer一个不需要继承任何父类,模版如下:
~~~
StaticClassModel.h
//
// StaticClassModel.h
// Oh!MonsterMR
//
// Created by Himi on 12-3-8.
// Copyright (c) 2012年 Augustimpression. All rights reserved.
//
#ifndef Oh_MonsterMR_StaticClassModel_h
#define Oh_MonsterMR_StaticClassModel_h
#include "cocos2d.h"
class StaticClassModel
{
public:
static StaticClassModel* sharedStaticClassModel(void);
void myInit();
virtual ~StaticClassModel();
//
void testFun();
};
#endif
StaticClassModel.cpp
//
// StaticClassModel.cpp
// Oh!MonsterMR
//
// Created by Himi on 12-3-8.
// Copyright (c) 2012年 Augustimpression. All rights reserved.
//
#include "StaticClassModel.h"
using namespace cocos2d;
static StaticClassModel shredStatic;
static bool s_bFirstRun = true;
StaticClassModel* StaticClassModel::sharedStaticClassModel(void)
{
if (s_bFirstRun)
{
shredStatic.myInit();
s_bFirstRun=false;
}
return &shredStatic;
}
void StaticClassModel::myInit(){
1
shredStatic=this;
CCLOG("----测试Static init函数");
}
void StaticClassModel::testFun(){
CCLOG("-测试fstatic fun-");
}
StaticClassModel::~StaticClassModel(){
CCLOG("---析构函数");
}
~~~
基本代码都该有的注释都已经写仂,很容易理解,本篇供Cocos2dx的新童鞋一个参考吧
- 前言
- 【Iphone 游戏开发】游戏引擎剖析
- [Object-C语言随笔之一]Mac os 下搭建iOS开发环境
- [Object-C语言随笔之二] 《NSLog》常用的打印调试语句与自动排版
- [Object-C语言随笔之三] 类的创建和实例化以及函数的添加和调用!
- [Object-C语言随笔之四]创建视图并绘制简单图形
- 【iOS-Cocos2d游戏开发之一】搭建cocos2d游戏引擎环境HelloWorld!
- 【iOS-Cocos2d游戏开发之二】Cocos2D 游戏开发资源贴(教程以及源码)
- 【iOS-Cocos2d游戏开发之三】CCScene切换的所有特效(28种)以及设置屏幕横竖屏!
- 【iOS-Cocos2d游戏开发之四】独自收集Cocos2d提供的字体!共57种(有对照的字体图)
- 【iOS-Cocos2d游戏开发之五】多触点与触屏事件详解(单一监听、事件分发)【11月28日更新】
- 【iOS-Cocos2d游戏开发之六】对触屏事件追加讲解,解决无法触发ccTouchMoved事件[重要!]
- 【iOS-Cocos2d游戏开发之七】在cocos2d中添加/删除系统组件,并解决View设置透明会影响View中的其他组件的问题!【11月28日更新解决添加组件Cocos2d动画停止播放的BUG】
- 【iOS-Cocos2d游戏开发之八】开启高清(960*640)模式问题与解答、图片适配以及设置iphone横竖屏
- 【iOS-Cocos2d游戏开发之九】讲解CCSpriteBatchNode与TP工具的&quot;.pvr.ccz&quot;,&quot;.plist&quot;共用的终极精灵优化及注意事项!
- 【iOS-Cocos2d游戏开发之十】添加粒子系统特效并解决粒子特效与Layer之间的坐标问题;
- 【iOS-Cocos2d游戏开发之十一】使用Box2d物理系统以及在cocos2d框架添加Box2d物理系统lib包的方法
- 【iOS-Cocos2d游戏开发之十二】浅析使用C++/C/OC进行iOS游戏混编出现“failed with exit”问题与小结;
- 【iOS-Cocos2d游戏开发之十三】CCSprite利用Bezier(贝塞尔)做抛物线动作并让CCSprite同时播放两个Action动作!
- 【iOS-Cocos2d游戏开发之十四】音频/音效/视频播放(利用Cocos2D-iPhone-Extensions嵌入Cocos2d进行视频播放!)
- 【iOS-Cocos2d游戏开发之十五】详解CCProgressTimer 进度条并修改cocos2d源码实现“理想”游戏进度条!
- 【iOS-Cocos2d游戏开发之十六】添加本地通知(UILocalNotification)以及添加系统组件滚动视图(UIScrollView)!【2011年11月15日更新】
- 【iOS-Cocos2d游戏开发之十七】灵活使用精灵可视区域(TextureRect)与锚点(anchorPoint),并结合可视区域与锚点制作进度条!
- 【iOS开发必备指南合集】申请企业级IDP、真机调试、游戏接入GameCenter 指南(实现仿官方的成就提示)、游戏接入OpenFeint指南;
- 【iOS-Cocos2d游戏开发之十八】解决滚屏背景/拼接地图有黑边(缝隙)/动画播放出现毛边以及禁止游戏中自动锁屏问题!【2011年12月18日补充】
- 【iOS开发必收藏】详解iOS应用程序内使用IAP/StoreKit付费、沙盒(SandBox)测试、创建测试账号流程!【2012-12-11日更新获取&quot;产品付费数量等于0的问题&quot;】
- 【iOS-cocos2d-X 游戏开发之一】在Mac下结合Xcode搭建Cocos2d-X开发环境!
- 【iOS-cocos2d-X 游戏开发之二】【必看篇】总结阐述Cocos2d-X与Cocos2d-iphone区别;
- 【iOS-Cocos2d游戏开发之十九】游戏数据存储的四种常用方式NSKeyedArchiver/NSUserDefaults/Write写入/SQLite3
- 【iOS-Cocos2d游戏开发之二十】精灵的基础知识点总汇(位图操作/贴图更换/重排z轴等)以及利用CCSprite与CCLayerColor制作简单遮盖层!
- 【iOS-Cocos2d游戏开发之二十一 】自定义精灵类并为你的精灵设置攻击帧(指定开始帧)以及扩展Cocos2d源码的CCAnimation简化动画创建!
- 【iOS-Cocos2d游戏开发之二十二 】CCSpeed实现CCAnimate动画进行时设置慢动作以及设置游戏加减速进行(塔防游戏必备)!
- 【iOS-cocos2d-X 游戏开发之三】Mac下配置Android NDK环境并搭建Cocos2d-x环境并Eclipse正常编译运行Cocos2dX自带TestsDemo项目!
- 【iOS-cocos2d-X 游戏开发之四】Cocos2dX创建Android NDK新项目并编译导入Eclipse中正常运行!
- 【iOS-cocos2d-X 游戏开发之五】游戏存储之Cocos2dX自带CCUserDefault类详解;
- 【iOS-cocos2d-X 游戏开发之六】使用Base64算法对Cocos2dX自带CCUserDefault游戏存储数据编码!
- 【iOS-cocos2d-X 游戏开发之七】整合Cocos2dX的Android项目到Xcode项目中,Xcode编写&amp;编译代码,Android导入打包运行即可!
- 【iOS-iap防护】验证用户付费收据!拒绝iap Cracker!拒绝iap Free!让iphone越狱用户无从下手!【2012年5月2日更新防护iap Free的方法】
- 【COCOS2DX-LUA 脚本开发之一】在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途!
- 【iOS-cocos2d-X 游戏开发之九】Cocos2dx利用CCSAXParser解析xml数据&amp;CCMutableDictionary使用与注意!
- 【iOS-cocos2d-X 游戏开发之十】自定义CCSprite/Layer/CCNode及静态类模版&amp;自定义类细节说明&amp;Cocos2dx触屏事件讲解
- 【iOS-cocos2d-X 游戏开发之十一】New CCSprite()带来的错误&amp;使用CCUserDefault及pvr.ccz在Cocos2dx中要注意!
- 【iOS-cocos2d-X 游戏开发之十二】自定义Cocos2dx摇杆(增强Joystick),增加摇杆跟随用户触点作为摇杆坐标,让摇杆不再死板!
- 【iOS-cocos2d-X 游戏开发之十三】详细讲解在Xcode中利用预编译并通过Jni调用Android的Java层代码(cocos2dx里访问调用Android函数)!
- 【iOS-cocos2d-X 游戏开发之十四】Xcode中c++&amp;Object-C混编,详细介绍如何在cocos2dx中访问object函数以及Apple Api
- 【iOS-cocos2d-X 游戏开发之十五】Cocos2dx中响应Android的Back(返回)与Menu(小房子)事件&amp;&amp;Cocos2dx自动释放粒子内存函数!
- 【iOS-cocos2d-X 游戏开发之十六】配置你的Cocos2dx项目编译后的Android自动使用(-hd)高清图&amp;设置Android自适应屏幕、缩放比例方法!
- 【Cocoa(mac) Application 开发系列之四】动作编辑器(Cocos2dx)制作流程详解及附上响应鼠标滚轴事件、反转坐标系、导入/创建资源目录等知识点代码!
- 【Cocos2d-X(2.x) 游戏开发系列之一】cocos2dx(v2.x)与(v1.x)的一些常用函数区别讲解!在2.x版CCFileData类被去除等
- 【Cocos2d-X(2.x) 游戏开发系列之二】cocos2dx最新2.0.1版本跨平台整合NDK+Xcode,Xcode编写&amp;编译代码,Android导入打包运行即可!
- 【Cocos2dX(2.x)_Lua开发之三】★重要必看篇★在Lua中使用自定义精灵(Lua脚本与自创建类之间的访问)及Lua基础讲解
- 【Cocos2d-X(2.x) 游戏开发系列之三】最新版本cocos2d&#173;2.0&#173;x&#173;2.0.2使用新资源加载策略!不再沿用-hd、-ipad、-ipadhd添加后缀方式
- 【Cocos2d-X(1.x 2.x) 修复篇】iOS6 中 libcurl.a 无法通过armv7s编译以及iOS6中无法正常游戏横屏的解决方法
- 【Cocos2d-X(1.x 2.x) 】iOS6与iphone5适相关设置随笔(解决第三方类库无法通过armv7s编译的方法、添加Default-568h@2x.png)