cocos2d_x_03_常用類的使用,cocos2d_x_03
一、TextFieldTTF輸入框的使用
#pragma mark - 自訂方法// 自訂方法,添加一個 TextFieldvoid TextFieldScene::addOneTextField(float x,float y){ TextFieldTTF *field = TextFieldTTF::textFieldWithPlaceHolder("請輸入:","宋體",50); field->setPosition(x,y); // 添加精靈到當前 Layer this->addChild(field); // 2、執行個體化一個觸摸監聽器 對象 auto listener = EventListenerTouchOneByOne::create(); // 當觸摸開始時,綁定一個閉包函數; // 【】表示 要傳入的外界對象,此處是field // ()表示參數 listener->onTouchBegan = [field](Touch *t,Event *e){ // getLocation 返回一個OpenGL座標 // 如果點擊的點,在textField上,才允許輸入 if (field->getBoundingBox().containsPoint(t->getLocation())) { field->attachWithIME(); }else{ field->detachWithIME(); } return false; }; // 3、擷取事件分發器,添加一個事件監聽器,到this身上;即監聽的是field對象【文本輸入框】 Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, field); }
二、自訂類Ball,繼承自SpriteBall.h
CREATE_FUNC(type)宏
Ball.cppinit方法的實現
在主情境中使用自訂類,建立執行個體對象可以是在onEnter()方法,也可以在init()
方法
三、Cocos2d-x的記憶體管理引用計數 reference count推薦:使用時,先retain,使用完release不建議:delete簡化操作:建立完畢後,使用autorelease();四、菜單的使用
第1種方式:設定 回呼函數 為 閉包函數,它屬於c++11最新特性功能表項目的 回呼函數類型 定義如下:
第2種方式:設定 功能表項目 的回調方法,通過宏
CC_CALLBACK_1宏
.h檔案中的回調方法聲明
.cpp檔案中回調方法的實現
五、TableView的使用
匯入cocos2d-x擴充標頭檔,裡面有CCTableView.h
情境繼承自datasouce和delegate
下面是資料來源的方法聲明
下面是tableView代理的聲明
執行個體化一個tableView
整個情境的完整的標頭檔
整個情境的方法實現.cpp檔案
//// TableViewScene.cpp// 01_cocos2d-x//// Created by beyond on 14-10-4.#include "TableViewScene.h"Scene* TableViewScene::createScene(){ // 'scene' 自動釋放 // 建立一個scene auto scene = Scene::create(); // 'layer' 自動釋放 auto layer = TableViewScene::create(); // 將圖層 添加到情境中 scene->addChild(layer); // 返回 填充好圖層的 情境 return scene;}// 在 "init" 方法中,執行個體化自己要用的精靈對象bool TableViewScene::init(){ // 1. 調用父類的init , cpp 沒有super,直接寫父類名 if ( !Layer::init() ) return false; // 螢幕尺寸 winSize = Director::getInstance()->getVisibleSize(); // 添加一個tableview Size size = Size(300, 300); TableView *tv = TableView::create(this, size); // 設定錨點 tv->setAnchorPoint(Point(0, 0)); // 設定位置 tv->setPosition(winSize.width/2, winSize.height/2); // 設定代理 tv->setDelegate(this); // 添加到this addChild(tv); return true;}#pragma mark - 資料來源方法// 下面全是資料來源方法// 共有多少行ssize_t TableViewScene::numberOfCellsInTableView(TableView *table){ return 7;}// 每一行的尺寸Size TableViewScene::tableCellSizeForIndex(TableView *table, ssize_t idx){ return Size(300, 60);}// 每一行的cellTableViewCell* TableViewScene::tableCellAtIndex(TableView *table, ssize_t idx){ // 重用機制,先從緩衝池中取,取不到再建立 TableViewCell *cell = table->dequeueCell(); LabelTTF *label; if (cell==NULL) { // 建立一個cell cell = TableViewCell::create(); // 建立一個新的label label = LabelTTF::create(); // 綁定標記 label->setTag(5267); // 設定字型大小 label->setFontSize(30); // 設定錨點 label->setAnchorPoint(Point(0, 0)); // 添加到cell cell->addChild(label); }else{ // 直接取出cell裡面的 label,重新賦值 label = (LabelTTF*)cell->getChildByTag(5267); } std::string arr[] = {"寶玉","黛玉","寶釵","湘雲","探春","妙玉","晴雯"}; // 設定label內容 label->setString(StringUtils::format("Label %ld,%s",idx,arr[idx].c_str())); // 返回獨一無二的cell return cell; }#pragma mark - 代理 方法//下面全是代理方法// 點擊時調用void TableViewScene::tableCellTouched(TableView* table, TableViewCell* cell){ LabelTTF *label = (LabelTTF*)cell->getChildByTag(5267); std::string content = StringUtils::format("點擊了第n行,內容是:%s",label->getString().c_str()); MessageBox(content.c_str(), "標題");}
重點是
StringUtils::format();<span style="color: rgb(57, 57, 57); font-family: 'Courier New'; font-size: 24px; line-height: 32px; background-color: rgb(245, 245, 245);"><strong>方法</strong></span>
<span style="color: rgb(57, 57, 57); font-family: 'Courier New'; font-size: 24px; line-height: 32px; background-color: rgb(245, 245, 245);"><strong>返回的是std::string對象,可以通過c_str()</strong></span><span style="font-family: 'Courier New'; background-color: rgb(245, 245, 245);">方法轉成c字串</span>
重點是:重用機制
tableCellTouched 相當於iOS中的didSlectedRowAtIndexPath
六、情境切換
:
情境.h標頭檔
情境.cpp類實現添加一個LabelTTF,內容是空白字串,監聽點擊事件,進行情境切換
七、動作Action
// 建立一個監聽器對象auto listener = EventListenerTouchOneByOne::create();// 監聽方法 用閉包函數實現listener->onTouchBegan = [label](Touch *t,Event *e){ // 只有點擊的位置在label身上,才響應監聽事件 if (label->getBoundingBox().containsPoint(t->getLocation())) { // 絕對, 相對 label->runAction(MoveTo::create(1, Point(100, 100))); label->runAction(MoveBy::create(1, Point(-50, -50))->reverse()); // 同時並發執行 Spawn label->runAction(Spawn::create(MoveBy::create(1, Point(100, 100)), RotateBy::create(1, 360),NULL)); label->runAction(Sequence::create(MoveBy::create(1, Point(100, 100)),RotateBy::create(1, 360), NULL)); // 順序執行 Sequence label->runAction(Sequence::create( MoveBy::create(1, Point(100, 100)), RotateBy::create(1, 360), // 閉包函數,實現 動作的偵聽 CallFunc::create([](){ // 動作完成時,彈出 對話方塊 MessageBox("Action complete", "title"); }),NULL)); } return false;};// 向事件分發器 註冊一個事件接聽程式,偵聽發生在label身上的事件Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, label);
八、逐幀動畫
首先,下載Flash_Professional_13_LS20.dmg,約1G左右按下面方法,運行補丁
開啟Flash,開啟【
庫Library】,點擊左下角的建立按鈕,建立一個Symbol,類型選擇【影片剪輯Movie Clip】;在第1幀先畫一個正方形,按F6在第20幀建立一個主要畫面格;並在第20幀 刪除原來的正方形,畫一個圓形;在上面兩個主要畫面格之間的任意一幀,右擊,建立一個【形變補間動畫shape tween】最後,重點,匯出為cocos2d用的大紋理+Plist檔案點擊庫,右擊剛才建立的影片剪輯【movie clip】,選擇【Generate Sprite Sheet】,data format選擇【cocos2D v3】,選擇【Export匯出】這時,產生了plist檔案+一個大紋理圖片,如下所示
plist檔案
精靈幀緩衝、紋理緩衝、SpriteBatchNode三者的關係
//// FrameAnimateScene.cpp// 01_cocos2d-x//// Created by beyond on 14-10-4.////#include "FrameAnimateScene.h"USING_NS_CC;Scene* FrameAnimateScene::createScene(){ // 'scene' 自動釋放 // 建立一個scene auto scene = Scene::create(); // 'layer' 自動釋放 auto layer = FrameAnimateScene::create(); // 將圖層 添加到情境中 scene->addChild(layer); // 返回 填充好圖層的 情境 return scene;}// 在 "init" 方法中,執行個體化自己要用的精靈對象bool FrameAnimateScene::init(){ // 1. 調用父類的init , cpp 沒有super,直接寫父類名 if ( !Layer::init() ) return false; // 螢幕尺寸 winSize = Director::getInstance()->getVisibleSize(); // 2.添加一個精靈,播放幀動畫 this->addSpriteFrameAniamtion(); return true;}#pragma mark - 自訂方法// 2.添加一個精靈,播放幀動畫void FrameAnimateScene::addSpriteFrameAniamtion(){ // 精靈幀緩衝 單例 auto cache = SpriteFrameCache::getInstance(); // 【精靈幀緩衝】會根據plist中的key,到大紋理相簿中,切割並載入 小的精靈幀,放入幀緩衝中,以後只需 根據 小圖片名,從【精靈幀緩衝】中取出小精靈幀即可 cache->addSpriteFramesWithFile("anim.plist"); // 容器,數組,裡面存放的是精靈幀 Vector<SpriteFrame*> vec; // 用來產生小精靈幀的圖片名 char name[15]; // 用0清空記憶體 memset(name, 0, 15); // 從幀緩衝中取出所有的小精靈幀,放入Vector for (int i=0; i<20; i++) { // 格式化name,%04d,表示 不足四位 用填充 sprintf(name, "anim%04d",i); // 將小精靈幀 加入容器 vec.pushBack(cache->getSpriteFrameByName(name)); } // 建立 Animation Animation *animation = Animation::createWithSpriteFrames(vec,0.1f); // 建立 Animate Animate *animate = Animate::create(animation); // 建立精靈 auto sprite = Sprite::create(); // 添加到 this addChild(sprite); // 設定位置 sprite->setPosition(200, 200); // 執行序列幀動畫 Sequence *seq = Sequence::create(animate,animate->reverse(), NULL); sprite->runAction(RepeatForever::create(seq));}
九、事件的傳遞listener->onTouchBegan方法中,返回的bool值 決定了onTouchMove方法是否能夠被觸發
onTouchBegan方法,返回值是bool,參數:Touch *,Event *
其中,參數Event *e中,e->getCurrentTarget得到的是點擊的對象,即 向事件分發器中註冊listener時,綁定的Node對象只要是Node都可以監聽事件
cocos2d遊戲開發怎建立繼承CCSprite的類,並在項目中使用該類
你建立檔案,選擇基於CCNode class
然後選擇subclass of CCSprite, 然後建立的類就基於CCSprite了,你在項目中就可以直接使用這個類了。
希望能協助到你。
cocos2d-x 中怎判斷給出的類是哪種類型的類,例如一個CCObject可可以是CCString,CCArray等等
strcmp(typeid( ??? ).name(),"class cocos2d::CCSprite *")