Это дополнительный вопрос к этому другому .
Я хотел бы знать , существует ли общий / типичный / лучший шаблон для масштабирования моего представления о мире (в настоящее время 160Kmx160Km), чтобы соответствовать его области рисования (в настоящее время 800x600 пикселей).
Я могу придумать как минимум четыре разных подхода:
Наивный (как я это делал до сих пор). Я реализовал глобальную функцию, sc(vector)
которая будет просто возвращать уменьшенную копию переданного вектора. Это, конечно, работает, но обязывает меня писать такой код:
drawCircle(sc(radius), sc(position))
Оборачивающие функции . Я мог бы определить несколько функций, каждая из которых обернута оригинальной промежуточной программой. Например, я мог бы определить myDrawCircle
, что сначала нужно масштабировать аргументы, которые нужно масштабировать, а затем вызывать drawCircle
с последними. Это сделало бы мой код, возможно, более читабельным и более легким в обслуживании, но я должен написать много функций переноса, которые звучат глупо.
Функция декоратора . Я мог бы просто украсить существующие функции промежуточного программного обеспечения, обеспечивая автоматическое масштабирование для всех параметров, которые являются экземплярами класса Vector3D
, но проблема в том, что эти функции также работают с одинаковыми параметрами list
или Vector2D
слишком, и у декоратора не было бы возможности узнать какие списки нужно масштабировать (например, радиус), а какие нет (значения RGB).
Инициализация поверхности . При определении поверхности, на которой я собираюсь рисовать, я мог бы определить коэффициент масштабирования (чтобы в качестве параметров я использовал метры, а не пиксели). Это будет работать прозрачно для меня и будет моим предпочтительным решением, но, конечно, оно должно быть реализовано в промежуточном программном обеспечении, так что это не реальный вариант.
... во всяком случае: поскольку это очень распространенная проблема, мне интересно, существует ли установленный шаблон, который элегантно решает эту проблему, которую мне не удалось найти.
PS: для этого проекта я использую python (с pygame ), но - хотя ответ на python / pygame очень важен, меня больше интересует общее / общее описание шаблона, а не его конкретная реализация.
Заранее спасибо за ваше время и опыт.
источник
Обычно люди не пытаются выполнять масштабирование во время выполнения в 2D-играх. Я не согласен, что это общая проблема. Если люди хотят мини-карту или другое фиксированное изменение масштаба, часто для этой цели делается новый набор графики. Редко нужно, чтобы в двухмерной игре вам нужно было использовать одну и ту же процедуру с двумя различными уровнями масштабирования.
Если вы используете 3D API, вы можете получить эту функцию бесплатно - просто измените параметры камеры / области просмотра.
PyGame является очень старым API и, к сожалению, действительно подходит только для 2D. Даже если вы могли бы разработать адекватные системы масштабирования для разных уровней масштабирования, производительность будет недостаточно хорошей, а внешний вид, вероятно, будет неприемлемо плохим.
Я бы посоветовал, что если вы хотите увеличить или уменьшить масштаб, вы как можно скорее перейдете на современный 3D API. Я бы порекомендовал pyglet, но есть и другие.
источник
pyglets
в прошлом для 3D-моделирования. Это, безусловно, более, чем способноpygame
, но поддержка 2D довольно низкоуровневая, чем вpygame
. Доступная документация / примеры также менее подробны, что для меня обидно, так как я новичок в разработке игр, и мне действительно нужно понять основы наиболее часто выполняемых операций. :) Что касается «возраста» пигмеев: вы правы. Однако идет модернизация ! :)pygame.sprite.LayeredUpdates
например,). Что касается неизменного соотношения: я понял, что вы имеете в виду. Поведение, которое вы описываете, не то, которое я хочу воспроизвести, но я поняла, что вы имеете в виду, спасибо за разъяснения! :)