Pygame: Обновление Rects с уровнями прокрутки - PullRequest
2 голосов
/ 02 ноября 2010

В настоящее время я делаю 2D-игру на платформе run-n'jump с боковой прокруткой в ​​PyGame.Большинство из них работает нормально и на самом деле очень хорошо - я использую быстрые объекты и группы pyGame Sprite.

Мне интересно знать, как люди обычно имеют дело с Rects для прокрутки игр.У меня, очевидно, есть уровень, который намного больше, чем видимая область, и у игрока, врагов, пуль и т. Д. У каждого есть свои (x, y) координаты, которые описывают, где они находятся на уровне.

Но теперь, так какмы используем вызов spriteGroup.draw (surface), он не будет отображать их в правильном месте, если каждый объект Rects не был настроен так, чтобы правая часть отображалась на экране.Другими словами, каждый раз, когда игрок / враг / пуля / что-либо еще обновляется, необходимо передавать информацию о камере, чтобы их Rect можно было обновлять.

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

Очевидно, что идеальный метод (я думаю) - это использовать Rects с "реальными" координатами, блицвсе в буфере размером с уровень, а затем просто перетащите видимую часть на экран, но на практике это замедляет игру ОЧЕНЬ МНОГО.

Любые комментарии / идеи будут оценены.

Спасибо

Ответы [ 5 ]

1 голос
/ 02 ноября 2010

Вы можете расширить de Sprite.Group, чтобы он получал информацию о камере. Затем выполните один из следующих вариантов: A. Переопределите метод update, чтобы он обновлял экранные координаты каждого спрайта. Б. Переопределите метод рисования, чтобы он обновлял экранные координаты каждого спрайта и затем вызывал его родительский метод рисования.

Я думаю, что это проще и чище.

0 голосов
/ 28 ноября 2013

Простой способ сделать это так:

Создайте переменные CameraX и CameraY, и при перетаскивании объектов на экране используйте:

blit(surface, (x -CameraX, y -CameraY))

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

.это

#Move Camera Right
CameraX += 10
#Move Camera Left
CameraX -= 10
#Move Camera Down
CameraY += 10
#Move Camera Up
CameraY -= 10

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

0 голосов
/ 12 января 2013

Вы можете иметь 2 переменные level_l и level_d, которые видят, где вы находитесь на уровне, затем проверьте, какие спрайты находятся в видимой области
level_d+height и level_l+width,
и нарисуйте их на экране.

0 голосов
/ 07 января 2013

Один из методов, которые я нашел, - отслеживать прокрутку и прокрутку. Затем просто добавьте scrollx и прокрутите y к координатам при перемещении прямоугольников.

0 голосов
/ 21 августа 2011

Мне не очень нравится передавать информацию о камере каждому отдельному объекту при каждом обновлении, чтобы сместить Rects.

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

Вы можете переопределить рисование самостоятельно, поэтому он делает:

dest = game.camera.topleft + self.rect.topleft
screen.blit( self.surface, dest )

Это сохраняет прямоугольник пули в мировых координатах, но блитиспользуя экранные координаты.

...