Как избежать копирования уровня Surface каждый кадр в worms -как в игре?

Я работаю над игрой, в которой есть разрушаемый ландшафт (, как в игре Worms или Scorched Earth ), и используется определение столкновений с точностью до пикселя с помощью масок.

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

Есть ли способ избежать копирования всей поверхности уровня в каждом кадре и по-прежнему иметь возможность использовать инструменты идеального столкновения пикселей, имеющиеся в pygame?

Я попытался сначала засветить поверхность уровня, а затем засветить каждый спрайт на экране (с их координатами блита, скорректированными камерой, за исключением персонажа игрока, чьи координаты статичны ), но в этом случае обнаружение столкновений система разваливается и я не могу это починить.

ОБНОВЛЕНИЕ

Мне удалось заставить его работать следующим образом :При рисовании спрайтов я преобразовываю их координаты игрового мира (, которые в основном являются координатами относительно начала растрового изображения уровня ), в экранные координаты (координаты относительно камеры, которая в данный момент является видимой областью уровня. ).

На этапе обнаружения столкновений я использую координаты и ограничивающие прямоугольники, расположенные относительно поверхности уровня; так же, как выше. Дело в том, что положение камеры привязано к положению игрока, которое не является и не должно было быть статическим значением (. Я действительно не понимаю, как мне удавалось не понимать этого так долго ).

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

9
задан Randall Cook 10 May 2012 в 04:20
поделиться