小小菜之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秒学院学习日志

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