Оружие героя
Карта немного поменялась, так как Линк врезался в мосты, которые соединяют нижние острова. Изменения делал непосредственно в Tiles и сохранял карту и csv-файлы. Чтобы всё было канонично, Линку выдадим меч. Спрайты на мечи я тоже отрисовал. Он лежит в папке weapons/sword. Там 5 картинок, где full обозначает сам меч, а остальные 4 — направления меча. Приступим к коду.
В файле setting.py, создаем словарь из оружий. У меня будет только один меч, но вы можете добавить больше оружия. Сам словарь:
Далее, создадим новый файл с настойкой оружия weapon.py
:
Тут всё традиционно и без нового. Мы центруемся от самого игрока последней строкой в коде. Сейчас посередине будет рисоваться чёрный квадрат 40 на 40 пикселей. Импортируем новый файл в Level и создаём новый метод create_attack
.
Далее в самой отрисовке игрока, добавим наш метод как ссылку на него:
Далее перейдём в файл player.py и там передадим create_attack и создадим демона. Также, при нажатии на пробел, добавим метод self.create_attak()
. Теперь можем вернуться к отрисовке нашего оружия:
Интересные моменты: во-первых, обрезаем строку по "_" чтобы понять куда смотрит герой (неважно с "attack" или без). Затем отрисовка. Нам нужно чтобы меч рисовался в руке у Линка. Я выбрал следующий метод, если меч слева, то "приклеиться" он должен справа от Линка, то есть midleft = player.rect.midright + pygame.math.Vector2(-10, 16)
. Далее, плюсуем вектор направления чтобы меч был ровно в руке. Далее всё повторяется в зависимости от направления.
Добавим в player.py новых демонов:
Теперь есть меч, но есть проблема. Мечи не исчезают:
Создадим новый метод в level.py
: destroy_weapon
. Помимо прочего, нужно немного переработать код в самом level.py
. Создадим нового демона self.current_attack = None
, а также переработаем метод create_attack
.
Таким образом, при наличии атаки, мы убиваем процесс и обнуляем указатель атаки (current_attak
). Нужен ещё кулдаун. Также, не забудьте сослаться на self.destroy_weapon
в player:
Далее пропишем метод в player.py и внесём в кулдаун новую функцию: self.destroy_weapon()
. Результат:
Last updated