-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSnake.cpp
More file actions
126 lines (105 loc) · 3.91 KB
/
Snake.cpp
File metadata and controls
126 lines (105 loc) · 3.91 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#include "Snake.h"
#include "Game.h"
namespace SnakeGame
{
void IniteSnake(Snake& snake, const Game& game)
{
snake.segments.clear();
snake.direction = SnakeDirection::Right;
while (!snake.directionQueue.empty())
{
snake.directionQueue.pop();
}
snake.directionQueue.push(SnakeDirection::Right);
snake.moveTimer = 0.f;
snake.moveDelay = 0.1f;
// Create Head
SnakeSegments head;
head.gridX = GRID_WIDTH / 2;
head.gridY = GRID_HEIGHT / 2;
head.sprite.setTexture(game.textureHead);
SetSpriteSize(head.sprite, SIZE_ITEM, SIZE_ITEM);
SetSpriteRelativeOrigin(head.sprite, 0.5f, 0.5f);
snake.segments.push_back(head);
// Create body segments
for (int i = 0; i < 2; i++)
{
SnakeSegments body;
body.gridX = head.gridX - (i + 1);
body.gridY = head.gridY;
body.sprite.setTexture(game.textureBody);
SetSpriteSize(body.sprite, SIZE_ITEM, SIZE_ITEM);
SetSpriteRelativeOrigin(body.sprite, 0.5f, 0.5f);
snake.segments.push_back(body);
}
}
void UpdateSnake(Snake& snake, float deltatime)
{
if (snake.segments.empty()) return;
snake.moveTimer += deltatime;
if (snake.moveTimer < snake.moveDelay) return;
snake.moveTimer = 0.f;
if (!snake.directionQueue.empty())
{
snake.direction = snake.directionQueue.front();
snake.directionQueue.pop();
}
// save old position
std::vector<std::pair<int, int>> oldPositions;
for (const auto& segment : snake.segments)
{
oldPositions.push_back({ segment.gridX, segment.gridY });
}
// move head
switch (snake.direction)
{
case SnakeDirection::Right: snake.segments[0].gridX++; break;
case SnakeDirection::Left: snake.segments[0].gridX--; break;
case SnakeDirection::Up: snake.segments[0].gridY--; break;
case SnakeDirection::Down: snake.segments[0].gridY++; break;
}
//move body
for (size_t i = 1; i < snake.segments.size(); i++)
{
snake.segments[i].gridX = oldPositions[i - 1].first;
snake.segments[i].gridY = oldPositions[i - 1].second;
}
}
void DrawSnake(Snake& snake, sf::RenderWindow& window)
{
for (size_t i = 0; i < snake.segments.size(); i++)
{
float pixelX = snake.segments[i].gridX * SIZE_ITEM + SIZE_ITEM / 2;
float pixelY = snake.segments[i].gridY * SIZE_ITEM + SIZE_ITEM / 2;
if (i == 0)
{
switch (snake.direction)
{
case SnakeDirection::Up: snake.segments[i].sprite.setRotation(-90.f); break;
case SnakeDirection::Right: snake.segments[i].sprite.setRotation(0.f); break;
case SnakeDirection::Down: snake.segments[i].sprite.setRotation(90.f); break;
case SnakeDirection::Left: snake.segments[i].sprite.setRotation(180.f); break;
}
}
else
{
snake.segments[i].sprite.setRotation(0.f);
}
snake.segments[i].sprite.setPosition(pixelX, pixelY);
window.draw(snake.segments[i].sprite);
}
}
void GrowSnake(Snake& snake, const Game& game)
{
if (snake.segments.empty()) return;
// new segment
SnakeSegments newSegment;
SnakeSegments& tail = snake.segments.back();
newSegment.gridX = tail.gridX;
newSegment.gridY = tail.gridY;
newSegment.sprite.setTexture(game.textureBody);
SetSpriteSize(newSegment.sprite, SIZE_ITEM, SIZE_ITEM);
SetSpriteRelativeOrigin(newSegment.sprite, 0.5f, 0.5f);
snake.segments.push_back(newSegment);
}
}