Делить переменные между классами 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
свободная функция и покончим с этим.:)