用简单思路开发游戏—----怎么想得就怎么写
贪吃蛇~
规则:不能撞墙,不恩吃自己,吃一个蛋长大一点,速度变快
首先定义一个蛋
struct TEgg
{
int x;
int y;
};
蛇是由很多蛋连到一起组成
std::vector<TEgg> m_snake;//蛇
吃到的蛋是在到了尾巴处才能消化变成蛇,所以得记录下她吃了哪些蛋
std::vector<TEgg> m_eggs;//吃到的蛋
每次生成一个蛋给蛇吃
TEgg m_egg;
结构上欧了
开始搞个地图,蛇只能在固定区域肆无忌惮,
void Snake::initMap()
{
for(int i = 0; i < KWidth; ++i)
{
for(int j = 0; j < KHeight; ++j)
{
m_pos[i][j] = Vec2(118 + KEggSize / 2 + KEggSize * i, 70 + KEggSize / 2 + KEggSize * j);
}
}
}
初始化一个蛇,由三个蛋组成,蛇头位置(3, 5)
void Snake::initSnake()
{
m_snake.clear();
m_snakeSprite.clear();
int x = 3;
int y = 5;
for(int i = 0; i < 3; ++i)
{
TEgg egg;
egg.x = x - i;
egg.y = y;
m_snake.push_back(egg);
auto sprite = Sprite::create("test/egg.png");
sprite->setPosition(m_pos[egg.x][egg.y]);
addChild(sprite);
m_snakeSprite.push_back(sprite);
}
m_eggSprite = Sprite::create("test/egg.png");
m_eggSprite->setPosition(Vec2(-200, -200));
addChild(m_eggSprite);
}
生成一个蛋,不能在蛇身上,位置随机
void Snake::initEgg()
{
int x = rand() % KWidth;
int y = rand() % KHeight;
bool flag = false;
for(int i = 0; i < m_snake.size(); ++i)
{
if(x == m_snake[i].x && y == m_snake[i].y)
{
flag = true;
break;
}
}
if(flag)
{
initEgg();
}
else
{
m_egg.x = x;
m_egg.y = y;
m_eggSprite->setPosition(m_pos[x][y]);
}
}
开始操作蛇吃饭吧~ 4个方向按钮。。
写一个调度,每过一段时间更新一次蛇的状态,随着游戏推进,蛇的速度越来越快
void Snake::step(float dt)
{
//先取出蛇尾,便于吃到蛋后长大
TEgg lastSnake = m_snake[m_snake.size() - 1];
//后续的蛇身都挨个跟进
for(int i = (int)m_snake.size() - 1; i > 0; --i)
{
m_snake[i].x = m_snake[i - 1].x;
m_snake[i].y = m_snake[i - 1].y;
}
//判断方向,确定蛇头位置
if(m_curDir == EDirL)
{
m_snake[0].x--;
}
else if(m_curDir == EDirR)
{
m_snake[0].x++;
}
else if(m_curDir == EDirT)
{
m_snake[0].y++;
}
else if(m_curDir == EDirB)
{
m_snake[0].y--;
}
//判断是否撞墙
if(m_snake[0].x < 0 || m_snake[0].x > KWidth - 1 || m_snake[0].y < 0 || m_snake[0].y > KHeight - 1)
{
//gameover
unschedule(schedule_selector(Snake::step));
return;
}
//判断蛇头是否撞蛇身
for(int i = 1; i < m_snake.size(); ++i)
{
if(m_snake[0].x == m_snake[i].x && m_snake[0].y == m_snake[i].y)
{
//gameover
unschedule(schedule_selector(Snake::step));
return;
}
}
//判断是否吃到egg
if(m_snake[0].x == m_egg.x && m_snake[0].y == m_egg.y)
{
m_eggs.push_back(m_egg);
initEgg();//蛋被吃了,重新生成一个
//每吃一个蛋,蛇速度增大0.02f
m_dt -= 0.01f;
unschedule(schedule_selector(Snake::step));
schedule(schedule_selector(Snake::step), m_dt);
}
//判断是否蛇应该长大了
if(m_eggs.size() > 0 && m_eggs[0].x == lastSnake.x && m_eggs[0].y == lastSnake.y)
{
m_snake.push_back(m_eggs[0]);
m_eggs.erase(m_eggs.begin());
auto sprite = Sprite::create("test/egg.png");
sprite->setPosition(m_pos[lastSnake.x][lastSnake.y]);
addChild(sprite);
m_snakeSprite.push_back(sprite);
}
//修改eggsprite位置
for(int i = 0; i < m_snakeSprite.size(); ++i)
{
m_snakeSprite[i]->setPosition(m_pos[m_snake[i].x][m_snake[i].y]);
}
}
启动调度
schedule(schedule_selector(Snake::step), m_dt);
贪吃蛇~
规则:不能撞墙,不恩吃自己,吃一个蛋长大一点,速度变快
首先定义一个蛋
struct TEgg
{
int x;
int y;
};
蛇是由很多蛋连到一起组成
std::vector<TEgg> m_snake;//蛇
吃到的蛋是在到了尾巴处才能消化变成蛇,所以得记录下她吃了哪些蛋
std::vector<TEgg> m_eggs;//吃到的蛋
每次生成一个蛋给蛇吃
TEgg m_egg;
结构上欧了
开始搞个地图,蛇只能在固定区域肆无忌惮,
void Snake::initMap()
{
for(int i = 0; i < KWidth; ++i)
{
for(int j = 0; j < KHeight; ++j)
{
m_pos[i][j] = Vec2(118 + KEggSize / 2 + KEggSize * i, 70 + KEggSize / 2 + KEggSize * j);
}
}
}
初始化一个蛇,由三个蛋组成,蛇头位置(3, 5)
void Snake::initSnake()
{
m_snake.clear();
m_snakeSprite.clear();
int x = 3;
int y = 5;
for(int i = 0; i < 3; ++i)
{
TEgg egg;
egg.x = x - i;
egg.y = y;
m_snake.push_back(egg);
auto sprite = Sprite::create("test/egg.png");
sprite->setPosition(m_pos[egg.x][egg.y]);
addChild(sprite);
m_snakeSprite.push_back(sprite);
}
m_eggSprite = Sprite::create("test/egg.png");
m_eggSprite->setPosition(Vec2(-200, -200));
addChild(m_eggSprite);
}
生成一个蛋,不能在蛇身上,位置随机
void Snake::initEgg()
{
int x = rand() % KWidth;
int y = rand() % KHeight;
bool flag = false;
for(int i = 0; i < m_snake.size(); ++i)
{
if(x == m_snake[i].x && y == m_snake[i].y)
{
flag = true;
break;
}
}
if(flag)
{
initEgg();
}
else
{
m_egg.x = x;
m_egg.y = y;
m_eggSprite->setPosition(m_pos[x][y]);
}
}
开始操作蛇吃饭吧~ 4个方向按钮。。
写一个调度,每过一段时间更新一次蛇的状态,随着游戏推进,蛇的速度越来越快
void Snake::step(float dt)
{
//先取出蛇尾,便于吃到蛋后长大
TEgg lastSnake = m_snake[m_snake.size() - 1];
//后续的蛇身都挨个跟进
for(int i = (int)m_snake.size() - 1; i > 0; --i)
{
m_snake[i].x = m_snake[i - 1].x;
m_snake[i].y = m_snake[i - 1].y;
}
//判断方向,确定蛇头位置
if(m_curDir == EDirL)
{
m_snake[0].x--;
}
else if(m_curDir == EDirR)
{
m_snake[0].x++;
}
else if(m_curDir == EDirT)
{
m_snake[0].y++;
}
else if(m_curDir == EDirB)
{
m_snake[0].y--;
}
//判断是否撞墙
if(m_snake[0].x < 0 || m_snake[0].x > KWidth - 1 || m_snake[0].y < 0 || m_snake[0].y > KHeight - 1)
{
//gameover
unschedule(schedule_selector(Snake::step));
return;
}
//判断蛇头是否撞蛇身
for(int i = 1; i < m_snake.size(); ++i)
{
if(m_snake[0].x == m_snake[i].x && m_snake[0].y == m_snake[i].y)
{
//gameover
unschedule(schedule_selector(Snake::step));
return;
}
}
//判断是否吃到egg
if(m_snake[0].x == m_egg.x && m_snake[0].y == m_egg.y)
{
m_eggs.push_back(m_egg);
initEgg();//蛋被吃了,重新生成一个
//每吃一个蛋,蛇速度增大0.02f
m_dt -= 0.01f;
unschedule(schedule_selector(Snake::step));
schedule(schedule_selector(Snake::step), m_dt);
}
//判断是否蛇应该长大了
if(m_eggs.size() > 0 && m_eggs[0].x == lastSnake.x && m_eggs[0].y == lastSnake.y)
{
m_snake.push_back(m_eggs[0]);
m_eggs.erase(m_eggs.begin());
auto sprite = Sprite::create("test/egg.png");
sprite->setPosition(m_pos[lastSnake.x][lastSnake.y]);
addChild(sprite);
m_snakeSprite.push_back(sprite);
}
//修改eggsprite位置
for(int i = 0; i < m_snakeSprite.size(); ++i)
{
m_snakeSprite[i]->setPosition(m_pos[m_snake[i].x][m_snake[i].y]);
}
}
启动调度
schedule(schedule_selector(Snake::step), m_dt);
OK,现在开始尽情肆虐吧~
源码地址:http://download.csdn.net/detail/heyanru/8884461