——蛇和食物的封装
前面我们已经把蛇的“地盘”规划好了,现在的任务是要让这个“主人”和它的食物出现在“地盘”上。那么怎么才能让它出现呢?
我们前面学过如何创建图层,蛇和食物也是一个图层。是不是直接用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秒学院学习日志