Делить переменные между классами C ++? - PullRequest
0 голосов
/ 15 апреля 2011

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

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

Пуля (список координат пули), Игрок (спрайт игрока, позиция и т. Д.), Враг (спрайт противника, позиция и т. Д.), Столкновение (получение координат)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 ]

5 голосов
/ 15 апреля 2011

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

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

1 голос
/ 15 апреля 2011

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

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

class Object 
{
    private:
        Coord position; 

    public:
        bool Collide(const Object& otherObject) const;
};
0 голосов
/ 15 апреля 2011

Обычно вам нужно пройти через каждого врага и проверить координаты этого врага по координатам вашего игрока.
Я уверен, что вы где-то хранили этих врагов, предпочтительно в контейнере, подобном 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 бесплатной функцией и покончите с этим. :)

...