【iOS-cocos2d-X 游戏开发之十】自定义CCSprite/Layer/CCNode及静态类模版&自定义类细节说明&Cocos2dx触屏事件讲解

本站文章均为 李华明Himi 原创,转载务必在明显处注明:
转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/iphone-cocos2dx/699.html

          ☞ 点击订阅 ☜
 本博客最新动态!及时将最新博文通知您!

这里Himi又来了一篇基础篇…..不是因为充博文数量,而是Cocos2dX一个超级群里不少童鞋都有问过很基础的问题,Himi估计这些童鞋要么之前对C++不熟悉,要么就是之前没有接触过Cocos2d,而直接转入了Cocos2dx的开发行列中仂,这里首先给这些童鞋三个建议:

1. Cocos2dx的教程确实不多,但是因为Cocos2dx是Cocos2d一个繁衍的引擎,基本API没有大的变化,你只要将Cocos2d熟悉仂,那么X对你来说不会难的….

2. 还是再次提醒大家多看看引擎自带的例子,对于很多基础问题,源码完全能照顾到的,不管是cocos2d的,还是cocos2dX的,但是如果你还不知道Cocos2d/X的引擎示例在哪….无语下…(在引擎包下哦)

3. 还有不少童鞋抱着“赶快做完这个功能”的态度来工作来求助。。。这样不好的说,学开发跟学习一样,不思考就来答案的东西真的是浮云。。。建议大家遇到瓶颈的时候考虑下吧,禁忌饭来张口的童鞋;

入正题,开头就说仂本篇主要为了照顾下基础的童鞋,但是本篇也会介绍些在cocos2dx引擎中一些自定义类的模版的创建和使用;介绍过程中顺便把基础也说下,这样一举两得;

  首先我们先看一个自定义精灵类如何来做:(先上代码,然后细说)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
自定义精灵模版:
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
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的自定义这个不多说仂,类似自定义精灵只是继承父类有所变化,模版如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

你可能感兴趣的:(游戏,测试,null,delete,引擎,layer)