Сначала создадим папку проекта. Я назвал проект PyZelda и в папке проекта есть ещё 4 директории: audio, code, graphic и map.
Далее в папке code создадим три файла:
main.py — основной файл игры
settings.py — настройки игры: тут мы укажем настройки полей и основных данных по окну и прорисовке.
debug.py — файл дебагинга
Перед работой, не забудьте скачать библиотеку PyGame (pip install pygame)
Файл main:
import pygame, sys #импортируем библиотеки PyGame и Sysfrom settings import*#импорт из файла settingsclassGame: #основной класс игрыdef__init__(self): #создаём конструктор класса pygame.init()#конструктор использует конструкции из библиотеки PyGame self.screen = pygame.display.set_mode((WIDTH,HEIGTH)) #забирает из нашего проекта экран в виде размеров в ширину и высоту
pygame.display.set_caption("PyZelda")#Устанавливаем название нашего окна self.clock = pygame.time.Clock()#а также, забирает из проекта времяdefrun(self): #функция запуска игрыwhileTrue:#до выхода из игры она активнаfor event in pygame.event.get():#просмотр событий в игреif event.type == pygame.QUIT:#сейчас мы можем только выйти и при выходе: pygame.quit()#вызываем метод закрытия игры sys.exit()#и закрываем окно системы self.screen.fill('green')#помимо событий, указываем цвет экрана pygame.display.update()#обновляем экран self.clock.tick(FPS)#запрашиваем FPSif__name__=='__main__':#запуск игры только из main-файла game =Game()#Если файл main, то сама игра вызывает класс... game.run()#...и запускает функцию run из класса
В файле main мы запускаем игру. Создаём конструктор на базе PyGame и работаем с входными файлами и данными.
Файл setting.py:
WIDTH =1280#Ширина экранаHEIGTH =720#Высота экранаFPS =60#Число FPSTILESIZE =64#Размер тайла (квадрата текстуры)WORLD_MAP = [ #Карта мира игры. Она состоит из 20х20 квадратов['x','x','x','x','x','x','x','x','x','x','x','x','x','x','x','x','x','x','x','x'],['x',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',','x'],['x',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',','x'],['x',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',','x'],['x',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',','x'],['x',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',','x'],['x',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',','x'],['x',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',','x'],['x',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',','x'],['x',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',','x'],['x',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',','x'],['x',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',','x'],['x',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',','x'],['x',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',','x'],['x',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',','x'],['x',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',','x'],['x',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',','x'],['x',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',','x'],['x',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',','x'],['x','x','x','x','x','x','x','x','x','x','x','x','x','x','x','x','x','x','x','x'],]
В settings.py будут все настройки игры. Стандартные ширина и высота окна, а также число FPS (частота обновления окна) и самая интересная часть — размер тайла. Как я говорил ранее, тайл — это квадрат текстуры и именно этот квадрат мы описываем размерами. Высота и ширина кадра измеряется в пикселях (я установил 1280 на 720), как и сам тайл, но есть важный момент — тайл всегда квадратный. Поэтому, мы прописываем размер квадрата тайла (он у нас 64 на 64 пикселя). Далее мы создаём карту мира. Сейчас она 20 на 20 тайлов (далее в проекте будем рисовать всё тайлами). Я обозначил, что 'x' — это конец карты, а ',' — пустое место для игры.
Далее файл debug.py:
import pygame #Снова обращаемся к PyGamepygame.init()#Используем базовый конструкторfont = pygame.font.Font(None, 30)#Указываем шрифтdefdebug(info,y=10,x=10): #Сама функция дебага display_surface = pygame.display.get_surface() #Получаем ссылку на текущую установленную поверхность отображения в игре
debug_surf = font.render(str(info), True, "Red")#Рендерим текст (я сделал его красным) debug_rect = debug_surf.get_rect(topleft = (x, y)) #Указывамем место отображения инфы на экране (левый верхний угол)
pygame.draw.rect(display_surface, "White", debug_rect) #Делаем микро-консоль в виде прямоугольника (и да он белый, будет белая консоль с красным текстом)
display_surface.blit(debug_surf, debug_rect)#Собираем нашу микро-консоль с параметрами текста
В этом файле мы создадим дебаг игры. Это поле, которое мы выводим вверху слева экрана, и в нём показываем нужный нам текст. Для запуска дебага нужно импортировать debug в main-файл и вывести что-то после отрисовки окна. Примерно так (файл main.py):
import pygame, sys #импортируем библиотеки PyGame и Sysfrom settings import*#импорт из файла settingsfrom debug import debug #импортируем дебаг <------------------classGame: #основной класс игрыdef__init__(self): #создаём конструктор класса pygame.init()#конструктор использует конструкции из библиотеки PyGame self.screen = pygame.display.set_mode((WIDTH,HEIGTH)) #забирает из нашего проекта экран в виде размеров в ширину и высоту
pygame.display.set_caption("PyZelda")#Устанавливаем название нашего окна self.clock = pygame.time.Clock()#а также, забирает из проекта времяdefrun(self): #функция запуска игрыwhileTrue:#до выхода из игры она активнаfor event in pygame.event.get():#просмотр событий в игреif event.type == pygame.QUIT:#сейчас мы можем только выйти и при выходе: pygame.quit()#вызываем метод закрытия игры sys.exit()#и закрываем окно системы self.screen.fill('green')#помимо событий, указываем цвет экранаdebug('Чё как? Я дебаг!')#Дебажим <------------------ pygame.display.update()#обновляем экран self.clock.tick(FPS)#запрашиваем FPSif__name__=='__main__':#запуск игры только из main-файла game =Game()#Если файл main, то сама игра вызывает класс... game.run()#...и запускает функцию run из класса