Untitled

mail@pastecode.io avatar
unknown
plain_text
14 days ago
5.5 kB
2
Indexable
Never
#include "Game.h"
#include <cstdlib>
#include <ctime>

Game::Game() : window(sf::VideoMode(360, 480), "The Game!"), dx(0), rotate(false), timer(0), delay(0.3), gameOver(false) {
    srand(time(0));

    t1.loadFromFile("images/tiles.png");
    t2.loadFromFile("images/background.png");
    t3.loadFromFile("images/frame.png");

    s.setTexture(t1);
    background.setTexture(t2);
    frame.setTexture(t3);

    font.loadFromFile("Arial.ttf");

    scoreText.setFont(font);
    highScoreText.setFont(font);
    gameOverText.setFont(font);
    playAgainText.setFont(font);
    nextText.setFont(font);

    scoreText.setFillColor(sf::Color::Cyan);
    highScoreText.setFillColor(sf::Color::Cyan);
    gameOverText.setFillColor(sf::Color::Red);
    playAgainText.setFillColor(sf::Color::Blue);
    nextText.setFillColor(sf::Color::Black);

    scoreText.setCharacterSize(20);
    highScoreText.setCharacterSize(20);
    gameOverText.setCharacterSize(30);
    playAgainText.setCharacterSize(20);
    nextText.setCharacterSize(20);

    scoreText.setPosition(250, 20);
    highScoreText.setPosition(250, 50);
    gameOverText.setPosition(40, 220);
    playAgainText.setPosition(70, 260);
    nextText.setPosition(270, 375);

    nextFrame.setSize(sf::Vector2f(75, 75));
    nextFrame.setFillColor(sf::Color::Transparent);
    nextFrame.setOutlineThickness(2);
    nextFrame.setOutlineColor(sf::Color::Black);
    nextFrame.setPosition(255, 285);

    for (int i = 0; i < 23; ++i) {
        for (int j = 0; j < 10; ++j) {
            gridLines[i * 10 + j].setSize(sf::Vector2f(17, 17));
            gridLines[i * 10 + j].setFillColor(sf::Color::Transparent);
            gridLines[i * 10 + j].setOutlineThickness(1);
            gridLines[i * 10 + j].setOutlineColor(sf::Color::Black);
            gridLines[i * 10 + j].setPosition(j * 18, i * 18);
            gridLines[i * 10 + j].move(36, 18 * 3);
        }
    }

    resetGame();
}

void Game::resetGame() {
    field.clear();
    score.reset();
    current.reset(rand() % 7, rand() % 9);
    next.reset(rand() % 7, 0);
    gameOver = false;
    timer = 0;
    delay = 0.3;
}

void Game::run() {
    sf::Clock clock;
    while (window.isOpen()) {
        float time = clock.getElapsedTime().asSeconds();
        clock.restart();
        timer += time;

        processEvents();
        if (!gameOver) {
            update(time);
        }
        render();
    }
}

void Game::processEvents() {
    sf::Event event;
    while (window.pollEvent(event)) {
        if (event.type == sf::Event::Closed)
            window.close();

        if (gameOver) {
            if (event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Space) {
                resetGame();
            }
            continue;
        }

        if (event.type == sf::Event::KeyPressed) {
            if (event.key.code == sf::Keyboard::Up)
                rotate = true;
            else if (event.key.code == sf::Keyboard::Left)
                dx = -1;
            else if (event.key.code == sf::Keyboard::Right)
                dx =1;
        }
    }

    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down))
        delay = 0.05;
}

void Game::update(float time) {
    for (int i = 0; i < 4; i++) {
        current.a[i].x += dx;
    }
    if (!current.checkCollision(field.getField(), 23, 10)) {
        for (int i = 0; i < 4; i++) {
            current.a[i].x -= dx;
        }
    }

    if (rotate) {
        current.rotate();
        if (!current.checkCollision(field.getField(), 23, 10)) {
            current.rotate();
            current.rotate();
            current.rotate();
        }
    }

    if (timer > delay) {
        for (int i = 0; i < 4; i++) {
            current.a[i].y += 1;
        }

        if (!current.checkCollision(field.getField(), 23, 10)) {
            for (int i = 0; i < 4; i++) {
                current.a[i].y -= 1;
                field.getField()[current.a[i].y][current.a[i].x] = current.colorNum;
            }

            current = next;
            next.reset(rand() % 7, 0);

            if (!current.checkCollision(field.getField(), 23, 10)) {
                gameOver = true;
            }

            int lines = 0;
            field.checkLines(lines);
            score.updateScore(lines);

            delay = 0.3;
        }

        timer = 0;
    }

    dx = 0;
    rotate = false;
}

void Game::render() {
    window.clear(sf::Color::White);
    window.draw(background);

    for (int i = 0; i < 23; i++) {
        for (int j = 0; j < 10; j++) {
            if (field.getField(i, j) == 0)
                continue;

            s.setTextureRect(sf::IntRect(field.getField(i, j) * 18, 0, 18, 18));
            s.setPosition(j * 18, i * 18);
            s.move(36, 54); // offset
            window.draw(s);
        }
    }

    for (int i = 0; i < 4; i++) {
        s.setTextureRect(sf::IntRect(current.colorNum * 18, 0, 18, 18));
        s.setPosition(current.a[i].x * 18, current.a[i].y * 18);
        s.move(36, 54); // offset
        window.draw(s);
    }

    for (int i = 0; i < 4; i++) {
        s.setTextureRect(sf::IntRect(next.colorNum * 18, 0, 18, 18));
        s.setPosition(next.a[i].x * 18 + 255, next.a[i].y * 18 + 285);
        window.draw(s);
    }

    window.draw(frame);
    window.draw(nextFrame);
    window.draw(scoreText);
    window.draw(highScoreText);

    if (gameOver) {
        window.draw(gameOverText);
        window.draw(playAgainText);
    }

    window.display();
}
Leave a Comment