游戏介绍封面制作示例,本程序会教你如何制作游戏封面与游戏结束,充许重启游戏

"""

游戏介绍封面制作示例,本程序会教你如何制作游戏封面与游戏结束,充许重启游戏


"""

import arcade
import random
import os

SPRITE_SCALING = 0.5

SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
SCREEN_TITLE = "游戏介绍封面制作示例,注释:李兴球"

# 这些常量代表游戏的状态
INSTRUCTIONS_PAGE_0 = 0
INSTRUCTIONS_PAGE_1 = 1
GAME_RUNNING = 2
GAME_OVER = 3


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

    def __init__(self, screen_width, screen_height, title):
        """ 构造方法 """
        # 调用父类方法创建窗口
        super().__init__(screen_width, screen_height, title)

        # 设置工作目录,为用python -m 启动游戏而设
        file_path = os.path.dirname(os.path.abspath(__file__))
        os.chdir(file_path)

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

        # 起动游戏将会显示第一页,这就是一个列表的索引号
        self.current_state = INSTRUCTIONS_PAGE_0

        self.player_list = None
        self.coin_list = None

        # Set up the player
        self.score = 0
        self.player_sprite = None

        # 第一步:把每页指令图像放到列表,大小要和屏幕一样,否则会被拉伸而变得难看。
        # STEP 1: Put each instruction page in an image. Make sure the image
        # matches the dimensions of the window, or it will stretch and look
        # ugly. You can also do something similar if you want a page between
        # each level.
        self.instructions = []       # 这个列表存放每个介绍页
        texture = arcade.load_texture("images/instructions_0.png")
        self.instructions.append(texture)

        texture = arcade.load_texture("images/instructions_1.png")
        self.instructions.append(texture)

    def setup(self):
        """
        设置游戏
        """
        # 新建玩家角色列表
        self.player_list = arcade.SpriteList()
        self.coin_list = arcade.SpriteList()

        # 设置玩家
        self.score = 0
        self.player_sprite = arcade.Sprite("images/character.png", SPRITE_SCALING)
        self.player_sprite.center_x = 50
        self.player_sprite.center_y = 50
        self.player_list.append(self.player_sprite)

        for i in range(50):

            # 创建金币实例
            coin = arcade.Sprite("images/coin_01.png", SPRITE_SCALING / 3)

            # 随机放置
            coin.center_x = random.randrange(SCREEN_WIDTH)
            coin.center_y = random.randrange(SCREEN_HEIGHT)

            # 增加到金币列表
            self.coin_list.append(coin)

        # 不显示鼠标
        self.set_mouse_visible(False)

    # 第2步: 增加此函数
    def draw_instructions_page(self, page_number):
        """根据索引号取纹理图,画纹理图
        Draw an instruction page. Load the page as an image.
        """
        page_texture = self.instructions[page_number]
        arcade.draw_texture_rectangle(SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2,
                                      page_texture.width,
                                      page_texture.height, page_texture, 0)


    # 第3步: 增加此函数
    def draw_game_over(self):
        """在屏幕上画 游戏结束 和 单击重启
        Draw "Game over" across the screen.
        """
        output = "Game Over"
        arcade.draw_text(output, 240, 400, arcade.color.WHITE, 54)

        output = "Click to restart"
        arcade.draw_text(output, 310, 300, arcade.color.WHITE, 24)

    # 第4步: 定义画游戏中的角色的函数。
    # Take the drawing code you currently have in your
    # on_draw method AFTER the start_render call and MOVE to a new
    # method called draw_game.
    def draw_game(self):
        """
        画所有的角色和在得分文本
        """
        # 画所有的角色
        self.player_list.draw()
        self.coin_list.draw()

        # 把得分放在屏幕上
        output = f"Score: {self.score}"
        arcade.draw_text(output, 10, 20, arcade.color.WHITE, 14)

    # 第5步: 根据current_state索引号画不同的画面
    def on_draw(self):
        """
        Render the screen.
        """

        # 开始画
        arcade.start_render()
        # 如果是第一页,则画第一张纹理图
        if self.current_state == INSTRUCTIONS_PAGE_0:
            self.draw_instructions_page(0)

        elif self.current_state == INSTRUCTIONS_PAGE_1:
            self.draw_instructions_page(1)

        elif self.current_state == GAME_RUNNING:
            self.draw_game()

        else:                       
            self.draw_game()
            self.draw_game_over()

    # 第6步: Do something like adding this to your on_mouse_press to flip
    # between instruction pages.
    def on_mouse_press(self, x, y, button, modifiers):
        """
        单击事件,游戏启动时显示第一页,单击后显示第二页,再单击显示游戏画面。
        """

        # 单击后,如果索引号为0,则把它的值设为.INSTRUCTIONS_PAGE_1
        if self.current_state == INSTRUCTIONS_PAGE_0:
           
            self.current_state = INSTRUCTIONS_PAGE_1
        elif self.current_state == INSTRUCTIONS_PAGE_1:
            # 启动游戏
            self.setup()
            self.current_state = GAME_RUNNING
        elif self.current_state == GAME_OVER:
            # 重启游戏
            self.setup()
            self.current_state = GAME_RUNNING

    def on_mouse_motion(self, x, y, dx, dy):
        """
        当鼠标移动时调用此函数
        """
        # 角色跟随鼠标
        if self.current_state == GAME_RUNNING:
            self.player_sprite.center_x = x
            self.player_sprite.center_y = y

    # 第7步: 只有当currrent_state这个索引号为GAME_RUNNING时才更新
    def update(self, delta_time):
        """ Movement and game logic """

        # 如果current_state的值等于GAME_RUNNING
        if self.current_state == GAME_RUNNING:
            # 更新角色组
            self.coin_list.update()
            self.player_list.update()

            # 玩家和金币组的碰撞检测,返回列表
            hit_list = arcade.check_for_collision_with_list(self.player_sprite, self.coin_list)

            # 遍历碰到的金币,删除它们并加分
            for coin in hit_list:
                coin.kill()
                self.score += 1

            # 金币组长度为0,重启游戏
            if len(self.coin_list) == 0:
                self.current_state = GAME_OVER
                self.set_mouse_visible(True)


def main():
    MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
    arcade.run()


if __name__ == "__main__":
    main()