Witam,
Zacznę od tego, że szukałem i czytałem wiele wątków dotyczących tego problemu i mimo to, drugi dzień już męczę się z tym problemem. Mianowicie ogon węża nie podąża za głową. Tzn. częściowo udało mi się to osiągnąć, ale nie działa to, jak należy.
Czy ktoś może mi to wyjaśnić łopatologicznie ?
#include <SFML\Graphics.hpp>
using namespace sf;
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
void respawnFood(RectangleShape& food)
{
float foodSize = 20;
food.setFillColor(Color::Red);
food.setSize({ foodSize, foodSize });
food.setPosition(rand() % 640, rand() % 480);
}
bool isColliding(RectangleShape& snake, RectangleShape& food)
{
if (snake.getGlobalBounds().intersects(food.getGlobalBounds()))
return true;
return false;
}
int main()
{
RenderWindow window(VideoMode(SCREEN_WIDTH, SCREEN_HEIGHT), "SFML");
// MISC
srand( time (NULL ) );
Clock clock;
Time time;
// SNAKE
enum SnakeDirection { LEFT, RIGHT, UP, DOWN, NONE };
SnakeDirection currentDirection = NONE;
RectangleShape snakeHead;
float snakeSize = 20;
float snakeSpeed = 200.f;
snakeHead.setFillColor(Color::Green);
snakeHead.setSize({ snakeSize, snakeSize });
snakeHead.setPosition(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2);
std::vector<RectangleShape> snakeBody;
// FOOD
RectangleShape food;
respawnFood(food);
// MAIN LOOP
clock.restart();
while (window.isOpen())
{
time = clock.getElapsedTime();
// HANDLE INPUT
Event ev;
while (window.pollEvent(ev))
{
if (ev.type == Event::Closed || ev.type == Event::KeyPressed && ev.key.code == Keyboard::Escape)
window.close();
}
if ((Keyboard::isKeyPressed(Keyboard::D) || Keyboard::isKeyPressed(Keyboard::Right)) && currentDirection != LEFT)
currentDirection = RIGHT;
if ((Keyboard::isKeyPressed(Keyboard::A) || Keyboard::isKeyPressed(Keyboard::Left)) && currentDirection != RIGHT)
currentDirection = LEFT;
if ((Keyboard::isKeyPressed(Keyboard::W) || Keyboard::isKeyPressed(Keyboard::Up)) && currentDirection != DOWN)
currentDirection = UP;
if ((Keyboard::isKeyPressed(Keyboard::S) || Keyboard::isKeyPressed(Keyboard::Down)) && currentDirection != UP)
currentDirection = DOWN;
// UPDATE
if (currentDirection == RIGHT)
snakeHead.move(time.asSeconds() * snakeSpeed, 0);
if (currentDirection == LEFT)
snakeHead.move(-time.asSeconds() * snakeSpeed, 0);
if (currentDirection == UP)
snakeHead.move(0, -time.asSeconds() * snakeSpeed);
if (currentDirection == DOWN)
snakeHead.move(0, time.asSeconds() * snakeSpeed);
// collision check
if (isColliding(snakeHead, food))
{
snakeBody.push_back(snakeHead);
printf("%i\n", snakeBody.size());
respawnFood(food);
}
for (int i = 1; i < snakeBody.size(); i++)
{
snakeBody[0].setPosition(snakeHead.getPosition());
if(currentDirection == RIGHT)
snakeBody[i].setPosition(snakeBody[i - 1].getPosition().x - snakeSize - 3, snakeBody[i - 1].getPosition().y);
if (currentDirection == LEFT)
snakeBody[i].setPosition(snakeBody[i - 1].getPosition().x + snakeSize + 3, snakeBody[i - 1].getPosition().y);
if (currentDirection == UP)
snakeBody[i].setPosition(snakeBody[i - 1].getPosition().x, snakeBody[i - 1].getPosition().y - snakeSize - 3);
if (currentDirection == DOWN)
snakeBody[i].setPosition(snakeBody[i - 1].getPosition().x, snakeBody[i - 1].getPosition().y + snakeSize + 3);
}
clock.restart();
// END OF UPDATE
// RENDER
window.clear(Color::Black);
window.draw(snakeHead);
window.draw(food);
for (int i = 0; i < snakeBody.size(); i++)
{
window.draw(snakeBody[i]);
}
window.display();
}
return EXIT_SUCCESS;
}