Я делаю арканоидный клон. Это макет программы, с которой я столкнулся:
source.cpp // few lines
App class // has constants APP_WIDTH and APP_HEIGHT
Ball class // has constant RADIUS
Brick class
Paddle class
Теперь я хочу поместить мяч в центр окна в начале игры. Обычно я делал это так:
Ball::Ball (App &app)
{
circle.setPos(app->WINDOW_WIDTH/2-RADIUS/2,app->WINDOW_HEIGHT/2-RADIUS/2)
}
Но класс шара ничего не знает о приложении!
Нужно ли делать глобальные переменные APP_WIDTH
и APP_HEIGHT
?
Или мне нужно перевернуть текущий макет приложения вверх ногами, чтобы класс Ball #include "app.hpp"
инструкцию #include "app.hpp"
?
EDIT: Или мне нужно объявить классы шара, кирпича и весла внутри класса приложения? Но тогда, где я их определяю? Внутри того же класса приложения? Тогда заголовок становится слишком большим!
И, может быть, есть несколько хороших учебников по теме макета программы в Интернете? Я не нашел...
ВОПРОС 2: Почему классы нуждаются в защищенных переменных, если "нет причин, чтобы мяч знал что-либо о классе приложения"
Поскольку проблема заключается в том, что "у шара нет доступа к частным членам класса приложения", возможно, вы хотите создать геттер.
Геттер - это открытый метод, который возвращает значение частного поля.
Если вы это сделаете, вы можете получить доступ к значениям этих членов
circle.setPos(app->GetWidth()....
Ваш геттер может выглядеть примерно так:
public int GetWidth() {return this.APP_WIDTH; } }
Нет никаких оснований для того, чтобы игровые объекты знали что-либо о App
они участвуют. Когда ему требуется какая-либо информация из App
, он должен получать их непосредственно из App
. Это может произойти либо с помощью setter-методов (рекомендуется, когда свойства могут быть изменены приложением позже, например, положение мяча) или в конструкторе (рекомендуется для вещей, которые не меняются, например положения блоков).
Ball должен иметь SetPosition (x, y), которое приложение вызывает с приведенным выше вычислением. Внутренне это SetPosition установило бы круг, как указано выше, так что мяч ничего не знает о приложении.