115 lines
3.7 KiB
C++
115 lines
3.7 KiB
C++
#include "game.h"
|
|
|
|
#define DELAY 30000
|
|
|
|
Game::Game()
|
|
: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;
|
|
exit(1);
|
|
}
|
|
|
|
// Create a text object for displaying speed
|
|
speedText.setFont(font);
|
|
|
|
// Create a map text object and set its properties
|
|
mapText.setFont(font);
|
|
mapText.setCharacterSize(24);
|
|
mapText.setFillColor(sf::Color::White);
|
|
mapText.setPosition(10, 10);
|
|
|
|
racecar.setPosition(1000, 80); // Set initial position for the racecar
|
|
racecar.setRotation(180);
|
|
}
|
|
|
|
void Game::run() {
|
|
sf::Clock clock;
|
|
|
|
// Create a view that will follow the racecar
|
|
sf::View view(sf::FloatRect(0, 0, max_x, max_y));
|
|
view.setCenter(racecar.getX(), racecar.getY()); // Center the view on the racecar
|
|
window.setView(view);
|
|
|
|
while (window.isOpen()) {
|
|
float dt = clock.restart().asSeconds();
|
|
|
|
sf::Event event;
|
|
while (window.pollEvent(event)) {
|
|
if (event.type == sf::Event::Closed) {
|
|
window.close();
|
|
}
|
|
}
|
|
|
|
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up)) {
|
|
if (racecar.getSpeed() < 0) {
|
|
racecar.brake(dt); // Apply brakes
|
|
} else {
|
|
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 {
|
|
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
|
|
}
|
|
|
|
|
|
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left)) {
|
|
racecar.steer(dt, -1.0f); // Steer left
|
|
} else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right)) {
|
|
racecar.steer(dt, 1.0f); // Steer right
|
|
}
|
|
|
|
racecar.update(dt);
|
|
|
|
speedText.setString(std::to_string(static_cast<int>(racecar.getSpeed())) + " km/h");
|
|
speedText.setCharacterSize(24);
|
|
speedText.setFillColor(sf::Color::Green);
|
|
speedText.setPosition(racecar.getX() - 475, racecar.getY() + 350);
|
|
if(racecar.getSpeed() < 0){
|
|
speedText.setFillColor(sf::Color::Blue);
|
|
}
|
|
if(racecar.getSpeed() >= 250){
|
|
speedText.setCharacterSize(27);
|
|
speedText.setFillColor(sf::Color::Yellow);
|
|
}
|
|
if(racecar.getSpeed() >= 360){
|
|
speedText.setCharacterSize(30);
|
|
speedText.setFillColor(sf::Color::Red);
|
|
}
|
|
|
|
// Update the view to follow the racecar
|
|
view.setCenter(racecar.getX(), racecar.getY());
|
|
window.setView(view);
|
|
|
|
window.clear();
|
|
mapText.setString(asciiMap);
|
|
window.draw(mapText);
|
|
window.draw(racecar.getDrawable());
|
|
window.draw(speedText);
|
|
window.display();
|
|
|
|
sf::sleep(sf::microseconds(DELAY));
|
|
}
|
|
}
|
|
|
|
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 == '-');
|
|
}
|