2010-10-20 1 views
5

Мой профессор дал мое задание сегодня на основе объектно-ориентированного программирования в Pygame. В основном он сказал, что игра, которую мы должны создать, будет лишена основного игрового цикла. Хотя я считаю, что это можно сделать (и this question заявил, что это возможно). Я не верю, что это необходимо для приверженности объектно-ориентированной парадигме.Программирование игр без основной петли

На диаграмме, которую дал профессор, он показал инициализацию игры и, поскольку объекты были созданы, поток управления программой будет распределен между объектами.

В принципе, я считаю, что можно было бы реализовать игру таким образом, но это не было бы идеальным способом и не требовалось бы для объектно-ориентированного присоединения. Есть предположения?

EDIT: Мы создаем клон астероидов, который, я считаю, еще больше усложняет ситуацию из-за того, что это игра в реальном времени.

+0

Хм, в то время как я вижу, как это может работать, я просто не вижу, как это будет хорошо работать, когда есть много и много астероидов. Какой из них будет проверяться на столкновение? Каждый из них сам по себе? Затем какой из них собирается обновить квадрант, чтобы избежать ненужных проверок столкновения? И если сущности манипулируют каким-то глобальным состоянием, это не лучший выбор дизайна или ИМО. –

ответ

7

Поверенные игры или все, что связано с событиями, станет маршрутом. Другими словами, возьмите приложения для графического интерфейса пользователя. Они будут просто гадать (ждать) до тех пор, пока не будет запущено событие. То же самое можно сделать для простой игры. Возьмите шашки, например. Зацикливание каждого игрового цикла было бы излишним. В 90% случаев игра будет статичной. Использование какой-либо формы событий (шаблон observer design будет приятным здесь) обеспечит гораздо лучшее решение. Вы используете Pygame, поэтому может быть поддержка для этого встроенного, из-за моего ограниченного использования я не могу полностью прокомментировать. В любом случае общие принципы одинаковы.

В общем, это довольно мусорное задание, если вы спросите меня. Если вам нужно научить программированию, основанному на событиях, простое графическое приложение будет лучше. Даже самые простые игры - это основной игровой цикл, который может придерживаться принципов OO.

+0

Спасибо, вот что я в основном думал. Спасибо за идею дизайна наблюдателя, я буду использовать его. – emberv3

+0

@ emberv3 добро пожаловать. – Finglas

0

Я думаю, что это может квалифицироваться как программирование, управляемое событиями? Что еще может быть объектно-ориентированным. Вы видите это во Flash много.

Существует разница между основным циклом в основном классе. У вас все еще может быть класс игры, инициализирующий все ваши объекты, а затем полагаться на входные данные для перемещения игры вперед.

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

2

Хмм. В общем случае я думаю, что эта идея, вероятно, является хокумом. SDL (на котором реализован PyGame), предоставляет информацию программе через очередь событий, и для использования этой очереди требуется некоторая периодическая проверка очереди на события, обработка их и ожидание до следующего события.

Есть некоторые исключения из этого. Вы можете опросить мышь и клавиатуру для их состояния, не обращаясь к очереди событий. Проблема в том, что это все еще требует чего-то вроде цикла, так что это происходит снова и снова, пока игра не выйдет.

Вы можете использовать pygame.time, чтобы ждать по таймеру, а не ждать очереди событий, а затем передавать управление игровым объектам, которые опросили мышь и клавиатуру, как указано выше, но вы все еще «зацикливаетесь», но связаны таймер вместо очереди событий.

Вместо того, чтобы сосредоточиться на устранении основного цикла, как насчет того, чтобы думать об использовании его объектно-ориентированным способом.

Например, вам может потребоваться «корневой» объект, который фактически имеет свой собственный цикл событий, но вместо выполнения каких-либо действий на основе входящих событий он вызывает обработчик нескольких дочерних объектов. Например, когда корневой объект получает событие pygame.event.MOUSEBUTTONDOWN, он может искать его дочерние элементы для атрибута «rect» и определять, находится ли атрибут event.pos внутри этого прямоугольника. если это так, то можно вызвать гипотетический метод onClick для этого дочернего объекта.