Делить переменные между классами C++?

Еще один вопрос о классах, поскольку я новичок в ООП. Я создаю игру просто для удовольствия. Это шутер сверху вниз, космический шутер.

У меня есть несколько разных классов:

Bullet (список координат маркера), Player (спрайт игрока, позиция и т. Д.), Enemy (спрайт противника, позиция и т. Д.), Collision (получение координат Ax, Ay и Bx, By, чтобы увидеть, столкнулись ли они)

Как я могу отправить координаты из Bullet, Enemy в класс Collision, чтобы увидеть, столкнулись ли они?

Collision col
col.collision(ax, ay, bx, by) //how can I get the Player and Bullet pos?

3 ответа

Решение

Вероятно, вам нужно иметь общий класс SceneObject, который имеет позицию. Затем Player, Enemy и Bullet наследуются от этого класса.

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

Я бы создал базовый класс для Bullet, Enemy (и, возможно, Player). Давайте назовем его Object, а Object будет владеть координатами и иметь функцию, определяющую, произошло ли столкновение.

В коде это будет выглядеть следующим образом:

class Object 
{
    private:
        Coord position; 

    public:
        bool Collide(const Object& otherObject) const;
};

Обычно вам нужно пройти через каждого врага и проверить координаты этого врага по отношению к координатам вашего игрока.
Я уверен, что вы хранили этих врагов где-то, желательно в контейнере, как std::vector, Теперь позвольте мне предположить, что вы сделали именно это:

// somewhere in a 'Game' class
std::vector<Enemy> myEnemies;
Player myPlayer;
Collision col;

for(int i=0; i < myEnemies.size(); ++i){
  col.collision(myPlayer.getX(), myPlayer.getY(), myEnemies[i].getX(), myEnemies[i].getY())
}

И это все.:) Вы делаете то же самое для пуль и подобных объектов. Сохраните их все в контейнере, итерируйте по этому контейнеру и проверьте положение объектов.
Теперь, для другого совета, если класс содержит только методы и не содержит переменных, вы также можете сделать это свободными функциями. Просто потому, что вы используете ООП в некоторых частях вашего проекта, не требует, чтобы вы использовали его везде. Сделать это collision свободная функция и покончим с этим.:)

Другие вопросы по тегам