From 94abee7e6127ad61c2d77ab87addb1ad58f96915 Mon Sep 17 00:00:00 2001 From: TriantaTV <56975502+TriantaTV@users.noreply.github.com> Date: Tue, 26 Jul 2022 16:56:26 -0500 Subject: [PATCH 1/3] Added ability to get snake head position Added ability to get snake head position and created a snake constructor with a position. --- src/Snake.cpp | 15 ++++++++++++++- src/Snake.h | 4 +++- src/main.cpp | 4 ++-- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/Snake.cpp b/src/Snake.cpp index fb5821e..240f2b9 100644 --- a/src/Snake.cpp +++ b/src/Snake.cpp @@ -2,7 +2,6 @@ #include #include #include "Snake.h" -using namespace std; // Test for collision between two objects bool SnakeCollision(sf::RectangleShape object1, sf::RectangleShape object2) @@ -49,11 +48,25 @@ void Snake::MoveSnake() return; } +// Get x and y position of snake head +sf::Vector2f Snake::GetHeadPosition() +{ + sf::Vector2f position; + position = snakeBody.front().getPosition(); + return position; +} + Snake::Snake() { // Possibly unnecessary // The big 3 could be used to create a fresh game state return; } +Snake::Snake(sf::Vector2f head) +{ + sf::RectangleShape newBodyPart(head); + snakeBody.push_back(newBodyPart); + return; +} // SnakeNode::SnakeNode(); // SnakeNode::SnakeNode(sf::Vector2f addBodyPiece); diff --git a/src/Snake.h b/src/Snake.h index 8bf2632..4114bb7 100644 --- a/src/Snake.h +++ b/src/Snake.h @@ -21,10 +21,12 @@ class Snake { private: std::deque snakeBody; - Snake(); public: + Snake(); + Snake(sf::Vector2f head); // Instead of popping like in MoveSnake() // Simply add to deque + sf::Vector2f GetHeadPosition(); void ExtendSnake(); void MoveSnake(); // Move only head body piece }; diff --git a/src/main.cpp b/src/main.cpp index 12f7310..4345856 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2,7 +2,6 @@ #include #include #include "Snake.h" -using namespace std; /* @@ -26,6 +25,7 @@ int main() sf::RenderWindow window(sf::VideoMode(videoSizeHorizontal, videoSizeVertical), "SnakePlusPlus"); sf::Time delay = sf::milliseconds(100); + Snake Player(sf::Vector2f(25,25)); sf::RectangleShape snakeHead(sf::Vector2f(25,25)); sf::RectangleShape snakeFood(sf::Vector2f(25,25)); snakeHead.setFillColor(sf::Color::Green); @@ -41,7 +41,7 @@ int main() if ((event.type == sf::Event::Closed) || (sf::Keyboard::isKeyPressed(sf::Keyboard::Escape))) window.close(); } - sf::Vector2f snakeHeadPosition = snakeHead.getPosition(); + sf::Vector2f snakeHeadPosition = Player.GetHeadPosition(); sf::Vector2f snakeFoodPosition = snakeFood.getPosition(); // TODO: Split Movement into separate function // Add boundaries From a8eee1db4d8b12a38e7d414f2db5871409f904ae Mon Sep 17 00:00:00 2001 From: TriantaTV <56975502+TriantaTV@users.noreply.github.com> Date: Tue, 26 Jul 2022 19:03:55 -0500 Subject: [PATCH 2/3] Changed movement to control the Player object Changed movement to control the Player object. Movement not currently working, actively being looked into. --- src/Snake.cpp | 65 ++++++++++++++++++++++++++++++++++++++++----------- src/Snake.h | 9 ++++--- src/main.cpp | 35 +++++++++++++++------------ 3 files changed, 77 insertions(+), 32 deletions(-) diff --git a/src/Snake.cpp b/src/Snake.cpp index 240f2b9..f45f17c 100644 --- a/src/Snake.cpp +++ b/src/Snake.cpp @@ -20,19 +20,34 @@ bool SnakeCollision(sf::RectangleShape object1, sf::RectangleShape object2) } // Move snake head piece -void SnakeMovement(sf::Keyboard keyboard) +int SnakeMovement() { - /* - if (keyboard.pressed(Left)) - snakeHead.moveleft(); - if (keyboard.pressed(Right)) - snakeHead.moveRight(); - if (keyboard.pressed(Down)) - snakeHead.moveDown(); - if (keyboard.pressed(Up)) - snakeHead.moveUp(); - */ - return; + std::cout << "Test text \n"; + int snakeDirection = 0; + if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left)) + snakeDirection = 1; + if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up)) + snakeDirection = 2; + if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down)) + snakeDirection = 3; + if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right)) + snakeDirection = 4; + return snakeDirection; +} + +sf::Vector2f CalculateNewPosition(int direction, sf::Vector2f position) +{ + if (direction == 0) + return position; + if (direction == 1) + position.x -= 25; + if (direction == 2) + position.y -= 25; + if (direction == 3) + position.y += 25; + if (direction == 4) + position.x += 25; + return position; } void Snake::ExtendSnake() @@ -41,21 +56,43 @@ void Snake::ExtendSnake() return; } -void Snake::MoveSnake() +void Snake::MoveSnake(int snakeDirection) { // Create a new deque RectangleShape and pop old // Todo: Depreciate ExtendSnake and just add a collision test + sf::Vector2f newHeadPosition; + newHeadPosition = GetSnakeHeadPosition(); + newHeadPosition = CalculateNewPosition(snakeDirection, newHeadPosition); + sf::RectangleShape newBodyPart(newHeadPosition); + snakeBody.push_back(newBodyPart); + // snakeBody.pop_front(); return; } // Get x and y position of snake head -sf::Vector2f Snake::GetHeadPosition() +sf::Vector2f Snake::GetSnakeHeadPosition() { sf::Vector2f position; position = snakeBody.front().getPosition(); return position; } +sf::RectangleShape Snake::GetSnakeHead() +{ + sf::RectangleShape head; + head = snakeBody.front(); + return head; +} + +void Snake::DisplaySnake(sf::RenderWindow& window) +{ + for (auto it = snakeBody.cbegin(); it != snakeBody.cend(); ++it) + { + window.draw(*it); + } + return; +} + Snake::Snake() { // Possibly unnecessary diff --git a/src/Snake.h b/src/Snake.h index 4114bb7..8e373af 100644 --- a/src/Snake.h +++ b/src/Snake.h @@ -4,7 +4,8 @@ #include bool SnakeCollision(sf::RectangleShape object1, sf::RectangleShape object2); -void SnakeMovement(sf::Keyboard keyboard); +int SnakeMovement(); +sf::Vector2f CalculateNewPosition(int direction, sf::Vector2f position); // class SnakeNode // { @@ -26,9 +27,11 @@ public: Snake(sf::Vector2f head); // Instead of popping like in MoveSnake() // Simply add to deque - sf::Vector2f GetHeadPosition(); + sf::Vector2f GetSnakeHeadPosition(); + sf::RectangleShape GetSnakeHead(); + void DisplaySnake(sf::RenderWindow& window); void ExtendSnake(); - void MoveSnake(); // Move only head body piece + void MoveSnake(int snakeDirection); // Move only head body piece }; diff --git a/src/main.cpp b/src/main.cpp index 4345856..fd61fe3 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -22,13 +22,18 @@ int main() int videoSizeHorizontal, videoSizeVertical; videoSizeHorizontal = 1024; videoSizeVertical = 725; + /* + gameGridHorizontal = (videoSizeHorizontal // 25) * 25; + gameGridVertical = (videoSizeVertical // 25) * 25; + */ sf::RenderWindow window(sf::VideoMode(videoSizeHorizontal, videoSizeVertical), "SnakePlusPlus"); sf::Time delay = sf::milliseconds(100); + int snakeDirection = 0; Snake Player(sf::Vector2f(25,25)); sf::RectangleShape snakeHead(sf::Vector2f(25,25)); sf::RectangleShape snakeFood(sf::Vector2f(25,25)); - snakeHead.setFillColor(sf::Color::Green); + // snakeHead.setFillColor(sf::Color::Green); snakeFood.setFillColor(sf::Color::Red); snakeFood.setPosition(25,25); @@ -41,30 +46,30 @@ int main() if ((event.type == sf::Event::Closed) || (sf::Keyboard::isKeyPressed(sf::Keyboard::Escape))) window.close(); } - sf::Vector2f snakeHeadPosition = Player.GetHeadPosition(); + sf::Vector2f snakeHeadPosition = Player.GetSnakeHeadPosition(); sf::Vector2f snakeFoodPosition = snakeFood.getPosition(); // TODO: Split Movement into separate function // Add boundaries // Add movement until boundaries if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left)) - snakeHeadPosition.x -= 25; + snakeDirection = 1; if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up)) - snakeHeadPosition.y -= 25; + snakeDirection = 2; if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down)) - snakeHeadPosition.y += 25; + snakeDirection = 3; if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right)) - snakeHeadPosition.x += 25; - snakeHead.setPosition(snakeHeadPosition.x, snakeHeadPosition.y); - if (SnakeCollision(snakeHead, snakeFood)) - { - snakeFoodPosition.x += 25; - snakeFoodPosition.y += 25; - snakeFood.setPosition(snakeFoodPosition.x, snakeFoodPosition.y); - } + snakeDirection = 4; + Player.MoveSnake(snakeDirection); + // if (SnakeCollision(snakeHead, snakeFood)) + // { + // snakeFoodPosition.x += 25; + // snakeFoodPosition.y += 25; + // snakeFood.setPosition(snakeFoodPosition.x, snakeFoodPosition.y); window.clear(); window.draw(snakeFood); - window.draw(snakeHead); + + Player.DisplaySnake(window); window.display(); - sf::sleep(delay); + // sf::sleep(delay); } } From 97085dd314b5bddad10173740bad6a8e4e789bc0 Mon Sep 17 00:00:00 2001 From: TriantaTV <56975502+TriantaTV@users.noreply.github.com> Date: Tue, 26 Jul 2022 19:24:46 -0500 Subject: [PATCH 3/3] Fixed movement and color of snake --- src/Snake.cpp | 6 ++++-- src/main.cpp | 7 +++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/Snake.cpp b/src/Snake.cpp index f45f17c..612deb7 100644 --- a/src/Snake.cpp +++ b/src/Snake.cpp @@ -63,9 +63,10 @@ void Snake::MoveSnake(int snakeDirection) sf::Vector2f newHeadPosition; newHeadPosition = GetSnakeHeadPosition(); newHeadPosition = CalculateNewPosition(snakeDirection, newHeadPosition); - sf::RectangleShape newBodyPart(newHeadPosition); + sf::RectangleShape newBodyPart(sf::Vector2f(25,25)); + newBodyPart.setPosition(newHeadPosition); snakeBody.push_back(newBodyPart); - // snakeBody.pop_front(); + snakeBody.pop_front(); return; } @@ -102,6 +103,7 @@ Snake::Snake() Snake::Snake(sf::Vector2f head) { sf::RectangleShape newBodyPart(head); + newBodyPart.setFillColor(sf::Color::Green); snakeBody.push_back(newBodyPart); return; } diff --git a/src/main.cpp b/src/main.cpp index fd61fe3..2799948 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -27,7 +27,7 @@ int main() gameGridVertical = (videoSizeVertical // 25) * 25; */ sf::RenderWindow window(sf::VideoMode(videoSizeHorizontal, videoSizeVertical), "SnakePlusPlus"); - sf::Time delay = sf::milliseconds(100); + sf::Time delay = sf::milliseconds(5); int snakeDirection = 0; Snake Player(sf::Vector2f(25,25)); @@ -46,7 +46,7 @@ int main() if ((event.type == sf::Event::Closed) || (sf::Keyboard::isKeyPressed(sf::Keyboard::Escape))) window.close(); } - sf::Vector2f snakeHeadPosition = Player.GetSnakeHeadPosition(); + // sf::Vector2f snakeHeadPosition = Player.GetSnakeHeadPosition(); sf::Vector2f snakeFoodPosition = snakeFood.getPosition(); // TODO: Split Movement into separate function // Add boundaries @@ -67,9 +67,8 @@ int main() // snakeFood.setPosition(snakeFoodPosition.x, snakeFoodPosition.y); window.clear(); window.draw(snakeFood); - Player.DisplaySnake(window); window.display(); - // sf::sleep(delay); + sf::sleep(delay); } }