Наша задача — сделать интерфейс игры. Первым делом, нужно создать такие простые вещи как базовые параметры. У нас уже есть один параметр. Это скорость. Сейчас допишем остальные параметры. В демоны в файле player.py запишем следующие параметры:
self.stats ={'health':100,'energy':60,'attack':10,'speed':5}#все параметры герояself.health = self.stats['health']#соотношение со здоровьемself.energy = self.stats['energy']#соотношение с энергиейself.exp =4221#количество очковself.speed = self.stats['speed']#скорость игрока
Все параметры указаны и можно удалить параметр скорости из демона ранее. Особенно хорошо, что Линк уже набрал 4221 очка за просмотр себя на ютюбе у Артура из Уфы. В файле settings.py Добавим немного параметров отображения:
BAR_HEIGHT =20#толщина всех панелекHEALTH_BAR_WIDTH =200#длина панельки здоровьяENERGY_BAR_WIDTH =140#длина панельки энергииITEM_BOX_SIZE =80#размер значка под предметUI_FONT ='../graphic/font/joystix.ttf'#основной шрифтUI_FONT_SIZE =18#кегель шрифтаUI_BG_COLOR ='#222222'#цвет задникаUI_BORDER_COLOR ='#111111'#цвет обводкиTEXT_COLOR ='#EEEEEE'#цвет текстаHEALTH_COLOR ='red'#цвет здоровьяENERGY_COLOR ='green'#цвет энергии
Тут самый важный момент — добавить шрифт. Самый его большой плюс в том, что он поддерживает русский язык. Теперь в настройках уровня укажем нового демона self.ui = UI() и импортируем сам файл в проект. Добавим в run-метод правило отрисовки:
self.ui.display(self.player)
Теперь создадим новый файл ui.py:
import pygamefrom settings import*classUI:def__init__(self): self.display_surface = pygame.display.get_surface()#прорисовка самого экрана self.font = pygame.font.Font(UI_FONT, UI_FONT_SIZE)#добавление стандартного шрифта self.healt_bar_rect = pygame.Rect(10, 10, HEALTH_BAR_WIDTH, BAR_HEIGHT)#панелька для здоровья self.energy_bar_rect = pygame.Rect(10, 34, ENERGY_BAR_WIDTH, BAR_HEIGHT)#панелька для энергииdefshow_bar(self,current,max_amountm,bg_rect,color): pygame.draw.rect(self.display_surface, UI_BG_COLOR, bg_rect)#отрисовка задника панельки ratio = current / max_amountm current_with = bg_rect.width * ratio current_rect = bg_rect.copy() current_rect.width = current_with pygame.draw.rect(self.display_surface, color, current_rect)#рисование панельки pygame.draw.rect(self.display_surface, UI_BORDER_COLOR, bg_rect, 3)#рисование обводки панелькиdefdisplay(self,player): self.show_bar(player.health, player.stats['health'], self.healt_bar_rect, HEALTH_COLOR) #обращение к отрисовке панели здоровья
self.show_bar(player.energy, player.stats['energy'], self.energy_bar_rect, ENERGY_COLOR) #обращение к отрисовке панели энергии
Из интересного, тут есть строки рассчётов:
ratio = current / max_amountmcurrent_with = bg_rect.width * ratiocurrent_rect = bg_rect.copy()current_rect.width = current_with
Мы переводим значения нашего здоровья в проценты прорисовки в поле пикселей. Нам нужно перевести даже 140 очков здоровья в 100%. Для этого, мы запрашиваем current — очки здоровья и делим их на длину нашего поля здоровья (max_amountm), далее перемножаем это с bg_rect.width для отображения в поле. Я поставил в player.py значение здоровья на -10 и -50 на энергию:
self.health = self.stats['health']-10#соотношение со здоровьемself.energy = self.stats['energy']-50#соотношение с энергией
Результат:
Нарисуем же наши очки. Переходим опять к ui.py и создадим новый метод show_exp:
defshow_exp(self,exp): text_surf = self.font.render(str(int(exp)), False, TEXT_COLOR)#рендер шрифта с экспой, без сглаживания и с цветом x = self.display_surface.get_size()[0] -20#отступ снизу на 20 пикселей по x y = self.display_surface.get_size()[1] -20#отступ снизу на 20 пикселей по y text_rect = text_surf.get_rect(bottomright = (x, y))#цепляемся за низ экрана справа pygame.draw.rect(self.display_surface, UI_BG_COLOR, text_rect.inflate(20, 20))#цепляемся за низ экрана справа self.display_surface.blit(text_surf, text_rect)#отображаем панельку pygame.draw.rect(self.display_surface, UI_BORDER_COLOR, text_rect.inflate(20, 20), 3)#обводка панели
Из интересного: тут стоит False в методе self.font.render. Данный метод выключает сглаживание, так как у меня пиксельный шрифт. А также, pygame сделали крутой метод text_rect.inflate, который помогает вписать текст в панельку. Результат удивительно прекрасен:
Последний шаг — прорисовка меча Линка. Для начала, нужно прописать в базовых демонах наш список оружия. У меня в наличии только одно оружие, так что этот кусок кода можно упростить, но я оставил возможность подбирать оружие и добавить его в словарь оружия, а затем и в этот список: