1、准备游戏需要的背景图
2、先渲染一个30x20x图片尺寸的游戏背景。
#include<SFML/Graphics.hpp>
#include<time.h>
using namespace sf;
int N = 30;
int M = 20;
int size = 16;
int w = N * size;
int h = M * size;
int main()
{
RenderWindow window(VideoMode(w, h), "Snake Game!");
Texture t1, t2;
t1.loadFromFile("./Resources/images/white.png");
t2.loadFromFile("./Resources/images/red.png");
Sprite sprite1(t1);
Sprite sprite2(t2);
while (window.isOpen())
{
Event e;
while (window.pollEvent(e))
{
if (e.type == Event::Closed)
{
window.close();
}
}
window.clear();
for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; j++)
{
sprite1.setPosition(i * size, j * size);
window.draw(sprite1);
}
}
window.display();
}
return 0;
}
3、定义蛇
int dir;
int num = 4;
struct Snake
{
int x;
int y;
} s[100];
void Tick()
{
for (int i = num; i > 0; --i)
{
s[i].x = s[i - 1].x;
s[i].y = s[i - 1].y;
}
if (dir == 0)
{
s[0].y += 1;
}
if (dir == 1)
{
s[0].x -= 1;
}
if (dir == 2)
{
s[0].x += 1;
}
if (dir == 3)
{
s[0].y -= 1;
}
}
4、增加按键事件
if (Keyboard::isKeyPressed(Keyboard::Left))
{
dir = 1;
}
if (Keyboard::isKeyPressed(Keyboard::Right))
{
dir = 2;
}
if (Keyboard::isKeyPressed(Keyboard::Up))
{
dir = 3;
}
if (Keyboard::isKeyPressed(Keyboard::Down))
{
dir = 0;
}
5、设置边界循环和边界截断
if (s[0].x > N)
{
s[0].x = 0;
}
if (s[0].x < 0)
{
s[0].x = N;
}
if (s[0].y > M)
{
s[0].y = 0;
}
if (s[0].y < 0)
{
s[0].y = M;
}
for (int i = 1; i < num; i++)
{
if (s[0].x == s[i].x && s[0].y == s[i].y)
{
num = i;
}
}
6、完善时间延迟
#include<SFML/Graphics.hpp>
#include<time.h>
using namespace sf;
int N = 30;
int M = 20;
int size = 16;
int w = N * size;
int h = M * size;
int dir;
int num = 4;
struct Snake
{
int x;
int y;
} s[100];
struct Fruct
{
int x;
int y;
} f;
void Tick()
{
for (int i = num; i > 0; --i)
{
s[i].x = s[i - 1].x;
s[i].y = s[i - 1].y;
}
if (dir == 0)
{
s[0].y += 1;
}
if (dir == 1)
{
s[0].x -= 1;
}
if (dir == 2)
{
s[0].x += 1;
}
if (dir == 3)
{
s[0].y -= 1;
}
if ((s[0].x == f.x) && (s[0].y == f.y))
{
num++;
f.x = rand() % N;
f.y = rand() % M;
}
if (s[0].x > N)
{
s[0].x = 0;
}
if (s[0].x < 0)
{
s[0].x = N;
}
if (s[0].y > M)
{
s[0].y = 0;
}
if (s[0].y < 0)
{
s[0].y = M;
}
for (int i = 1; i < num; i++)
{
if (s[0].x == s[i].x && s[0].y == s[i].y)
{
num = i;
}
}
}
int main()
{
srand(time(0));
RenderWindow window(VideoMode(w, h), "Snake Game!");
Texture t1, t2;
t1.loadFromFile("./Resources/images/white.png");
t2.loadFromFile("./Resources/images/red.png");
Sprite sprite1(t1);
Sprite sprite2(t2);
Clock clock;
float timer = 0;
float delay = 0.1;
f.x = 10;
f.y = 10;
while (window.isOpen())
{
float time = clock.getElapsedTime().asSeconds();
clock.restart();
timer += time;
Event e;
while (window.pollEvent(e))
{
if (e.type == Event::Closed)
{
window.close();
}
}
if (timer > delay)
{
timer = 0;
Tick();
}
if (Keyboard::isKeyPressed(Keyboard::Left))
{
dir = 1;
}
if (Keyboard::isKeyPressed(Keyboard::Right))
{
dir = 2;
}
if (Keyboard::isKeyPressed(Keyboard::Up))
{
dir = 3;
}
if (Keyboard::isKeyPressed(Keyboard::Down))
{
dir = 0;
}
window.clear();
for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; j++)
{
sprite1.setPosition(i * size, j * size);
window.draw(sprite1);
}
}
for (int i = 0; i < num; i++)
{
sprite2.setPosition(s[i].x * size, s[i].y * size);
window.draw(sprite2);
}
sprite2.setPosition(f.x * size, f.y * size);
window.draw(sprite2);
window.display();
}
return 0;
}
结果图: