Как сделать макет программы?

0

Я делаю арканоидный клон. Это макет программы, с которой я столкнулся:

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: Почему классы нуждаются в защищенных переменных, если "нет причин, чтобы мяч знал что-либо о классе приложения"

  • 2
    что вы имеете в виду, что мяч ничего не знает о приложении? Разве это не то, что вы передаете в качестве параметра?
  • 0
    Класс приложения включает в себя класс Ball, а затем создает один. Вот и все. Ball не имеет доступа к закрытым членам класса приложения.
Показать ещё 1 комментарий
Теги:
layout

3 ответа

1
Лучший ответ

Поскольку проблема заключается в том, что "у шара нет доступа к частным членам класса приложения", возможно, вы хотите создать геттер.

Геттер - это открытый метод, который возвращает значение частного поля.

Если вы это сделаете, вы можете получить доступ к значениям этих членов

circle.setPos(app->GetWidth()....

Ваш геттер может выглядеть примерно так:

public int GetWidth() {return this.APP_WIDTH; } }

  • 0
    Хорошо, я понял. Но как насчет объявления ball, brick и paddle в классе приложения и создания констант, защищенных APP_WIDTH и APP_HEIGHT? Разве это не выражает структуру собственности более четко? Но затем я получаю неполные ошибки типов при создании этих подклассов в приложении, поэтому я должен определить их в том же заголовке приложения, и тогда он становится слишком большим!
  • 0
    @MariusMacijauskas как насчет этого?
Показать ещё 5 комментариев
1

Нет никаких оснований для того, чтобы игровые объекты знали что-либо о App они участвуют. Когда ему требуется какая-либо информация из App, он должен получать их непосредственно из App. Это может произойти либо с помощью setter-методов (рекомендуется, когда свойства могут быть изменены приложением позже, например, положение мяча) или в конструкторе (рекомендуется для вещей, которые не меняются, например положения блоков).

0

Ball должен иметь SetPosition (x, y), которое приложение вызывает с приведенным выше вычислением. Внутренне это SetPosition установило бы круг, как указано выше, так что мяч ничего не знает о приложении.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню