Я працюю над простою головоломкою на основі блоків.
Гра включає в себе досить багато рухомих блоків в ігровій зоні, тому це тривіальне моделювання фізики. Однак, на мій погляд, моя реалізація далеко не ідеальна, і мені цікаво, чи можете ви дати мені будь-які вказівки щодо того, як це зробити краще.
Я розділив код на дві області: логіка гри та інтерфейс користувача, як я робив із багатьма головоломками:
- Логіка гри відповідає за загальні правила гри (наприклад, формальна система правил у шахах)
- Користувацький інтерфейс відображає ігрову область та фігури (наприклад, шахова дошка та шматки) і відповідає за анімацію (наприклад, анімаційний рух шахових фігур)
Логіка гри представляє ігровий стан як логічну сітку, де кожна одиниця є шириною / висотою однієї комірки в сітці. Отже, для сітки шириною 6 можна перемістити блок шириною 2 чотири рази, поки він не зіткнеться з межею.
Користувацький інтерфейс приймає цю сітку і малює її, перетворюючи логічні розміри в розміри пікселів (тобто помножує її на постійну). Однак, оскільки гра майже не має логіки гри, мій ігровий рівень логіки [1] не має нічого спільного, крім виявлення зіткнень. Ось як це працює:
- Гравець починає перетягувати фрагмент
- Користувальницький інтерфейс запитує логіку гри для легальної області руху цієї частини та дозволяє гравцеві перетягнути її в межах цієї області
- Гравець відпускає частину
- Користувальницький інтерфейс прив'язує шматок до сітки (щоб він знаходився у дійсному логічному положенні)
- Користувацький інтерфейс повідомляє логічній грі нову логічну позицію (за допомогою мутаторних методів, яких я б краще уникнути)
Я не дуже задоволений цим:
- Я пишу одиничні тести для мого логічного шару гри, але не інтерфейсу користувача, і виявилося, що весь хитромудрий код є в інтерфейсі: Зупинення шматка від зіткнення з іншими або кордону та прив’язування до сітки.
- Мені не подобається те, що інтерфейс користувача розказує логіку гри про новий стан, я б скоріше за все це назвав
movePieceLeft()
методом чи чимось подібним, як у інших моїх іграх, але мені не вдалося далеко підійти до цього підходу, оскільки логіка гри нічого не знає про перетягування та оснащення, що можливо в інтерфейсі користувача.
Я думаю, що найкраще зробити - це позбутися мого логічного рівня гри та замість цього застосувати рівень фізики. У мене є кілька запитань щодо цього:
- Чи є такий фізичний шар загальним чи більш типовим є те, щоб логічний шар гри це робив?
- Чи належить прив'язування до сітки та коду перетягування фрагментів користувальницькому інтерфейсу або фізичному шару?
- Чи може такий рівень фізики працювати з розмірами пікселів або з якоюсь логічною одиницею, як-от мій логічний шар гри?
- Я колись бачив виявлення зіткнень на основі подій у базі коду гри, тобто гравець просто перетягуватиме частину, інтерфейс інтерфейсу візуалізує це та повідомляє фізичну систему, а фізична система викликає метод onCollision () на деталі, коли виявлено зіткнення. Що є більш поширеним? Такий підхід чи спочатку вимагає сфери легального руху?
[1] шар , напевно, не є правильним словом для того, що я маю на увазі, але підсистема звучить перекрито, і клас помилково керується, оскільки кожен шар може складатися з декількох класів.