cocos2d_x_03_常用類的使用,cocos2d_x_03

來源:互聯網
上載者:User

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 *")
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.