Python街机游戏模块arcade角色移动碰墙测试

"""arcade角色移动碰墙测试.py
简单的展示如何使用基本的角色的。如果安装了Python和Arcade街机游戏模块,那么支持它就能按上下左右键来操作小人。
由于内置了简单物理引擎,所以小人碰到墙不会前进。
"""

import arcade
import os

SPRITE_SCALING = 0.5

SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
SCREEN_TITLE = "Python街机游戏模块arcade角色移动碰墙测试_翻译与改编:李兴球"

MOVEMENT_SPEED = 5


class MyGame(arcade.Window):
    """ 主应用程序类 """

    def __init__(self, width, height, title):
        """
        初始化器,首先初始化超类的同名方法。
        """
        super().__init__(width, height, title) 

        # 定义角色列表
        self.coin_list = None
        self.wall_list = None
        self.player_list = None

        # 设置角色
        self.score = 0
        self.player_sprite = None
        self.physics_engine = None

    def setup(self):
        """ 对游戏进行设置与初始化变量们。 """

        # 新建角色列表
        self.player_list = arcade.SpriteList()
        self.wall_list = arcade.SpriteList()

        # 设置角色
        self.score = 0
        self.player_sprite = arcade.Sprite("images/character.png",SPRITE_SCALING*2)
        self.player_sprite.center_x = 50            # 设置角色的中心点x坐标
        self.player_sprite.center_y = 64            # 设置角色的中心点y坐标
        self.player_list.append(self.player_sprite) # 添加到角色列表

        # -- 设置墙,就是铺一些图片
        # 创建一行墙
        for x in range(173, 650, 52):
            wall = arcade.Sprite("images/boxCrate_double.png", SPRITE_SCALING )
            wall.center_x = x
            wall.center_y = 200
            self.wall_list.append(wall)             # 添加到墙列表

        # 创建一列墙
        for y in range(273, 500, 52):
            wall = arcade.Sprite("images/boxCrate_double.png", SPRITE_SCALING)
            wall.center_x = 465
            wall.center_y = y
            self.wall_list.append(wall)

        # 添加简单物理引擎
        self.physics_engine = arcade.PhysicsEngineSimple(self.player_sprite,self.wall_list)

        # 设置背景颜色
        arcade.set_background_color(arcade.color.AMAZON)

    def on_draw(self):
        """
        渲染屏幕
        """

        # 此命令要写在开始画角色之前 
        arcade.start_render()

        # 画所有的角色
        self.wall_list.draw()
        self.player_list.draw()

    def on_key_press(self, key, modifiers):
        """当有键按下时,会调用这个方法. """

        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):
        """当有键松开时,调用这个方法 """

        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:
            self.player_sprite.change_x = 0

    def update(self, delta_time):
        """ 移动与游戏逻辑 """

        # 更新所有角色。 (此例中角色们并没有做什么.)
        self.physics_engine.update()


def main():
    """ 程序的主要方法 """
    window = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
    window.setup()
    arcade.run()


if __name__ == "__main__":
    main()