【iOS-cocos2d-X 游戏开发之十】自定义各类模版&触屏事件讲解!

简介:

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

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

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

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

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


  
  
  1. 自定义精灵模版: 
  2. SpriteClassModel.h 
  3.   
  4. // 
  5. //  SpriteClassModel.h 
  6. //  Oh!MonsterMR 
  7. // 
  8. //  Created by Himi on 12-3-7. 
  9. //  Copyright (c) 2012年 Augustimpression. All rights reserved. 
  10. // 
  11.   
  12. #ifndef Oh_MonsterMR_SpriteClassModel_h 
  13. #define Oh_MonsterMR_SpriteClassModel_h 
  14.   
  15. #include "cocos2d.h" 
  16. using namespace cocos2d; 
  17. class SpriteClassModel : public cocos2d::CCSprite ,public CCTouchDelegate 
  18.   
  19. public
  20.     static SpriteClassModel* spriteModelWithFile(const char *spName); //静态创建(内存自动释放) 
  21.     void myInit();//自定义初始化函数 
  22.     virtual ~SpriteClassModel(); 
  23.   
  24.     //重写触屏相关函数---- 
  25.     virtual void onEnter(); 
  26.     virtual void onExit(); 
  27.     virtual bool ccTouchBegan(CCTouch* touch, CCEvent* event); 
  28.     virtual void ccTouchMoved(CCTouch* touch, CCEvent* event); 
  29.     virtual void ccTouchEnded(CCTouch* touch, CCEvent* event); 
  30. }; 
  31.   
  32. #endif 
  33. SpriteClassModel.cpp 
  34.   
  35. // 
  36. //  SpriteClassModel.cpp 
  37. //  Oh!MonsterMR 
  38. // 
  39. //  Created by Himi on 12-3-7. 
  40. //  Copyright (c) 2012年 Augustimpression. All rights reserved. 
  41. // 
  42.   
  43. #include "SpriteClassModel.h" 
  44.   
  45. using namespace cocos2d; 
  46.   
  47. SpriteClassModel* SpriteClassModel::spriteModelWithFile(const char *spName) 
  48.     SpriteClassModel *pobSprite = new SpriteClassModel(); 
  49.   
  50.     if (pobSprite && pobSprite->initWithFile(spName))//备注1 
  51.     { 
  52.         pobSprite->myInit(); 
  53.         pobSprite->autorelease(); 
  54.         return pobSprite; 
  55.     } 
  56.     CC_SAFE_DELETE(pobSprite); 
  57.     return NULL; 
  58. }  
  59.   
  60. void SpriteClassModel::myInit(){ 
  61.     CCLOG("----测试init函数"); 
  62.   
  63. //---SpriteClassModel 按键----------------- 
  64. // 别忘记加入 TouchDispatcher  ,TouchDispatcher一般放在onenter 绑定,onexit 删除 
  65. bool SpriteClassModel::ccTouchBegan(CCTouch* touch, CCEvent* event) 
  66.     CCLog("%s","精灵111~ccTouchBegan"); 
  67.     return true
  68.   
  69. void SpriteClassModel::ccTouchMoved(CCTouch* touch, CCEvent* event) 
  70.   
  71.     //获取当前用户触屏点坐标并将3d坐标映射2d坐标系 
  72.     CCPoint touchPoint = touch->locationInView( touch->view() ); 
  73.     touchPoint = CCDirector::sharedDirector()->convertToGL( touchPoint ); 
  74.   
  75.     //touchPoint.x, getPosition().y 
  76.     if(touchPoint.x> CCDirector::sharedDirector()->getWinSize().width/2){ 
  77.         CCLog("%s","精灵22~~ccTouchMoved"); 
  78.     } 
  79.   
  80. void SpriteClassModel::ccTouchEnded(CCTouch* touch, CCEvent* event) 
  81.     CCLog("%s","精灵33~~~ccTouchEnded"); 
  82. }  
  83.   
  84. //---SpriteClassModel 起始结束的生命周期函数---- 
  85. void SpriteClassModel::onEnter() 
  86.     //注册监听   1.dele类,2.优先级,3.YES为阻碍其他类的move 和 end 
  87.     CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this, 0, true); 
  88.     CCSprite::onEnter(); 
  89.   
  90. void SpriteClassModel::onExit() 
  91.     //移除监听 
  92.     CCTouchDispatcher::sharedDispatcher()->removeDelegate(this); 
  93.     CCSprite::onExit(); 
  94.   
  95. SpriteClassModel::~SpriteClassModel(){ 
  96.     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. NodeClassModel.h 
  2.   
  3. // 
  4. //  NodeClassModel.h 
  5. //  Oh!MonsterMR 
  6. // 
  7. //  Created by Himi on 12-3-7. 
  8. //  Copyright (c) 2012年 Augustimpression. All rights reserved. 
  9. // 
  10.   
  11. #ifndef Oh_MonsterMR_NodeClassModel_h 
  12. #define Oh_MonsterMR_NodeClassModel_h 
  13.   
  14. #include "cocos2d.h" 
  15.   
  16. class NodeClassModel : public cocos2d::CCNode 
  17.   
  18. public
  19.     static NodeClassModel* NodeModelWithInit(); 
  20.     void myInit(); 
  21.     virtual ~NodeClassModel(); 
  22.   
  23. }; 
  24.   
  25. #endif 
  26. NodeClassModel.cpp 
  27.   
  28. // 
  29. //  NodeClassModel.cpp 
  30. //  Oh!MonsterMR 
  31. // 
  32. //  Created by Himi on 12-3-7. 
  33. //  Copyright (c) 2012年 Augustimpression. All rights reserved. 
  34. // 
  35.   
  36. #include "NodeClassModel.h" 
  37.   
  38. using namespace cocos2d; 
  39.   
  40. NodeClassModel* NodeClassModel::NodeModelWithInit() 
  41.     NodeClassModel *mynode = new NodeClassModel(); 
  42.     if (mynode) 
  43.     { 
  44.         mynode->myInit(); 
  45.         mynode->autorelease(); 
  46.         return mynode; 
  47.     } 
  48.     CC_SAFE_DELETE(mynode); 
  49.     return NULL; 
  50. }  
  51.   
  52. void NodeClassModel::myInit(){ 
  53.   
  54.     CCLOG("----测试init函数"); 
  55.   
  56. NodeClassModel::~NodeClassModel(){ 
  57.     CCLOG("---析构函数"); 

 

下面介绍下自定义CCLayer的模版:(先上代码,后剖析)

 


  
  
  1. LayerClassModel.h 
  2.   
  3. // 
  4. //  LayerClassModel.h 
  5. //  Oh!MonsterMR 
  6. // 
  7. //  Created by Himi on 12-3-7. 
  8. //  Copyright (c) 2012年 Augustimpression. All rights reserved. 
  9. // 
  10.   
  11. #ifndef Oh_MonsterMR_LayerClassModel_h 
  12. #define Oh_MonsterMR_LayerClassModel_h 
  13.   
  14. #include "cocos2d.h" 
  15.   
  16. using namespace cocos2d; 
  17.   
  18. class LayerClassModel : public cocos2d::CCLayer 
  19.   
  20. public
  21.     static LayerClassModel*sharedLayerClassModel(void); 
  22.     virtual bool init(); 
  23.     static cocos2d::CCScene* scene(); 
  24.     virtual ~LayerClassModel(); 
  25.     LAYER_NODE_FUNC(LayerClassModel);//用于允许CCScene::node(); 
  26. }; 
  27.   
  28. #endif 
  29. // 
  30. //  LayerClassModel.cpp 
  31. //  Oh!MonsterMR 
  32. // 
  33. //  Created by Himi on 12-3-7. 
  34. //  Copyright (c) 2012年 Augustimpression. All rights reserved. 
  35. // 
  36.   
  37. #include "LayerClassModel.h" 
  38.   
  39. using namespace cocos2d; 
  40.   
  41. static LayerClassModel* shredStatic;//备注1 
  42. static bool s_bFirstRun = true;//备注2 
  43.   
  44. LayerClassModel* LayerClassModel::sharedLayerClassModel(void
  45.     if (s_bFirstRun)//备注3 
  46.     { 
  47.         s_bFirstRun=false
  48.     } 
  49.     return shredStatic; 
  50.   
  51. CCScene* LayerClassModel::scene() 
  52.     // 'scene'自动释放内存 
  53.     CCScene *scene = CCScene::node(); 
  54.     // 'layer' 自动释放内存 
  55.     LayerClassModel *layer = LayerClassModel::node(); 
  56.     scene->addChild(layer); 
  57.     return scene; 
  58.   
  59. bool LayerClassModel::init(){ 
  60.     if ( !CCLayer::init() ) 
  61.     { 
  62.         return false
  63.     } 
  64.     shredStatic=this
  65.     //初始化数据 
  66.   
  67.     return true
  68.   
  69. LayerClassModel::~LayerClassModel(){ 
  70.     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的作用防止当前类被重复创建,这个提醒下,不多介绍仂;

 


  
  
  1. StaticClassModel.h 
  2.   
  3. // 
  4. //  StaticClassModel.h 
  5. //  Oh!MonsterMR 
  6. // 
  7. //  Created by Himi on 12-3-8. 
  8. //  Copyright (c) 2012年 Augustimpression. All rights reserved. 
  9. // 
  10.   
  11. #ifndef Oh_MonsterMR_StaticClassModel_h 
  12. #define Oh_MonsterMR_StaticClassModel_h 
  13. #include "cocos2d.h" 
  14.   
  15. class StaticClassModel 
  16.   
  17. public
  18.     static StaticClassModel* sharedStaticClassModel(void); 
  19.     void myInit(); 
  20.     virtual ~StaticClassModel(); 
  21.     // 
  22.     void testFun(); 
  23. }; 
  24. #endif 
  25.  
  26.  
  27. StaticClassModel.cpp 
  28.   
  29. // 
  30. //  StaticClassModel.cpp 
  31. //  Oh!MonsterMR 
  32. // 
  33. //  Created by Himi  on 12-3-8. 
  34. //  Copyright (c) 2012年 Augustimpression. All rights reserved. 
  35. // 
  36.   
  37. #include "StaticClassModel.h" 
  38.   
  39. using namespace cocos2d; 
  40.   
  41. static StaticClassModel shredStatic; 
  42. static bool s_bFirstRun = true
  43.   
  44. StaticClassModel* StaticClassModel::sharedStaticClassModel(void
  45.     if (s_bFirstRun) 
  46.     { 
  47.         shredStatic.myInit(); 
  48.         s_bFirstRun=false
  49.     } 
  50.     return &shredStatic; 
  51.   
  52. void StaticClassModel::myInit(){ 
  53. shredStatic=this

  54.    CCLOG("----测试Static init函数"); 
  55.   
  56. void StaticClassModel::testFun(){ 
  57.     CCLOG("-测试fstatic fun-"); 
  58.   
  59. StaticClassModel::~StaticClassModel(){ 
  60.     CCLOG("---析构函数"); 

基本代码都该有的注释都已经写仂,很容易理解,本篇供Cocos2dx的新童鞋一个参考吧  :ty:

自定义的静态类与将CCLayer静态出来的方式类似,只是一个继承CCLayer一个不需要继承任何父类,模版如下:










本文转自 xiaominghimi 51CTO博客,原文链接:http://blog.51cto.com/xiaominghimi/855506,如需转载请自行联系原作者
目录
相关文章
|
7月前
|
iOS开发 UED
实现一个自定义的iOS动画效果
【4月更文挑战第9天】本文将详细介绍如何在iOS平台上实现一个自定义的动画效果。我们将通过使用Core Animation框架来实现这个动画效果,并展示如何在不同的场景中使用它。文章的目标是帮助读者理解如何使用Core Animation框架来创建自定义动画,并提供一个简单的示例代码。
53 1
|
26天前
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户点击按钮时,按钮将从圆形变为椭圆形,颜色从蓝色渐变到绿色;释放按钮时,动画以相反方式恢复。通过UIView的动画方法和弹簧动画效果,实现平滑自然的过渡。
47 1
|
2月前
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
【10月更文挑战第18天】本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户按下按钮时,按钮将从圆形变为椭圆形并从蓝色渐变为绿色;释放按钮时,动画恢复原状。通过UIView的动画方法和弹簧动画效果,实现平滑自然的动画过渡。
50 5
|
2月前
|
Swift iOS开发 UED
实现一个自定义的iOS动画效果
本文介绍如何使用Swift和UIKit在iOS应用中实现一个自定义按钮动画,当按钮被点击时,其颜色从蓝色渐变为绿色,形状从圆形变为椭圆形,释放后恢复原状。通过UIView动画方法实现这一效果,代码示例展示了动画的平滑过渡和状态切换,有助于提升应用的视觉体验和用户交互。
51 1
|
3月前
|
Swift iOS开发 UED
揭秘一款iOS应用中令人惊叹的自定义动画效果,带你领略编程艺术的魅力所在!
【9月更文挑战第5天】本文通过具体案例介绍如何在iOS应用中使用Swift与UIKit实现自定义按钮动画,当用户点击按钮时,按钮将从圆形变为椭圆形并从蓝色渐变到绿色,释放后恢复原状。文中详细展示了代码实现过程及动画平滑过渡的技巧,帮助读者提升应用的视觉体验与特色。
63 11
|
4月前
|
Swift iOS开发 UED
【绝妙创意】颠覆你的视觉体验!揭秘一款iOS应用中令人惊叹的自定义动画效果,带你领略编程艺术的魅力所在!
【8月更文挑战第13天】本文通过一个具体案例,介绍如何使用Swift与UIKit在iOS应用中创建独特的按钮动画效果。当按钮被按下时,其形状从圆形变化为椭圆形,颜色则从蓝色渐变为绿色;释放后,动画反向恢复原状。利用UIView动画方法及弹簧动画效果,实现了平滑自然的过渡。通过调整参数,开发者可以进一步优化动画体验,增强应用的互动性和视觉吸引力。
53 7
|
API iOS开发
iOS 自定义转场动画 UIViewControllerTransitioning
iOS 自定义转场动画 UIViewControllerTransitioning
96 0
|
9天前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
2天前
|
存储 前端开发 Swift
探索iOS开发:从新手到专家的旅程
本文将带您领略iOS开发的奇妙之旅,从基础概念的理解到高级技巧的掌握,逐步深入iOS的世界。文章不仅分享技术知识,还鼓励读者在编程之路上保持好奇心和创新精神,实现个人成长与技术突破。
|
16天前
|
安全 数据处理 Swift
深入探索iOS开发中的Swift语言特性
本文旨在为开发者提供对Swift语言在iOS平台开发的深度理解,涵盖从基础语法到高级特性的全面分析。通过具体案例和代码示例,揭示Swift如何简化编程过程、提高代码效率,并促进iOS应用的创新。文章不仅适合初学者作为入门指南,也适合有经验的开发者深化对Swift语言的认识。
37 9