Pull to refresh

Как создать 2D игру с Python и аркадной библиотекой

Reading time8 min
Views16K

Привет, Хабр! представляю вашему вниманию перевод статьи How to create a 2D game with Python and the Arcade library автора Paul Vincent Craven


Как создать 2D игру с Python и аркадной библиотекой


Узнайте, как начать работу с Arcade, простой в использовании библиотеки Python для создания 2D-видеоигр.


image


Phython это отличный язык для людей, обучающихся программированию, и идеально подходит для тех, кто хочет "сделать что-то" а не тратить кучу времени на шаблонный код. Arcade это библиотека Python для создания 2D-видеоигр, которая проста в использовании и очень эффективна, когда вы набираетесь опыта. В этой статье я объясню, как начать использовать Python и Arcade для программирования видеоигр.


Я начал разработку на Arcade после обучения студентов с помощью библиотеки PyGame. Я преподавал лично, используя PyGame в течение почти 10 лет, и я разработал ProgramArcadeGames.com чтобы преподавать онлайн. PyGame-это здорово, но в конце концов я почувствовал, что трачу время на то, чтобы покрывать ошибки, которые никогда не исправлялись.
Я беспокоился о преподавании таких вещей, как цикл событий, который больше не был тем, как мы кодируем. У меня был целый раздел, в котором я объяснил, почему координаты Y были перевернуты. Поскольку PyGame редко обновлялся, и он основан на старой библиотеке SDL 1, а не на чем-то вроде более современного, такого как OpenGL, у меня не было большой надежды на будущее.


Я хотел создать библиотеку, которая была бы проще в использовании, более мощной и использовал некоторые из новых функций Python 3, такие как декораторы и подсказки типов. Это Аркада. И вот как надо начинать.


Установка


Arcade, как и многие другие пакеты, доступна через PyPi, что означает, что вы можете установить Arcade с помощью pip команды (или команды pipenv). Если у вас уже установлен Python, вы, вероятно, можете просто открыть командную строку в Windows и набрать:


pip install arcade

Или на MacOS и Linux типе:


pip3 install arcade

Для получения более подробной инструкции по установке, вы можете обратиться к Документация по установке аркады.


Простой рисунок


Вы можете открыть окно и создать простые рисунки с помощью всего лишь нескольких строк кода. Давайте создадим пример, который рисует смайлик, как показано на рисунке ниже:


image


Алгоритм ниже показывает, как вы можете использовать команды рисования Arcade для этого. Обратите внимание, что вам не нужно знать, как использовать классы или даже определять функции. Программирование с быстрой визуальной обратной связью отлично подходит для тех, кто хочет начать обучение программированию.


import arcade

# Set constants for the screen size
SCREEN_WIDTH = 600
SCREEN_HEIGHT = 600 

# Open the window. Set the window title and dimensions (width and height)
arcade.open_window(SCREEN_WIDTH, SCREEN_HEIGHT, "Drawing Example") 

# Set the background color to white.
# For a list of named colors see:
# http://arcade.academy/arcade.color.html
# Colors can also be specified in (red, green, blue) format and
# (red, green, blue, alpha) format.
arcade.set_background_color( arcade.color.WHITE) 

# Start the render process. This must be done before any drawing commands.
arcade.start_render() 

# Draw the face
x = 300
y = 300
radius = 200
arcade.draw_circle_filled( x, y, radius, arcade.color.YELLOW) 

# Draw the right eye
x = 370
y = 350
radius = 20
arcade.draw_circle_filled( x, y, radius, arcade.color.BLACK) 

# Draw the left eye
x = 230
y = 350
radius = 20
arcade.draw_circle_filled( x, y, radius, arcade.color.BLACK) 

# Draw the smile
x = 300
y = 280
width = 120
height = 100
start_angle = 190
end_angle = 350
arcade.draw_arc_outline( x, y, width, height, arcade.color.BLACK, start_angle, end_angle, 10) 

# Finish drawing and display the result
arcade.finish_render() 

# Keep the window open until the user hits the 'close' button
arcade.run()

Использование функции


Конечно, написание кода в глобальном контексте не очень хорошая форма. К счастью, улучшить вашу программу с помощью функций легко. Здесь мы можем увидеть пример рисования сосны в определенном (x, y) месте с использованием функции:


def draw_pine_tree(x, y) : 
    """ This function draws a pine tree at the specified location. """

    # Draw the triangle on top of the trunk.
    # We need three x, y points for the triangle.
arcade.draw_triangle_filled( x + 40, y,       # Point 1
x, y - 100,      # Point 2
x + 80, y - 100, # Point 3
arcade.color.DARK_GREEN) 

    # Draw the trunk
arcade.draw_lrtb_rectangle_filled( x + 30, x + 50, y - 100, y - 140 ,
arcade.color.DARK_BROWN)

Полный пример см. в разделе рисование с функциями.


image


Более опытный программист будет знать, что современные графические программы сначала загружают графическую информацию на видеокарту, а затем просят видеокарту нарисовать ее позже в виде пакета. Аркада также поддерживает это. Рисование 10 000 прямоугольников по отдельности занимает около 0,800 секунды. Рисование их в виде пакета занимает менее 0,001 секунды.


класс Window


Более крупные программы обычно наследуются от класса Window или используют декораторы. Это позволяет программисту писать код для обработки рисования, обновления и обработки входных данных от пользователя. Шаблон для запуска оконной программы приведен ниже.


import arcade

SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600 

class MyGame( arcade.Window): 
    """ Main application class. """

    def __init__(self, width, height) : 
        super( ) .__init__(width, height)

arcade.set_background_color( arcade.color.AMAZON) 

    def setup( self) : 
        # Set up your game here
        pass

    def on_draw(self) : 
        """ Render the screen. """
arcade.start_render() 
        # Your drawing code goes here

    def update(self, delta_time) : 
        """ All the logic to move, and the game logic goes here. """
        pass

def main( ) :
game = MyGame( SCREEN_WIDTH, SCREEN_HEIGHT)
game.setup( )
arcade.run() 

if __name__ = = "__main__":
main()

Класс Window имеет несколько методов, которые ваши программы могут переопределять для обеспечения функциональности программы. Вот некоторые из наиболее часто используемых:


on_draw: весь код для рисования экрана идет сюда.
Обновление: весь код для перемещения ваших предметов и выполнения игровой логики находится здесь. Это называется около 60 раз в секунду.
on_key_press: обрабатывать события при нажатии клавиши, например, давать игроку скорость.
on_key_release: обрабатывает при отпускании ключа, здесь вы можете остановить движение игрока.
on_mouse_motion: вызывается каждый раз, когда движется мышь.
on_mouse_press: вызывается при нажатии кнопки мыши.
set_viewport: эта функция используется в играх с прокруткой, когда ваш мир намного больше, чем то, что можно увидеть на одном экране. Вызов set_viewport позволяет программисту установить, какая часть этого мира видна в данный момент.


Спрайты


Спрайты-это простой способ создать двухмерный растровый объект в Arcade. В Arcade есть методы, которые облегчают рисование, перемещение и анимацию спрайтов. Вы также можете легко использовать спрайты для обнаружения столкновений между объектами.


Создание спрайта


Создать экземпляр класса Sprite Arcade из графики легко. Программисту нужно только имя файла изображения, чтобы спрайт был основан, и, необязательно, число, чтобы масштабировать изображение вверх или вниз. Например:


SPRITE_SCALING_COIN = 0,2

coin = arcade.Sprite("coin_01.png", SPRITE_SCALING_COIN)

Этот код создаст спрайт, используя изображение, хранящееся в coin_01.png. Изображение будет уменьшено до 20% от его первоначальной высоты и ширины.
image


Списки спрайтов


Спрайты обычно организованы в списки. Эти списки облегчают управление спрайтами. Спрайты в списке будут использовать OpenGL для пакетного рисования спрайтов как группы. Приведенный ниже код устанавливает игру с игроком и кучу монет, которые игрок собирает. Мы используем два списка, один для игрока и один для монет


def setup(self): 
    """ Set up the game and initialize the variables. """

    # Create the sprite lists
    self.player_list = arcade.SpriteList() 
    self.coin_list = arcade.SpriteList() 

    # Score
    self.score = 0 

    # Set up the player
    # Character image from kenney.nl
    self. player_sprite = arcade.Sprite("images/character.png", SPRITE_SCALING_PLAYER) 
    self.player_sprite.center_x = 50 # Starting position
    self.player_sprite.center_y = 50 
    self.player_list.append(self.player_sprite) 

    # Create the coins
    for i in range( COIN_COUNT): 

        # Create the coin instance
        # Coin image from kenney.nl
coin = arcade.Sprite("images/coin_01.png", SPRITE_SCALING_COIN) 

        # Position the coin
coin.center_x = random.randrange(SCREEN_WIDTH)
coin.center_y = random.randrange(SCREEN_HEIGHT) 

        # Add the coin to the lists
        self.coin_list.append(coin)

Мы можем легко нарисовать все монеты в списках монет:


def on_draw(self):
    """ Draw everything """
arcade.start_render()
    self.coin_list.draw()
    self.player_list.draw()

Обнаружение столкновений спрайтов


Обнаружение столкновений спрайтов
Функция check_for_collision_with_list позволяет нам увидеть, встречается ли спрайт с другим спрайтом в списке. Мы можем использовать это, чтобы увидеть все монеты, с которыми спрайт игрока соприкасается. Используя простой цикл for, мы можем избавиться от монеты из игры и увеличить наш счет.


def update(self, delta_time):
    # Generate a list of all coin sprites that collided with the player.
coins_hit_list = arcade.check_for_collision_with_list(self.player_sprite, self.coin_list)

    # Loop through each colliding sprite, remove it, and add to the score.
    for coin in coins_hit_list:
coin.kill()
        self.score += 1

Полный пример см. В разделе collect_coins.py.


Игровая физика


Многие игры включают в себя какую-то физику. Самыми простыми являются нисходящие программы, которые не позволяют игроку проходить сквозь стены. Платформеры добавляют больше сложности гравитации и движущимся платформам. В некоторых играх используется полноценный физический движок 2D с массой, трением, пружинами и многим другим.


Игры сверху вниз


image


Для простых игр сверху вниз аркадной программе нужен список стен, через которые игрок (или что-либо еще) не может пройти. Я обычно называю это wall_list. Затем физический движок создается в коде установки класса Window с помощью:


self.physics_engine = arcade.PhysicsEngineSimple(self.player_sprite, self.wall_list)

Player_sprite получает вектор движения с двумя атрибутами: change_x и change_y. Простым примером этого может быть перемещение игрока с помощью клавиатуры. Например, это может быть в настраиваемом дочернем элементе класса Window:


MOVEMENT_SPEED = 5 

def on_key_press(self, key, modifiers) : 
    """Called whenever a key is pressed. """

    if key = = arcade.key.UP: 
        self.player_sprite.change_y = MOVEMENT_SPEED
    elif key = = arcade.key.DOWN: 
        self.player_sprite.change_y = -MOVEMENT_SPEED
    elif key = = arcade.key.LEFT: 
        self.player_sprite.change_x = -MOVEMENT_SPEED
    elif key = = arcade.key.RIGHT: 
        self.player_sprite.change_x = MOVEMENT_SPEED

def on_key_release(self, key, modifiers) : 
    """Called when the user releases a key. """

    if key = = arcade.key.UP or key = = arcade.key.DOWN: 
        self.player_sprite.change_y = 0 
    elif key = = arcade.key.LEFT or key = = arcade.key.RIGHT: 
        selfplayer_sprite.change_x = 0

Хотя этот код устанавливает скорость игрока, он не перемещает игрока. В методе обновления класса Window при вызове Physics_engine.update () игрок будет перемещаться, но не через стены.


def update(self, delta_time): 
    """ Movement and game logic """

     self.physics_engine.update()

Полный пример см. В разделе sprite_move_walls.py.


Платформеры


image


Переход на платформер с боковым видом довольно прост. Программисту просто нужно переключить физический движок на PhysicsEnginePlatformer и добавить гравитационную постоянную.


self.physics_engine = arcade.PhysicsEnginePlatformer(self.player_sprite, 
                                                     self.wall_list, 
gravity_constant= GRAVITY)

Вы можете использовать такую программу, как Tiled чтобы заложить плитки / блоки, которые составляют ваш уровень.


Для примера, смотрите sprite_tiled_map.py.


Для полной 2D физики вы можете интегрировать библиотеку PyMunk.


Учись на примере


Один из лучших способов обучения — это пример. В библиотеке Аркад есть длинный список примеров программ, которые человек может использовать для создания игр. Каждый из этих примеров показывает концепцию игры, которую студенты просили на моих уроках или в Интернете на протяжении многих лет.


Запустить любую из этих демонстраций легко после установки Arcade. Каждый из примеров имеет комментарий в начале программы с командой, которую вы можете ввести в командной строке для запуска примера, например:


python -m arcade.examples.sprite_moving_platforms

Краткие сведения


Arcade позволяет начать программирование графики и игр с помощью простого для понимания кода. Многие новые программисты создали отличные игры вскоре после начала. Попробуйте!

Tags:
Hubs:
+24
Comments2

Articles