Попробуем создать 2d платформер на игровом движке Ursina Engine.
Для начала установим пакет на Python, для этого отроем командную строку и введем команду:
pip install ursina
Создадим python файл, назвать можно как угодно, у нас будет main.py
Откроем файл в редакторе, в любом который вам нравится.
Начнем писать код. Для начала импортируем модуль Ursina, и создадим окно:
Используем встроенный платформер
Простой способ начать писать код - использовать встроенный контроллер.
Для этого импортируем его, ну и создадим объект player:
Так же существуют и другие параметры, как: jump_height, walk_speed и gravity. Но сейчас они нам не нужны.
Если сейчас запустим наш код, то мы увидим как наш объект падает вниз. Все это из-за того, что внизу нет ничего. Давайте создадим почву:
А вот теперь, наш персонаж никуда не упадет, если запустим игру. Однако, игрой это трудно назвать, поэтому:
Создадим генератор уровня
Идея заключается в том, что бы нарисовать уровень на картинке по пиксельно, дальше считать эту картинку и создать уровень.
Создадим в графическом редакторе файл: platformer_tutorial_level.png с разрешением 16px высоту и 30px в ширину. Черный цвет - грунт. Зеленый - наш игрок, где он будет находиться в самом начале запуска нашей игры. Сохраните эту картинку там же, где находится ваш файл с кодом.
Для создания уровня, мы будем считывать картинку попиксельно.
Надеюсь, у вас достаточно знаний в Python, что бы понять следующий код:
Настройка камеры
camera.position - начальная позиция нашей камеры по горизонтали.
camera.pov - устанавливает значение, сколько мы видим по вертикале.
Анимация
Если у вас есть несколько картинок, покадровых для анимации, например с именами: image_000.png, image_001.png, image_002.png и так далее, то вы просто можете засунуть их в Объект Animation так: Animation('image').
Если же у вас один файл с расширением gif, то так Animation('image.gif').
Пример: player.walk_animation = Animation('player_walk')
В встроенном контроллере, который мы добавили в самом начале, есть объект Animator. Который следит за поведением подключаемой анимации. Следит он за тем, что бы одновременно не включалось несколько анимаций, ведь иначе, они будут накладываться друг на друга.
self.animator = Animator({'idle' : None, 'walk' : None, 'jump' : None})
Противник и смерть
Добавим объект, с прикосновением об которого, наш игрок умрет.
Начала игры:
app.run()
Итог:
Всем спасибо. Не забудьте подписаться и поставить лайк.