小小菜之Cocos2d-x遊戲開發旅程——項目實例:貪喫蛇(2)

——蛇和食物的封裝
前面我們已經把蛇的“地盤”規劃好了,現在的任務是要讓這個“主人”和它的食物出現在“地盤”上。那麼怎麼才能讓它出現呢?
我們前面學過如何創建圖層,蛇和食物也是一個圖層。是不是直接用Sprite創建就好了呢?答案是當然了。但是隻用Sprite是不行的,因爲蛇有身體,每喫掉一個食物身體就長一截,那麼是不是會變成每喫掉一個食物就得有一句Sprite::create() 。
這樣是不行的,我們需要把蛇和食物給封裝到一個類中,這樣方便我們創建和刪除

定義一個Snake類繼承Node類

class Snake : public Node
{

public:
    static Snake * create(int type);
    bool init(int type);
    int row; //行
    int col; //列
    int dir;//方向

};

在創建Snake類的對象時,會傳遞一個參數type,通過type來確定是要創建蛇頭、身體還是食物

Snake * Snake::create(int type)
{
    Snake *ret = new Snake();
    if (ret && ret->init(type))
    {
        ret->autorelease();
        return ret;
    }
    else
    {
        CC_SAFE_DELETE(ret);
        return nullptr;
    }
}

bool Snake::init(int type)
{
    if (!Node::init()) {
        return false;
    }
    Sprite * s;
    //根據類型判斷 產生 1.蛇頭 2.身體 3.食物
    switch(type)
    {
        case 1:
            s = Sprite::create("head.png");
            break;
        case 2:
        {
            int num = random(1, 6);
            s = Sprite::create(StringUtils::format("body0%d.png" , num));
        }
            break;
        case 3:
            s = Sprite::create("food.png");
            break;
        default:
            break;
    }
    s->setAnchorPoint(Vec2::ZERO);
    s->setPosition(Vec2(0.5 , 0.5));
    this->addChild(s);

    return true;
}

這樣我們就把蛇和食物給封裝好了,接下來就需要讓它們出現網格中。
回到遊戲場景
在init()中

//創建頭和食物
    //snakeHead
    head = Snake::create(1);
    head->col = rand()%10;
    head->row = rand()%10;
    head->setPosition(Vec2(head->col*GAME_TILED_WIDTH , head->row*GAME_TILED_HEIGHT));
    bg->addChild(head);

    //init snake dir
    head->dir = UP;

    //food
    food = Snake::create(3);
    food->col = rand()%10;
    food->row = rand()%10;
    food->setPosition(Vec2(food->col*GAME_TILED_WIDTH , food->row*GAME_TILED_HEIGHT));
    bg->addChild(food);

點擊運行,就可以看到蛇頭和食物了。
蛇頭和食物已經出現在“地盤”中了,接下來就該讓蛇頭進行移動,畢竟人家的地盤嘛,想去哪就去哪…

未完待續。。。。

——————————9秒學院學習日誌

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章