Игра Понг в C ++

Это моя вторая игра SFML, которая представляет собой Понг. Скажите, пожалуйста, что вы думаете.

  #include <iostream>
#include <SFML/Graphics.hpp>
int player1score = 0;
int player2score = 0;

bool intersects(sf::CircleShape& c1, sf::RectangleShape& rect2){
sf::FloatRect circle = c1.getGlobalBounds();
sf::FloatRect rectangle = rect2.getGlobalBounds();
return circle.intersects(rectangle);
}
    int main(){
sf::VideoMode videomode(400, 400);
sf::RenderWindow window(videomode, "PONG");
sf::CircleShape Ball;
Ball.setFillColor(sf::Color::Red);
Ball.setRadius(10);
Ball.setPosition(100, 200);
sf::RectangleShape firstPlayer;
firstPlayer.setFillColor(sf::Color::Black);
firstPlayer.setSize(sf::Vector2f(10, 50));
firstPlayer.setPosition(30, 200);

sf::RectangleShape secondPlayer;
secondPlayer.setFillColor(sf::Color::Black);
secondPlayer.setSize(sf::Vector2f(10, 50));
secondPlayer.setPosition(370, 200);

sf::RectangleShape outleft;
outleft.setFillColor(sf::Color::Black);
outleft.setSize(sf::Vector2f(10, 400));
outleft.setPosition(390, 0);

sf::RectangleShape outright;
outright.setFillColor(sf::Color::Black);
outright.setSize(sf::Vector2f(10, 400));
outright.setPosition(0,0);





sf::RectangleShape mid;
mid.setFillColor(sf::Color::Blue);
mid.setSize(sf::Vector2f(20, 400));
mid.setPosition(200, 0);

sf::RectangleShape up;
up.setFillColor(sf::Color::Blue);
up.setSize(sf::Vector2f(20, 400));
up.setPosition(400, 0);
up.rotate(90);

sf::RectangleShape down;
down.setFillColor(sf::Color::Blue);
down.setSize(sf::Vector2f(20, 400));
down.setPosition(400, 380);
down.rotate(90);
sf::RectangleShape left;
sf::RectangleShape right;
sf::Vector2<float>ballSpeed(0.1, 0.1);








while (window.isOpen()){
    window.clear(sf::Color::Yellow);
    window.draw(mid);
    window.draw(Ball);
    window.draw(secondPlayer);
    window.draw(down);
    window.draw(up);
    window.draw(firstPlayer);
    window.draw(outleft);
    window.draw(outright);


    window.display();

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

if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up)){
    firstPlayer.move(0, -0.1);
}
else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down)){
    firstPlayer.move(0, 0.1);
}
else if (sf::Keyboard::isKeyPressed(sf::Keyboard::W)){
    secondPlayer.move(0, -0.1);
}
else if (sf::Keyboard::isKeyPressed(sf::Keyboard::S)){
    secondPlayer.move(0, 0.1);
}
if (intersects(Ball, outleft)){
    player1score++;
    Ball.setPosition(100, 200);
    std::cout << "Player1=  " << player1score << std::endl;
}
if (intersects(Ball, outright)){
    player2score++;
    Ball.setPosition(100, 200);
    std::cout << "Player2 =  " << player2score << std::endl;
}
if (intersects(Ball, up) || (intersects(Ball, down))){
    ballSpeed.y = -ballSpeed.y;
}
if (intersects(Ball, firstPlayer) || (intersects(Ball, secondPlayer))){
    ballSpeed.x = -ballSpeed.x;
}
Ball.move(ballSpeed.x, ballSpeed.y);

}

}
8 голосов | спросил Luna 26 MaramSat, 26 Mar 2016 03:43:32 +03002016-03-26T03:43:32+03:0003 2016, 03:43:32

1 ответ


13

Я вижу ряд вещей, которые могут помочь вам улучшить вашу программу.

Исправить форматирование

Мне непонятно, является ли код как опубликованный тем, что вы видите, когда вы смотрите на него, или если возникла проблема с вставкой кода, но в любом случае стоит исправить форматирование. В частности, последовательное отступы и последовательное использование определенного стиля действительно важнее, чем , который особый стиль вы, возможно, в конечном итоге выберите. Ключом к читаемому коду является выбор стиля и его последовательное применение.

Устранить «магические числа»

Этот код завален «магическими числами», то есть неназванными константами, такими как -0.1, 20, 400 и т. д. Обычно лучше избегать этого и давать такие константы значимым именам. Таким образом, если что-либо когда-либо нужно будет изменить, вам не нужно будет искать код кода для всех экземпляров «20», а затем попытаться определить, означает ли этот частный 20 радиус круг игрока или какая-либо другая константа, которая имеет одинаковое значение.

Знать жизненные циклы объектов

На самом деле нет необходимости в объекте event, который создается и уничтожается каждый раз через основной цикл, поскольку он может легко быть повторно использован. Может быть, лучше объявить его за пределами цикла и просто использовать его внутри.

Подумайте о пользователе

Мяч, похоже, последовательно запускается с полузащиты с левой стороны. Когда мяч запускается вправо, это разумно, но когда он запускается влево, это означает, что мяч внезапно появляется с очень небольшим количеством времени, чтобы реагировать. Это улучшит игру, чтобы запустить мяч таким образом, чтобы он всегда проходил по крайней мере три четверти двора, прежде чем входить в плоскость пользовательского весла.

Проверить допустимые диапазоны

Весы можно полностью перемещать с игрового поля, и, кроме того, на любом расстоянии не существует предела. Было бы лучше ограничить весло в игровом поле. В противном случае, если игрок не обратил на это внимания, весло может быть вне доски без видимой индикации того, как отправить его обратно.

Устранить глобальные переменные, где практические

Наличие подпрограмм, зависящих от глобальных переменных, затрудняет понимание логики и создает множество возможностей для ошибок. Устранение глобальных переменных, где это практично, всегда является хорошей идеей, будь то программирование для настольных компьютеров или встроенных систем. Для глобальных переменных, таких как player1score, самым простым решением в этом случае является просто переместить их в main

Рассмотрим масштабирование

 Окно понга

Сейчас доска асимметрична. Это можно было бы легко устранить, если числа не были фиксированными, а скорее получены из одного или двух фиксированных значений. Это позволит масштабировать и упростить симметрию.

Использовать объекты

Поскольку SFML уже использует объектную модель, более эффективное использование объектов для вашего собственного кода часто является вопросом получения этого кода. Например, в этой игре каждый из игроков и мяч может быть объектом с более сложным и игровым поведением, чем просто код sf::RectangleShape.

class Paddle : public sf::RectangleShape {
public:
    Paddle(float horzPos) 
    : sf::RectangleShape(sf::Vector2f{10, 50}),
      horz{horzPos}
    {
        setFillColor(sf::Color::Black);
        setPosition(horz, 200);
    }
    void setKeys(sf::Keyboard::Key upkey, sf::Keyboard::Key downkey) {
        K_up = upkey;
        K_down = downkey;
    }
    bool handleKey() {
        if (sf::Keyboard::isKeyPressed(K_up)) {
            move(up);
        } else if (sf::Keyboard::isKeyPressed(K_down)) {
            move(down);
        } else {
            return false;
        }
        return true;
    }
private:
    float horz;
    sf::Keyboard::Key K_up, K_down;
    static const sf::Vector2f up, down;
};
const sf::Vector2f Paddle::up{0, -0.1};
const sf::Vector2f Paddle::down{0, +0.1};
ответил Edward 26 MaramSat, 26 Mar 2016 05:10:31 +03002016-03-26T05:10:31+03:0005 2016, 05:10:31

Похожие вопросы

0
Поскольку Table.drawDebug устарел в libGDX, что я должен использовать вместо этого? Shader, который «разрезает» дыру через всю геометрию. Отдельный поток для игрового цикла является обязательным для простых игр. Как я могу заставить персонажа ходить по неровным стенам в 2D-платформере? C # /XNA получить аппаратную мышь positionBoat, проходящую под мостом в 2D-плиточной основе RTSBest одноранговая игровая архитектура. Каковы недостатки только явного информирования игрока о успехе *? Как добавить звук, который может слышать AI противника? Аутентификация для многопользовательской игры через socketsIt SharpDX достаточно зрелый, чтобы принять еще, или я должен просто начать использовать SlimDX прямо сейчас? Каков хороший метод случайного генерации ребер между узлами графа? Будет ли игра Python работать на нескольких платформах? Сетевые Pong CloneFinding неизолированные плитки в игре на основе плиткиКак обрабатывать RTS Click-And-Move в 3D пространстве? Как сопоставить размер шрифта с разрешением экрана? Как сделать независимым 2D-разрешение игры? Блендер - обычная норма выпечки - странные цветаКак я могу переместить sprite в направлении, с которым он сталкивается? Алгоритм построения углов регулярного, n-стороннего полигона. Мне нужно реализовать поддержку IPv6 для моей игры? Стоит ли использовать пулы частиц в управляемых языках? Что представляют собой компоненты gl_TexCoord [0 ] имею в виду?

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132