def render(self): display.blit(background, (0, 0)) # отрисовка заднего фона # отрисовка кнопок изменения громкости self.exit_btn.draw(0, 0) self.volume_up_btn.draw(0, 0) self.volume_down_btn.draw(0, 0) # отрисовка надписи и значения 'music volume' display.blit(music_volume_image, (60, 110)) drawing_text(str(int(self.music_volume)), (680, 120), font_color=(255, 255, 255), font_size=72, font_type='corp_round_v1.ttf') # отрисовка кнопок изменения скорости нот self.speed_up_btn.draw(0, 0) self.speed_down_btn.draw(0, 0) # отрисовка надписи и значения 'scroll speed' display.blit(scroll_speed_image, (60, 260)) drawing_text(str(self.scroll_speed) + ' px', (680, 270), font_color=(255, 255, 255), font_size=72, font_type='corp_round_v1.ttf') # отрисовка кнопки подтверждения изменений self.confrim_btn.draw(0, 0)
def draw(self): display.blit(pygame.image.load('image/StartMenu.jpg'), (0, 0)) drawing_text('Выберите персонажа', 345, 70, font_color=pygame.Color('white'), font_size=40) name = self.list_chr[self.ind_chr][0] drawing_text(name, (1185 - len(name) * 40) // 2, 140, font_color=pygame.Color('grey'), font_size=40) for i in range(2): name, cords = self.list_chr[i] display.blit(pygame.image.load(f'image/{name}_0.png'), cords) if i != self.ind_chr: x, y = pygame.mouse.get_pos() if cords[0] < x < cords[0] + 96 and cords[ 1] < y < cords[1] + 120: display.blit( pygame.image.load('image/select_square_1.png'), cords) else: display.blit(pygame.image.load('image/select_square_0.png'), cords) self.confirm_button.draw(0, 0)
def draw(self, x, y, size=32): mouse = pygame.mouse.get_pos() click = pygame.mouse.get_pressed() if self.x < mouse[0] < self.x + self.width and self.y < mouse[ 1] < self.y + self.height: image = self.image[self.ind_image // self.count_img] self.glow_transparency += glow_v / fps self.glow_transparency = min(self.glow_transparency, 255) if self.glow: self.glow.set_alpha(self.glow_transparency) if self.ind_image != self.count_img**2 - 1: self.ind_image += 1 if click[0] and self.func: self.func() else: image = self.image[self.ind_image // self.count_img] if self.ind_image != 0: self.ind_image -= 1 self.glow_transparency -= glow_v / fps self.glow_transparency = max(self.glow_transparency, 0) if self.glow: self.glow.set_alpha(self.glow_transparency) if self.glow: display.blit(self.glow, (self.x, self.y)) display.blit(image, (self.x, self.y)) drawing_text(self.text, (x, y), (0, 0, 0), size)
def draw(self, x, y, size=32): mouse = pygame.mouse.get_pos() click = pygame.mouse.get_pressed() if self.x < mouse[0] < self.x + self.width and self.y < mouse[ 1] < self.y + self.height: image = self.image_on if click[0]: self.func() else: image = self.image_off display.blit(image, (self.x, self.y)) drawing_text(self.text, x, y, (0, 0, 0), size)
def show_points(self): # отрисовка статистики игрока score = str(self.score) # общий счет игрока score = '0' * (10 - len(score)) + score # добавление нулей если число меньше миллиарда display.blit(self.score_surface, (670, 30)) # обновление области общего счета drawing_text(score, (670, 40), pygame.Color('white'), font_size=40, font_type='corp_round_v1.ttf') # отрисовка общего счета sum_marks = sum(self.count_marks.values()) # кол-во всех полученных оценок if sum_marks != 0: # подсчет точности описан в файле ReadMe.txt self.accuracy = (self.score - 19 * self.count_marks[301]) / (sum_marks * 300) * 100 if self.accuracy > 100: self.accuracy = 100 display.blit(self.acc_surface, (670, 90)) # обновление точности drawing_text(str(('%.2f' % self.accuracy)) + ' %', (670, 100), pygame.Color('white'), font_size=40, font_type='corp_round_v1.ttf') # отрисовка точности display.blit(self.combo_surface, (670, 150)) # обновление комба игрока drawing_text(str(self.combo) + 'x', (670, 160), pygame.Color('white'), font_size=40, font_type='corp_round_v1.ttf') # отрисовка комба # отрисовка полоски способности персонажа if self.character == 0 or self.character == 1 or self.character == 3: if self.activate_ability: # если способность персонажа активна self.ability_score += 50 # уменьшается полоска способности if self.ability_score == 10000: self.activate_ability = False # способность отключается elif self.ability_score > 0: # способность накапливаться пока не заполнена self.ability_score -= 5 # заполняется способность медленне, чем тратиться(в 10 раз) self.ability_sprite.update() # обновление полоски способности персонажа pygame.draw.rect(display, (37, 25, 45), (672, 232, 371 * self.ability_score // 10000, 24)) # отрисовка не заполненой области
def render(self): display.blit(menu_background[0], (0, 0)) # отрисовка изображений заднего фона display.blit(menu_background[1], (0, 620)) display.blit(menu_background[2], (0, 0)) chr = character_list[self.ind_chr] # спрайт отображаемого персонажа if self.ind_chr == self.character: # отрисовка круга выбранного персонажа pygame.draw.circle(display, (212, 84, 182), (565, 385), 220) chr.update() text, cords = self.names_chr[ self.ind_chr] # имя и координаты имени персонажа drawing_text(text, cords, font_color=pygame.Color('White'), font_size=70) # отрисовка имени text = character_ability[ self.ind_chr] # описание способности персонажа for i in range( len(text) ): # отрисовка описание способности персонажа(тень текста) drawing_text(text[i], (240 - 10 * i + 2, 600 + 30 * i + 2), font_size=30, font_color=pygame.Color('Black')) for i in range( len(text) ): # отрисовка описание способности персонажа(основной текст) drawing_text(text[i], (240 - 10 * i, 600 + 30 * i), font_color=pygame.Color('White'), font_size=30) # отрисовка кнопок self.exit_btn.draw(0, 0) # выход к экрану выбора карт self.confirm_btn.draw(0, 0) # подтвердить выбранного персонажа self.left_button.draw(0, 0) # прошлый персонаж self.right_button.draw(0, 0) # следующий персонаж
def __init__(self, maps): settings_values = load_settings() self.result = -1 # переменная для отслеживания состояния экрана self.maps = maps # создание кнопок self.exit_btn = Button(-30, 615, 222, 92, '', exit_button_image, self.back, glow=glow_left) self.chr_btn = Button(-30, -30, 223, 92, '', chr_button_image, self.chr_menu, glow=glow_left) self.play_btn = Button(908, 650, 222, 92, '', play_button_image, self.start_game, glow=glow_right) self.settings_btn = Button(908, 0, 223, 92, '', settings_button_image, self.open_settings, glow=glow_right) self.active_map = 0 self.maps[0][0] -= 30 self.menu_background = self.maps[self.active_map][2].background # загрузка аудиофайла map = f'maps/{self.maps[0][2].dir}/{self.maps[0][2].general["AudioFilename"]}' pygame.mixer.music.load(map) pygame.mixer.music.set_volume(0.1 * int(settings_values['music_volume'])) pygame.mixer.music.play(-1) # загрузка рекордов для всех карт self.records = {} con = sqlite3.connect('records.db') cur = con.cursor() result = cur.execute("SELECT * FROM Records") for elem in result: # преобразование элементов словаря с рекордами # из текста в изображения с текстом elem = list(elem) elem[6] = 'Сыграно ' + elem[6] + ', ' + elem[7] elem[3] = 'Score: ' + str(elem[3]) elem[5] = 'Combo: ' + str(elem[5]) + 'x' elem[4] = str('%.2f' % elem[4]) + '%' for i in range(3, 8): elem[i] = drawing_text(str(elem[i]), (-100, -100), font_color=(255, 255, 255), font_size=15) if elem[1] in self.records: self.records[elem[1]].append(elem) else: self.records[elem[1]] = [elem] for i in self.records: self.records[i] = list(reversed(self.records[i])) self.cache = {} # кеш для быстрой отрисовки текста
def render(self): mouse = pygame.mouse.get_pos() click = pygame.mouse.get_pressed() display.blit(self.menu_background, (0, 0)) display.blit(back_mask, (0, 0)) for i, elem in enumerate(self.maps): x, y, map = elem if 1020 >= y >= -60: # отрисовка карты на экране if 500 <= mouse[0] and y <= mouse[1] <= y + 80 and mouse[ 1] <= 720 - 96: # отрисовка, если на карту наведен курсор # сдвиг прямоугольника карты влево self.maps[i][0] -= shift_v / fps self.maps[i][0] = min(self.maps[i][0], 500) self.maps[i][0] = max(470, self.maps[i][0]) display.blit(song_rect_active, (x, y)) if click[0]: # если курсор нажали # смена активной карты self.maps[self.active_map][0] += 30 self.active_map = i map = self.maps[self.active_map][2] self.menu_background = map.background self.maps[i][0] -= 30 self.maps[i][0] = min(self.maps[i][0], 500) self.maps[i][0] = max(470, self.maps[i][0]) pygame.mixer.music.load( f'maps/{map.dir}/{map.general["AudioFilename"]}') pygame.mixer.music.set_volume( 0.1 * int(settings_values['music_volume'])) pygame.mixer.music.play(-1) else: # отрисовка карты если курсор на нее не наведен if i != self.active_map: # сдвиг карты влево self.maps[i][0] += shift_v / fps self.maps[i][0] = min(self.maps[i][0], 500) self.maps[i][0] = max(470, self.maps[i][0]) display.blit(song_rect, (x, y)) song_background = map.small_background display.blit(song_background, (x, y)) title, artist, creator, version = map.title, map.artist, map.creator, map.version # отрисовка текста об карте с сохранением изображений текста if title in self.cache: display.blit(self.cache[title], (x + 130, y + 10)) else: self.cache[title] = drawing_text(title, (x + 130, y + 10), font_color=pygame.Color( 255, 255, 255), font_size=20) if artist in self.cache: display.blit(self.cache[artist], (x + 130, y + 32)) else: self.cache[artist] = drawing_text(artist, (x + 130, y + 32), font_color=pygame.Color( 200, 200, 200), font_size=15, italic=True) if version in self.cache: display.blit(self.cache[version], (x + 130, y + 50)) else: self.cache[version] = drawing_text(version, (x + 130, y + 50), font_color=pygame.Color( 255, 255, 255), font_size=23) # отрисовка кнопок, полосок меню display.blit(menu_back_plus, (0, 620)) display.blit(menu_plus, (0, 0)) self.play_btn.draw(0, 0) self.exit_btn.draw(0, 0) self.play_btn.draw(0, 0) self.chr_btn.draw(0, 0) self.settings_btn.draw(0, 0) # удаление из словаря с рекордами рекорда, если для какой-то карты их больше 6 if int(self.maps[self.active_map][2].map_id) in self.records: while len(self.records[int( self.maps[self.active_map][2].map_id)]) > 6: self.records[int(self.maps[self.active_map][2].map_id)].pop() records = self.records[int(self.maps[self.active_map][2].map_id)] else: records = [] for y, elem in enumerate(records): # отрисовка рекорда elem_id, map_id, mapset_id, score, accuracy, combo, date, time = elem y *= 90 y += 100 display.blit(records_rect, (-200, y)) display.blit(date, (10, y + 10)) display.blit(score, (10, y + 30)) display.blit(accuracy, (300, y + 60)) display.blit(combo, (10, y + 50))
def render(self): display.blit(background, (0, 0)) display.blit(self.rank, (775, 110)) # отрисовка точности игрока drawing_text(self.accuracy, (790, 400), (255, 255, 255), 60, font_type='corp_round_v1.ttf') display.blit(miss, (0, 40)) drawing_text(self.marks[0], (65, 100), (200, 0, 0), 50, font_type='corp_round_v1.ttf') # отрисовка набранных оценок display.blit(bad, (290, 40)) drawing_text(self.marks[1], (355, 100), (230, 0, 150), 50, font_type='corp_round_v1.ttf') display.blit(good, (0, 170)) drawing_text(self.marks[2], (65, 230), (0, 185, 230), 50, font_type='corp_round_v1.ttf') display.blit(great, (290, 170)) drawing_text(self.marks[3], (355, 230), (0, 230, 30), 50, font_type='corp_round_v1.ttf') display.blit(perfect, (0, 320)) drawing_text(self.marks[4], (65, 390), (255, 255, 75), 50, font_type='corp_round_v1.ttf') display.blit(marvelous, (290, 315)) drawing_text(self.marks[5], (355, 390), (235, 250, 255), 50, font_type='corp_round_v1.ttf') # отрисовка максимального комбо игрока drawing_text(self.count_combo, (210, 520), (255, 255, 255), 50, font_type='corp_round_v1.ttf') score_width = len(self.score) * 25 x = 890 - score_width // 2 drawing_text(self.score, (x, 530), (255, 255, 255), 50, font_type='corp_round_v1.ttf') self.back_btn.draw(0, 0) self.restart_btn.draw(0, 0)