Создаем игру с Pygame и Python. Добавление границы игрового поля
В предыдущей статье мы добавили новые свойства к игровому объекту. В результате чего, наш космический корабль двигается и вращается! Однако, когда он достигает края экрана, то просто продолжает двигаться дальше. Одним из важных элементом игры является обеспечение того, чтобы игровые объекты не покидали экран. И в сегодняшней статье мы исправим это. Мы можем либо заставить их отскочить от края, либо снова появиться на противоположном краю экрана. В этом проекте будет реализовываться последнее.
В библиотеке Pygame присутствует метод возвращающий ширину и высоту экрана. Зная это можно создать метод принимающий два аргумента первый это position - позиция спрайта, а второй surface или поверхность игрового поля. Далее мы разделим позицию x и y по модулю на высоту и ширину экрана. Деление по модулю в Python представлено знаком % и возвращает остаток от деления двух чисел.
Начнем с импорта класса Vector2 в файл space_rocks/utils.py :
from pygame.image import load
from pygame.math import Vector2
# затем добавим там же метод wrap_position()
def wrap_position(position, surface):
x, y = position
w, h = surface.get_size()
return Vector2(x % w, y % h)
# Используя оператор по модулю %, можно убедиться, что позиция никогда не покидает область заданной поверхности. В нашей игре такой поверхностью будет экран.
В методе выше, мы передаем в качестве аргументов позицию спрайта и поверхность экрана, каждый из которых содержит по два параметра. Далее возвращаются координаты корабля - Vector2(x % w, y % h). Деление на % - модуль здесь, приводит к тому что координаты корабля всегда окажутся в пределах высоты - h и ширины - w экрана.
Импортируем вновь созданный метод в space_rocks/models.py:
from pygame.math import Vector2
from pygame.transform import rotozoom
from utils import load_sprite, wrap_position
# теперь немного изменим метод move() в классе GameObject
def move(self, surface):
self.position = wrap_position(self.position + self.velocity, surface)
'''
Обратите внимание, что использование wrap_position() - не единственное изменение здесь. Вы также добавляете новый аргумент surface к этому методу. Это потому, что вам нужно знать область, вокруг которой должна быть граница. В конце обновим вызов метода в классе Space Rocks:
'''
def _process_game_logic(self):
self.spaceship.move(self.screen)
Теперь ваш космический корабль снова появляется на другой стороне экрана:
Логика перемещения космического корабля готова.
-
- Михаил Русаков
Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.