Карта немного поменялась, так как Линк врезался в мосты, которые соединяют нижние острова. Изменения делал непосредственно в Tiles и сохранял карту и csv-файлы. Чтобы всё было канонично, Линку выдадим меч. Спрайты на мечи я тоже отрисовал. Он лежит в папке weapons/sword. Там 5 картинок, где full обозначает сам меч, а остальные 4 — направления меча. Приступим к коду.
В файле setting.py, создаем словарь из оружий. У меня будет только один меч, но вы можете добавить больше оружия. Сам словарь:
Тут всё традиционно и без нового. Мы центруемся от самого игрока последней строкой в коде. Сейчас посередине будет рисоваться чёрный квадрат 40 на 40 пикселей. Импортируем новый файл в Level и создаём новый метод create_attack.
Далее перейдём в файл player.py и там передадим create_attack и создадим демона. Также, при нажатии на пробел, добавим метод self.create_attak(). Теперь можем вернуться к отрисовке нашего оружия:
import pygameclassWeapon(pygame.sprite.Sprite):def__init__(self,player,groups):super().__init__(groups) direction = player.status.split('_')[0]#обрезаем строку по "_" чтобы понимать куда он смотрит full_path =f'../graphic/weapons/{player.weapon}/{direction}.png'#адрес оружияself.image = pygame.image.load(full_path).convert_alpha()#сама графикаif direction =='right':self.rect =self.image.get_rect(midleft= player.rect.midright + pygame.math.Vector2(-10,16))elif direction =='left':self.rect =self.image.get_rect(midright= player.rect.midleft + pygame.math.Vector2(10,16))elif direction =='down':self.rect =self.image.get_rect(midtop= player.rect.midbottom + pygame.math.Vector2(-15,0))else:self.rect =self.image.get_rect(midbottom= player.rect.midtop + pygame.math.Vector2(-15,0))
Интересные моменты: во-первых, обрезаем строку по "_" чтобы понять куда смотрит герой (неважно с "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(). Результат:
self.create_attak = create_attak #создали атаку
self.weapon_index = 0 #номер оружия (если у вас будет несколько орудий пыток монстров)
self.weapon = list(weapon_data.keys())[self.weapon_index] #выбрали конкретное оружие и все его параметры