1. 程式人生 > >零基礎學Cocos2d-X 3.0 - 04

零基礎學Cocos2d-X 3.0 - 04

道理 通過 函數 false ret div iss delegate 內容

忙完兩個項目後。最終有時間繼續學習Cocos2d-X 了。


常聽人說。Cocos2d-X 有四個類是最經常使用的,包含:

Director 類----> 導演

Scene 類 -----> 場景

Layer 類 ------> 層

Sprite 類 ------> 精靈


略微大概理解一下吧。


一個舞臺僅僅有一個導演在執導,所以這個是比較好理解的。

一個舞臺會上演非常多場場景戲,不同的場景會在導演的指示下進行切換、進行,這個也沒什麽問題。

一個場景能夠放非常多層,就正如你在開發iOS的時候,你會給一個self.view 增加非常多 subview的道理一樣,這個意會吧,我還不能言傳。

一個舞臺上有非常多工作人員。他們能夠是百般武藝,能夠是變化無窮。太難形容了。直接叫工作人員做精靈好了。


從之前的代碼能夠看出,

導演?Director 類是一個單例

使用方式,如獲取屏幕大小:

Director *pDirector = Director::getInstance();
Size visibleSize = pDirector->getVisibleSize();

或者是

Size visibleSize = Director::getInstance()->getVisibleSize();

好方便的啊~~~~~不愧是單例。



場景 Scene 類,在AppDelegate.cpp 裏面,我們也見過,有時候想想。是不是和ViewController非常像啊

Scene *scene = HelloWorld::createScene();
director->runWithScene(scene);

相似,我僅僅是說相似而已 : )

ViewController *viewController = [[ViewController alloc] init];
self.window.rootViewController = viewController;

一個舞臺能夠由一個Scene 或多個Scene 組成,就好像iOS 應用能夠由一個ViewCotnroller 或多個ViewController組成那樣。


層 Layer 類,我感覺用iOS 的視圖形容它也應該能夠的吧。

你看一個Scene 能夠由一個Layer 或多個Layer 組成,而ViewController 也能夠由一個 View 或多個 View 組成。多像啊。

Layer 是非常重要的。通常多個Layer去實現一個應用、遊戲。



精靈 Sprite 類。

就是遊戲中一個對象。角色。

關於它的我們在稍後將會講講。



精靈 Sprite 的創建


    /// @{
    /// @name Creators

    /**
     * Creates an empty sprite without texture. You can call setTexture method subsequently.
     *
     * @return An autoreleased sprite object.
     */
    static Sprite* create();

    /**
     * Creates a sprite with an image filename.
     *
     * After creation, the rect of sprite will be the size of the image,
     * and the offset will be (0,0).
     *
     * @param   filename A path to image file, e.g., "scene1/monster.png"
     * @return  An autoreleased sprite object.
     */
    static Sprite* create(const std::string& filename);

    /**
     * Creates a sprite with an image filename and a rect.
     *
     * @param   filename A path to image file, e.g., "scene1/monster.png"
     * @param   rect     A subrect of the image file
     * @return  An autoreleased sprite object
     */
    static Sprite* create(const std::string& filename, const Rect& rect);

    /**
     * Creates a sprite with a Texture2D object.
     *
     * After creation, the rect will be the size of the texture, and the offset will be (0,0).
     *
     * @param   texture    A pointer to a Texture2D object.
     * @return  An autoreleased sprite object
     */
    static Sprite* createWithTexture(Texture2D *texture);

    /**
     * Creates a sprite with a texture and a rect.
     *
     * After creation, the offset will be (0,0).
     *
     * @param   texture    A pointer to an existing Texture2D object.
     *                      You can use a Texture2D object for many sprites.
     * @param   rect        Only the contents inside the rect of this texture will be applied for this sprite.
     * @param   rotated     Whether or not the rect is rotated
     * @return  An autoreleased sprite object
     */
    static Sprite* createWithTexture(Texture2D *texture, const Rect& rect, bool rotated=false);

    /**
     * Creates a sprite with an sprite frame.
     *
     * @param   spriteFrame    A sprite frame which involves a texture and a rect
     * @return  An autoreleased sprite object
     */
    static Sprite* createWithSpriteFrame(SpriteFrame *spriteFrame);

    /**
     * Creates a sprite with an sprite frame name.
     *
     * A SpriteFrame will be fetched from the SpriteFrameCache by spriteFrameName param.
     * If the SpriteFrame doesn‘t exist it will raise an exception.
     *
     * @param   spriteFrameName A null terminated string which indicates the sprite frame name.
     * @return  An autoreleased sprite object
     */
    static Sprite* createWithSpriteFrameName(const std::string& spriteFrameName);

    /// @}  end of creators group

從精靈 Sprite 類的頭文件能夠看到有哪些方法能夠創建精靈。

/**********************切割線************************/

創建一個沒有貼圖的精靈

函數:

static Sprite* create();
使用:

    //創建空白的精靈
    Sprite *aSprite = Sprite::create();
    //為精靈加上貼圖
    aSprite->setTexture("Icon-50.png");
    //為精靈設置坐標
    aSprite->setPosition(30, 160);
    //將精靈增加當前層
    this->addChild(aSprite);


/**********************切割線************************/

通過圖像名創建一個精靈

函數:

static Sprite* create(const std::string& filename);

使用:

    //通過圖像名創建精靈
    Sprite *bSprite = Sprite::create("Icon-50.png");
    //為精靈設置坐標
    bSprite->setPosition(95, 160);
    //將精靈增加當前層
    this->addChild(bSprite);

/**********************切割線************************/

通過圖像名和指定切割該圖像的範圍創建精靈

函數:

static Sprite* create(const std::string& filename, const Rect& rect);

使用:

    //通過圖像名和指定切割該圖像的範圍創建精靈
    Sprite *cSprite = Sprite::create("Icon-50.png", Rect(0, 0, 30, 30));
    //為精靈設置坐標
    cSprite->setPosition(150, 160);
    //將精靈增加當前層
    this->addChild(cSprite);

/**********************切割線************************/

通過Texture2D 對象創建精靈

函數:

static Sprite* createWithTexture(Texture2D *texture);

使用:

    //首先創建 Image對象
    Image *image = new Image();
    //為 Image對象 設置圖像。通過指定路徑
    image->initWithImageFile("Icon-50.png");
    //創建 Texture2D對象
    Texture2D *text = new Texture2D();
    //為 Texture2D對象 增加 圖像內容
    text->initWithImage(image);
    //通過貼圖創建精靈
    Sprite *dSprite = Sprite::createWithTexture(text);
    //為精靈設置坐標
    dSprite->setPosition(215, 160);
    //將精靈增加當前層
    this->addChild(dSprite);

/**********************切割線************************/

通過Texture2D 對象和指定切割該對象的範圍創建精靈
函數:

static Sprite* createWithTexture(Texture2D *texture, const Rect& rect, bool rotated=false);

使用:

    //首先創建 Image對象
    Image *image2 = new Image();
    //為 Image對象 設置圖像,通過指定路徑
    image2->initWithImageFile("Icon-50.png");
    //創建 Texture2D對象
    Texture2D *text2 = new Texture2D();
    //為 Texture2D對象 增加 圖像內容
    text2->initWithImage(image);
    //通過貼圖和切割該貼圖創建精靈
    Sprite *eSprite = Sprite::createWithTexture(text2, Rect(0, 0, 30, 30));
    //為精靈設置坐標
    eSprite->setPosition(280, 160);
    //將精靈增加當前層
    this->addChild(eSprite);

/**********************切割線************************/

利用還有一幀創建一個精靈

函數:

static Sprite* createWithSpriteFrame(SpriteFrame *spriteFrame);
使用:

    //SpriteFrame對象。通過指定圖像和切割該圖像的參數創建
    SpriteFrame *frame = SpriteFrame::create("Icon-50.png", Rect(0, 0, 40, 30));
    //通過 SpriteFrame對象 創建精靈
    Sprite *fSprite = Sprite::createWithSpriteFrame(frame);
    //為精靈設置坐標
    fSprite->setPosition(345, 160);
    //將精靈增加當前層
    this->addChild(fSprite);


/**********************切割線************************/

利用幀緩存中一幀的名字創建一個精靈

函數:

static Sprite* createWithSpriteFrameName(const std::string& spriteFrameName);
使用:

    //通過 SpriteFrameName對象 創建精靈
    Sprite *gSprite = Sprite::createWithSpriteFrameName("Icon-50.png");
    //為精靈設置坐標
    gSprite->setPosition(410, 160);
    //將精靈增加當前層
    this->addChild(gSprite);

    //實現的源代碼分析
    //用 SpriteFrameName 的參數從 SpriteFrameCache 中獲取 SpriteFrame對象
    SpriteFrameCache::getInstance()->addSpriteFramesWithFile("testIcon.plist");



技術分享圖片

最後一個因為沒有緩存就無法實現了。要用工具生成plist文件啥的。



最終寫完了,盡管好短暫,可是還是好理解的。尤其後面那兩個函數,看了非常久啊~~~~~苦澀啊~~~~~

預告下一篇是講精靈經常使用的函數。

。。

零基礎學Cocos2d-X 3.0 - 04