本站文章均為[?李華明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)