From 111446f8ac535d9724bca190329c7eecfe343ac0 Mon Sep 17 00:00:00 2001 From: thatscringebro Date: Tue, 10 Oct 2023 17:01:55 -0400 Subject: [PATCH] started collissions --- game.cpp | 25 ++++++++++++++++++++----- game.h | 1 + racecar.cpp | 10 +++++++++- racecar.h | 2 ++ terminal_racer | Bin 59352 -> 59496 bytes 5 files changed, 32 insertions(+), 6 deletions(-) diff --git a/game.cpp b/game.cpp index 667bb24..4df2d0e 100644 --- a/game.cpp +++ b/game.cpp @@ -3,7 +3,7 @@ #define DELAY 30000 Game::Game() - :max_x(1000), max_y(800), direction(0), window(sf::VideoMode(max_x, max_y), "SFML Window"), + :max_x(1000), max_y(800), direction(0), window(sf::VideoMode(max_x, max_y), "ASCII RACER"), racecar(400.0f, 30.0f, 1.7f) { // maxSpeed, acceleration, and steerSpeed values if (!font.loadFromFile("cascaydia.otf")) { std::cerr << "Failed to load font" << std::endl; @@ -19,7 +19,8 @@ Game::Game() mapText.setFillColor(sf::Color::White); mapText.setPosition(10, 10); - racecar.setPosition(max_x / 2, max_y / 2); // Set initial position for the racecar + racecar.setPosition(1000, 80); // Set initial position for the racecar + racecar.setRotation(180); } void Game::run() { @@ -44,13 +45,23 @@ void Game::run() { if (racecar.getSpeed() < 0) { racecar.brake(dt); // Apply brakes } else { - racecar.accelerate(dt); // Reverse the car + if(!isTrackCollision(racecar.getX(), racecar.getY())) { + racecar.accelerate(dt); // accelerate the car + } + else { + racecar.stop(); + } } } else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down)) { if (racecar.getSpeed() > 0) { racecar.brake(dt); // Apply brakes } else { - racecar.reverse(dt); // Reverse the car + if(!isTrackCollision(racecar.getX(), racecar.getY())) { + racecar.reverse(dt); // Reverse the car + } + else { + racecar.stop(); + } } } else { racecar.decelerate(dt); // No key pressed, decelerate as usual @@ -80,7 +91,6 @@ void Game::run() { speedText.setCharacterSize(30); speedText.setFillColor(sf::Color::Red); } - // Update the view to follow the racecar view.setCenter(racecar.getX(), racecar.getY()); @@ -97,3 +107,8 @@ void Game::run() { } } +bool Game::isTrackCollision(float x, float y) { + // Check if the racecar's position collides with the track + char trackChar = asciiMap[x]; + return (trackChar == '/' || trackChar == '\\' || trackChar == '|' || trackChar == '_' || trackChar == '-'); +} diff --git a/game.h b/game.h index 5a83dd9..1384e47 100644 --- a/game.h +++ b/game.h @@ -9,6 +9,7 @@ class Game { public: Game(); void run(); + bool isTrackCollision(float x, float y); private: int max_x; diff --git a/racecar.cpp b/racecar.cpp index 79c5f57..07a4091 100644 --- a/racecar.cpp +++ b/racecar.cpp @@ -1,7 +1,7 @@ #include "racecar.h" Racecar::Racecar(float maxSpeed, float acceleration, float steerSpeed) - : maxSpeed(maxSpeed), acceleration(acceleration), steerSpeed(steerSpeed), dx(0), dy(0), steeringAngle(0) { + : maxSpeed(maxSpeed), acceleration(acceleration), steerSpeed(steerSpeed), dx(0), dy(0), steeringAngle(3.13) { if (!font.loadFromFile("cascaydia.otf")) { std::cerr << "Failed to load font" << std::endl; exit(1); @@ -52,6 +52,10 @@ void Racecar::brake(float dt) { } } +void Racecar::stop() { + speed = 0; +} + void Racecar::reverse(float dt) { if (speed > -maxSpeed / 2) { speed -= 1.5 * acceleration * dt; @@ -66,6 +70,10 @@ void Racecar::setPosition(float x, float y) { carText.setPosition(x, y); } +void Racecar::setRotation(float value) { + carText.setRotation(value); +} + float Racecar::getSpeed() const { return speed; } diff --git a/racecar.h b/racecar.h index 740a281..0ce9530 100644 --- a/racecar.h +++ b/racecar.h @@ -12,10 +12,12 @@ public: void accelerate(float dt); void decelerate(float dt); void brake(float dt); // Brake the car + void stop(); void reverse(float dt); // Reverse the car void steer(float dt, float direction); // -1 for left, 1 for right sf::Text getDrawable(); void setPosition(float x, float y); + void setRotation(float value); float getSpeed() const; // Get the current speed of the car float getX() const; float getY() const; diff --git a/terminal_racer b/terminal_racer index 2f2e9ebc0a4dc8926fd389ada09d0457d421bf44..f10a1873a93ad5f3360095cca3ea3497377cfb3c 100755 GIT binary patch delta 11137 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 I|K-sC2QMc1cmMzZ delta 10195 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