Тема 3 из 6

Спрайты и списки спрайтов

Спрайт

Спрайт — объект игры с положением, размером и картинкой: игрок, монета, пуля, платформа.

player = arcade.Sprite("player.png", scale=0.5)              # из картинки
box = arcade.SpriteSolidColor(40, 40, color=arcade.color.RED)  # просто цветной прямоугольник
coin = arcade.SpriteCircle(10, arcade.color.GOLD)             # круг радиуса 10

player.center_x = 100      # положение — это центр спрайта
player.center_y = 200
player.position = (100, 200)

Кроме центра у спрайта есть стороны: left, right, bottom, top. Их можно не только читать, но и присваивать — тогда сдвигается весь спрайт:

box.left = 0        # прижать к левому краю окна
box.top = 600       # прижать к верху окна высотой 600

Так удобно не выпускать объект за пределы окна или ставить его вплотную к стене.

Скорость

change_x и change_y — скорость спрайта в пикселях за кадр. Движение обычно пишут в on_update:

def on_update(self, delta_time):
    self.player.center_x += self.player.change_x
    self.player.center_y += self.player.change_y

Развернуть объект — сменить знак скорости: enemy.change_x = -enemy.change_x. Надёжнее явно задать направление: abs(...) — вправо, -abs(...) — влево. Тогда двойной разворот в одном кадре ничего не сломает.

Списки спрайтов

Спрайты хранят в arcade.SpriteList: он рисует все спрайты одним вызовом видеокарты.

self.coins = arcade.SpriteList()
self.coins.append(coin)

def on_draw(self):
    self.clear()
    self.coins.draw()

print(len(self.coins))
for c in self.coins:
    c.center_y -= 1

Убрать спрайт из всех списков, где он лежит: sprite.remove_from_sprite_lists().

Ловушка. Нельзя удалять элементы из списка, по которому идёт цикл: элементы сдвигаются, и цикл перепрыгивает через соседний. Перебирайте копию:

for b in list(self.bullets):      # list(...) — копия
    if b.bottom > self.height:
        b.remove_from_sprite_lists()

Итог

  • Sprite, SpriteSolidColor, SpriteCircle; положение — center_x, center_y;
  • стороны left, right, bottom, top можно присваивать;
  • change_x, change_y — скорость, её прибавляют в on_update;
  • SpriteList: append, draw, len; удаление — remove_from_sprite_lists(), при обходе — по копии списка.