Arcade官方教程解析8 Multiple Levels and Other Layers

"""
Platformer Game
"""
import arcade

# Constants
SCREEN_WIDTH = 1000
SCREEN_HEIGHT = 650
SCREEN_TITLE = "Platformer"

# Constants used to scale our sprites from their original size
CHARACTER_SCALING = 1
TILE_SCALING = 0.5
COIN_SCALING = 0.5

# Movement speed of player, in pixels per frame
PLAYER_MOVEMENT_SPEED = 10
GRAVITY = 1
PLAYER_JUMP_SPEED = 20


class MyGame(arcade.Window):
    """
    Main application class.
    """
    def __init__(self):

        # 调用父类并设置窗口大小和标题
        super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)

        # 地图对象
        self.tile_map = None

        # 场景对象
        self.scene = None

        # 玩家角色精灵
        self.player_sprite = None

        # 物理引擎
        self.physics_engine = None

        # 一个用于滚动屏幕的相机
        self.camera = None

        # 一个用于绘制GUI元素的相机
        self.gui_camera = None

        # 记分板
        self.score = 0

        # 加载音效
        self.collect_coin_sound = arcade.load_sound(":resources:sounds/coin1.wav")
        self.jump_sound = arcade.load_sound(":resources:sounds/jump1.wav")

        arcade.set_background_color(arcade.csscolor.CORNFLOWER_BLUE)

    def setup(self):
        """在这里设置游戏。调用此函数以重新开始游戏。"""

        # 设置相机
        self.camera = arcade.Camera(self.width, self.height)
        self.gui_camera = arcade.Camera(self.width, self.height)

        # 地图文件名
        map_name = ":resources:tiled_maps/map.json"

        # 每个图层的选项定义在一个字典中
        # 这里为平台图层配置了空间哈希检测
        layer_options = {
            "Platforms": {
                "use_spatial_hash": True,
            },
        }

        # 读取Tiled地图
        self.tile_map = arcade.load_tilemap(map_name, TILE_SCALING, layer_options)

        # 使用TileMap初始化Scene,并自动将地图的所有图层作为SpriteLists添加到Scene中
        self.scene = arcade.Scene.from_tilemap(self.tile_map)

        # 设置初始得分为0
        self.score = 0

        # 设置玩家角色精灵的位置
        image_source = ":resources:images/animated_characters/female_adventurer/femaleAdventurer_idle.png"
        self.player_sprite = arcade.Sprite(image_source, CHARACTER_SCALING)
        self.player_sprite.center_x = 128
        self.player_sprite.center_y = 128
        self.scene.add_sprite("Player", self.player_sprite)

        # --- 其他设置

        # 设置背景颜色
        if self.tile_map.background_color:
            arcade.set_background_color(self.tile_map.background_color)

        # 创建物理引擎
        self.physics_engine = arcade.PhysicsEnginePlatformer(
            self.player_sprite, gravity_constant=GRAVITY, walls=self.scene["Platforms"]
        )

    def on_draw(self):
        """绘制屏幕。"""

        # 清除屏幕为背景颜色
        self.clear()

        # 使用游戏相机绘制场景
        self.camera.use()
        self.scene.draw()

        # 使用GUI相机绘制GUI元素
        self.gui_camera.use()
        score_text = f"得分: {self.score}"
        arcade.draw_text(
            score_text,
            10,
            10,
            arcade.csscolor.WHITE,
            18,
        )

    def on_key_press(self, key, modifiers):
        """按下键盘时调用此函数。"""

        if key == arcade.key.UP or key == arcade.key.W:
            if self.physics_engine.can_jump():
                self.player_sprite.change_y = PLAYER_JUMP_SPEED
                arcade.play_sound(self.jump_sound)
        elif key == arcade.key.LEFT or key == arcade.key.A:
            self.player_sprite.change_x = -PLAYER_MOVEMENT_SPEED
        elif key == arcade.key.RIGHT or key == arcade.key.D:
            self.player_sprite.change_x = PLAYER_MOVEMENT_SPEED

    def on_key_release(self, key, modifiers):
        """释放键盘时调用此函数。"""

        if key == arcade.key.LEFT or key == arcade.key.A:
            self.player_sprite.change_x = 0
        elif key == arcade.key.RIGHT or key == arcade.key.D:
            self.player_sprite.change_x = 0

    def center_camera_to_player(self):
        """将相机居中于玩家角色。"""
        screen_center_x = self.player_sprite.center_x - (self.camera.viewport_width / 2)
        screen_center_y = self.player_sprite.center_y - (self.camera.viewport_height / 2)
        if screen_center_x < 0:
            screen_center_x = 0
        if screen_center_y < 0:
            screen_center_y = 0
        player_centered = screen_center_x, screen_center_y
        self.camera.move_to(player_centered)

    def on_update(self, delta_time):
        """游戏逻辑更新和移动处理。"""

        # 使用物理引擎移动玩家角色
        self.physics_engine.update()

        # 检查是否碰到硬币
        coin_hit_list = arcade.check_for_collision_with_list(
            self.player_sprite, self.scene["Coins"]
        )

        # 遍历每个被碰到的硬币,移除它并播放音效
        for coin in coin_hit_list:
            coin.remove_from_sprite_lists()
            arcade.play_sound(self.collect_coin_sound)
            self.score += 1

        # 摄像机跟随玩家角色
        self.center_camera_to_player()

def main():
    """主函数"""
    window = MyGame()
    window.setup()
    arcade.run()

if __name__ == "__main__":
    main()

该程序是一个平台游戏,使用arcade库进行开发。

在主函数中,创建一个MyGame对象,然后调用它的setup()方法进行初始化,并最后调用arcade的run()方法来开始游戏循环。

MyGame类继承自arcade.Window类,作为主应用程序类。在MyGame的构造函数中,设置了窗口的大小和标题,并初始化了一些变量。

setup()方法用于设置游戏,包括设置相机、加载地图、场景、玩家角色精灵和物理引擎。

on_draw()方法用于绘制屏幕,包括使用游戏相机绘制场景和使用GUI相机绘制GUI元素。

on_key_press()和on_key_release()方法用于处理键盘按下和释放事件,控制玩家角色的移动。

center_camera_to_player()方法用于将相机居中于玩家角色。

on_update()方法用于更新游戏逻辑和处理移动,包括使用物理引擎移动玩家角色、检查是否碰到硬币、播放音效和摄像机跟随玩家角色。

主函数main()创建了MyGame对象并调用了它的setup()方法,最后调用arcade的run()方法开始游戏循环。

相关推荐

  1. Arcade官方教程解析8 Multiple Levels and Other Layers

    2024-03-16 05:14:07       40 阅读
  2. CMake官方教程8--自定义命令和生成文件

    2024-03-16 05:14:07       38 阅读
  3. CMake官方教程4--使用表达式生成器

    2024-03-16 05:14:07       42 阅读
  4. CMake官方教程11--加入导出设置

    2024-03-16 05:14:07       31 阅读
  5. CMake官方教程9--打包文件

    2024-03-16 05:14:07       41 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-16 05:14:07       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-16 05:14:07       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-16 05:14:07       82 阅读
  4. Python语言-面向对象

    2024-03-16 05:14:07       91 阅读

热门阅读

  1. AJAX学习日记——Day 2

    2024-03-16 05:14:07       41 阅读
  2. Android 启动service(Kotlin)

    2024-03-16 05:14:07       29 阅读
  3. 俄罗斯方块游戏开发思路随想

    2024-03-16 05:14:07       37 阅读
  4. android api 34 编译ffmpeg with libfdk-aac

    2024-03-16 05:14:07       39 阅读
  5. 基于arm的ubuntu上运行qgc

    2024-03-16 05:14:07       38 阅读
  6. 程序员面试—反问示例

    2024-03-16 05:14:07       40 阅读
  7. Android平台架构和Android Framework的区别

    2024-03-16 05:14:07       49 阅读
  8. 现代 Android 开发的第一步Kotlin

    2024-03-16 05:14:07       44 阅读