• 使用 Python (Pyxel)制作一个经典的 Lode Runner 游戏


    本文首发于:https://code.haiyong.site/636/

    由于像素风游戏的机制非常简单(如:最多只能显示 16 种颜色、播放 4 种声音等),现在你也可以轻松地享受这种游戏的制作过程。

    说明

    • 可在 Windows、Mac、Linux 和 Web 上运行
    • 可以使用 python 进行编程
    • 16 色调色板
    • 3 个 256x256 的图像库
    • 8 个 256x256 的瓦片地图
    • 4 个音轨,每个各可含有 64 个音符
    • 可任意组合 8 个音乐
    • 支持键盘、鼠标及游戏手柄输入
    • 图像和音频编辑器

    调色板

    在这里插入图片描述
    在这里插入图片描述

    如何安装

    Windows

    在安装Python3(3.7 或更高版本)之后,执行以下命令:

    pip install -U pyxel
    
    • 1

    Mac

    在安装Python3(3.7 或更高版本)之后,执行以下命令:

    pip3 install -U pyxel
    
    • 1

    Linux

    安装 SDL2(Ubuntu 下包名为:libsdl2-dev),Python3(3.7 或更高版本),以及python3-pip这三个包之后,执行以下命令:

    sudo pip3 install -U pyxel
    
    • 1

    Web

    使用 Pyxel Web Launcher 或 HTML 的自定义元素,你可以在 Web 浏览器中运行 Pyxel,而无需任何安装工作。

    尝试 Pyxel 例程

    以 Python 包版本为例,安装 Pyxel 后,用以下命令将 Pyxe 例程复制到当前文件夹:

    pyxel copy_examples
    
    • 1

    例程包含:

    • 01_hello_pyxel.py - 最简单的应用
    • 02_jump_game.py - 用 Pyxel 制作的跳跃游戏
    • 03_draw_api.py - 绘画 API 的使用示例
    • 04_sound_api.py - 声音 API 的使用示例
    • 05_color_palette.py - 调色板列表
    • 06_click_game.py - 鼠标点击游戏
    • 07_snake.py - 带 BGM 的贪吃蛇游戏
    • 08_triangle_api.py - 三角形绘画 API 的使用示例
    • 09_shooter.py - 屏幕过渡射击游戏
    • 10_platformer.py - 屏幕横向滑动的游戏示例
    • 11_offscreen.py - 用图像类进行屏外渲染
    • 12_perlin_noise.py - 佩林噪音动画
    • 30SecondsOfDaylight.pyxapp - 第 1 届 Pyxel Jam 比赛获胜者是 Adam
    • megaball.pyxapp - 商场球类物理游戏

    运行例程,可以使用以下命令:

    cd pyxel_examples
    pyxel run 01_hello_pyxel.py
    pyxel play 30SecondsOfDaylight.pyxapp
    
    • 1
    • 2
    • 3

    使用教程

    创建 Pyxel 应用

    在 python 文件中导入 Pyxel 包后,首先使用init函数指定窗口大小,然后使用run函数启动 Pyxel 应用。

    import pyxel
    
    pyxel.init(160, 120)
    
    def update():
        if pyxel.btnp(pyxel.KEY_Q):
            pyxel.quit()
    
    def draw():
        pyxel.cls(0)
        pyxel.rect(10, 10, 20, 20, 11)
    
    pyxel.run(update, draw)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    run函数的两个参数update函数和draw函数分别用来在需要时更新帧和绘制画面。

    实际应用中,建议将 pyxel 代码封装成如下类:

    import pyxel
    
    class App:
        def __init__(self):
            pyxel.init(160, 120)
            self.x = 0
            pyxel.run(self.update, self.draw)
    
        def update(self):
            self.x = (self.x + 1) % pyxel.width
    
        def draw(self):
            pyxel.cls(0)
            pyxel.rect(self.x, 0, 8, 8, 9)
    
    App()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    运行 Pyxel 应用

    创建的 Python 脚本可以使用以下命令执行

    pyxel run PYTHON_SCRIPT_FILE
    
    • 1

    对于 python 包版本,可以像普通 Python 脚本一样执行:

    cd pyxel_examples
    python3 PYTHON_SCRIPT_FILE
    
    • 1
    • 2

    (在 Windows 中,使用python命令来替代python3

    快捷键

    以下快捷键可以在 Pyxel 运行时使用:

    • Esc

      退出应用
    • Alt(Option)+1

      截屏并保存在桌面
    • Alt(Option)+2

      重置屏幕录制的开始时间
    • Alt(Option)+3

      保存屏幕录制动图到桌面(最多 10 秒)
    • Alt(Option)+0

      切换性能监控(fps,更新时间,画面绘制时间)
    • Alt(Option)+Enter

      切换全屏

    如何创建源文件

    在 Pyxel 应用中使用的图像和音效,可以使用 Pyxel 编辑器进行制作。

    Pyxel 编辑器使用以下命令启动:

    pyxel edit [PYXEL_RESOURCE_FILE]
    
    • 1

    若指定 Pyxel 源文件(.pyxres)存在,则加载文件,若不存在,则以指定文件名新建文件。

    若未指定源文件,则命名为my_resource.pyxres

    Pyxel 编辑器启动后,可以拖放其他源文件进行切换。如果源文件被拖拽并在按下Ctrl(Cmd)键时释放,则只有当前正在编译的类型(图像、瓦片地图、音效、音乐)会被加载。这个操作允许将多种类型的源文件合并入一个源文件中。

    创建的源文件可以使用load函数加载。

    Pyxel 编辑器有以下编辑模式。

    图像编辑器:

    此模式用来编辑图像库。

    在这里插入图片描述

    通过将图像文件拖放进图像编辑器,图像可以加载进当前的图像库中。

    瓦片地图(Tilemap)编辑器:

    此模式用来编辑瓦片地图,其中图像库的图像以瓦片的样式排列。

    在这里插入图片描述

    音频编辑器:

    此模式用来编辑音频。

    在这里插入图片描述

    音乐编辑器:

    此模式用来编辑将录音有序编排形成的音乐。

    在这里插入图片描述

    其他创建源文件的方法

    Pyxel 图像和瓦片地图也可以通过以下方法创建:

    • 使用Image.setTilemap.set函数,从字符串列表创建图片
    • 使用Image.load函数从加载图像文件至 pyxel 调色板中

    Pyxel 声音也可以通过以下方法创建:

    • 使用Sound.setMusic.set函数,从字符串列表中创建声音

    这些函数的具体用法请查阅 API 参考手册。

    如何发布应用

    Pyxel 支持跨平台的应用文件格式(Pyxel 应用文件)。

    使用以下命令创建 Pyxel 应用文件(.pyxapp):

    pyxel package APP_ROOT_DIR STARTUP_SCRIPT_FILE
    
    • 1

    如果应用需要包含源文件或扩展模块,将他们放在应用文件夹。

    创建好的应用文件使用以下命令执行:

    pyxel play PYXEL_APP_FILE
    
    • 1

    API 参考手册

    系统

    • width, height

      画面的宽和高

    • frame_count

      目前为止,经过的总帧数

    • init(width, height, [title], [fps], [quit_key], [display_scale], [capture_scale], [capture_sec])

      使用屏幕尺寸(widthheight)初始化 Pyxel 应用。以下属性为可选配置项:窗口标题title,帧率fps,应用退出按键quit_key, 用 "display_scale "来决定显示的比例, 用 "capture_scale "来决定屏幕捕捉的比例,以及屏幕捕获的最长记录时间capture_sec

      示例:pyxel.init(160, 120, title="My Pyxel App", fps=60, quit_key=pyxel.KEY_NONE, capture_scale=3, capture_sec=0)

    • run(update, draw)

      启动 Pyxel 应用,并调用update函数刷新画面帧,并使用draw函数渲染画面。

    • show()

      显示屏幕直到Esc键被按下。

    • quit()

      退出 Pyxel 应用。

    源文件

    • load(filename, [image], [tilemap], [sound], [music])

      加载源文件(.pyxres)。如果某文件类型(image/tilemap/sound/music)被指定为False,则源文件中对应类型不会加载。

    输入

    • mouse_x, mouse_y

      当前鼠标指针的位置。

    • mouse_wheel

      当前鼠标滚轮的值。

    • btn(key)

      如果key被按下则返回True,否则返回False(按键定义列表)。

    • btnp(key, [hold], [repeat])

      如果key被按下则返回True。若设置了holdrepeat参数,则当key被按下持续hold帧时,在repeat帧间隙返回True

    • btnr(key)

      如果key被松开,则在此帧返回True,否则返回False

    • mouse(visible)

      如果visibleTrue则显示鼠标指针,为False则不显示。即使鼠标指针不显示,其位置同样会被更新。

    显示

    • colors

      展示调色板可以显示的颜色列表。颜色以 24 位数值格式进行展示。使用colors.from_listcolors.to_list直接指定货检索 Python 列表。

      示例:org_colors = pyxel.colors.to_list(); pyxel.colors[15] = 0x112233; pyxel.colors.from_list(org_colors)

    • image(img)

      直接操作图像库img (0-2)。(参考前文 Image 类)

      示例:pyxel.image(0).load(0, 0, "title.png")

    • tilemap(tm)

      操作瓦片地图tm(0-7)(参考前文 Tilemap 类)

    • clip(x, y, w, h)

      设置画面绘制区域为从(x, y)开始的宽度w、高度为h的区域。clip()可以将绘制区域重置为全屏。

    • camera(x, y)

      Change the upper left corner coordinates of the screen to (x, y). Reset the upper left corner coordinates to (0, 0) with camera().

    • pal(col1, col2)

      绘制时用col1颜色代替col2颜色。pal()可以重置为初始色调。

    • cls(col)

      col颜色清空画面。

    • pget(x, y)

      获取(x, y)处的像素颜色。

    • pset(x, y, col)

      col颜色在(x, y)处绘制一个像素点。

    • line(x1, y1, x2, y2, col)

      col颜色画一条从(x1, y1)到(x2, y2)的直线。

    • rect(x, y, w, h, col)

      col颜色绘制一个从(x, y)开始的宽为w、高为h的矩形。

    • rectb(x, y, w, h, col)

      col颜色绘制从(x, y)开始的宽为w、高为h的矩形边框。

    • circ(x, y, r, col)

      col颜色绘制圆心为(x, y),半径为r的圆形。

    • circb(x, y, r, col)

      col颜色绘制圆心为(x, y),半径为r的圆形边框。

    • elli(x, y, w, h, col)

      从(x, y)画一个宽度w, 高度h, 颜色col的椭圆。

    • ellib(x, y, w, h, col)

      从(x, y)画出一个宽w, 高h, 颜色col的椭圆轮廓。

    • tri(x1, y1, x2, y2, x3, y3, col)

      col颜色绘制顶点分别为(x1, y1),(x2, y2),(x3, y3)的三角形。

    • trib(x1, y1, x2, y2, x3, y3, col)

      col颜色绘制顶点分别为(x1, y1),(x2, y2),(x3, y3)的三角形边框。

    • fill(x, y, col)

      从(x, y)画一个宽度w, 高度h, 颜色col的椭圆。

    • blt(x, y, img, u, v, w, h, [colkey])

      将尺寸为(w, h)的区域从图像库的(u, v)复制到(x, y)。若wh为负值,则在水平或垂直方向上翻转。若指定了colkey的值,则视作透明颜色。

    在这里插入图片描述

    • bltm(x, y, tm, u, v, w, h, [colkey])

      从瓦片图tm(0-7)的(uv)复制大小为(wh)的区域到(xy)。如果为w和/或h设置了负值,它将在水平和/或垂直方向上反转。如果指定了 colkey,将被视为透明色。瓦片的大小是 8x8 像素,以(tile_x, tile_y)的元组形式存储在瓦片图中。

    在这里插入图片描述

    • text(x, y, s, col)

      col颜色在(x, y)绘制字符串s

    声音

    • sound(snd)

      操作音频snd(0-63)。(参考 Sound 类)

      示例:pyxel.sound(0).speed = 60

    • music(msc)

      操作音乐msc(0-7)(参考 Music 类)

    • play_pos(ch)

      获取通道ch (0-3)中音频重播位置(sound no, note no)。若重播被停止则返回None

    • play(ch, snd, [tick], [loop])

      播放通道ch (0-3)中的声音snd (0-63)。如果声音snd是一个列表,则按顺序播放。播放开始位置可以通过 tick (1 tick = 1/120 秒)指定。如果loop被指定为True则循环播放。

    • playm(msc, [tick], [loop])

      播放音乐msc (0-7)。播放开始位置可以通过 tick (1 tick = 1/120 秒)指定。如果loop被指定为True则循环播放。

    • stop([ch])

      停止指定通道ch (0-3)的重播。stop()可以停止所有通道的播放。

    数学

    • ceil(x)

      返回大于或等于x的最小的整数。

    • floor(x)

      返回小于或等于x的最大整数。

    • sgn(x)

      x是正数时返回 1,当它是零时返回 0,当它是负数时返回 1。

    • sqrt(x)

      返回x的平方根。

    • sin(deg)

      返回deg度的正弦。

    • cos(deg)

      返回deg度的余弦。

    • atan2(y, x)

      返回y/x的正切,单位是度。

    • rseed(seed: int)

      设置随机数发生器的种子。

    • rndi(a, b)

      返回一个大于或等于a且小于或等于b的随机整数。

    • rndf(a, b)

      返回一个大于或等于a且小于或等于b的随机小数。

    • nseed(seed)

      设置佩林噪声的种子。

    • noise(x, [y], [z])

      返回指定坐标的佩林噪声值。

    Image 类

    • width, height

      图像的宽和高。

    • data

      图像中的数据(256x256 的二维列表)。

    • get(x, y)

      获取图像中(x, y)位置的值。

    • set(x, y, data)

      使用字符串列表设置坐标(x, y)处的图像。

      示例:pyxel.image(0).set(10, 10, ["0123", "4567", "89ab", "cdef"])

    • load(x, y, filename)

      在(x, y)处加载图像文件(png/gif/jpeg)。

    Tilemap 类

    • width, height

      瓦片地图(tilemap)的宽和高。

    • refimg

      被瓦片地图 tilemap 引用的图像库(0-2)。

    • set(x, y, data)

      使用字符串列表在坐标(x, y)处设置瓦片地图。

      示例:pyxel.tilemap(0).set(0, 0, ["0000 0100 a0b0", "0001 0101 a1b1"])

    • pget(x, y)

      得到(x, y)处的瓦片。瓦片数据为元组(tile_x, tile_y)

    • pset(x, y, tile)

      在(x, y)处画出瓦片tile。瓦片数据为元组(tile_x, tile_y)

    Sound 类

    • notes

      音符列表(0-127),数字越高,音调越高。数字达到 33 时,音调就达到’A2’(440Hz)。其余为-1.

    • tones

      音色列表(0:三角波 / 1:方波 / 2:脉冲 / 3:噪声)

    • volumes

      音量列表(0-7)

    • effects

      音效列表(0:无 / 1:滑动 / 2:颤音 / 3:淡出)

    • speed

      播放速度。1 为最快,数字越大,速度越慢。数字 120 时,每个音符长度为 1 秒。

    • set(notes, tones, volumes, effects, speed)

      使用字符串设置音符、音色、音量及音效。如果音色、音量及音效的字符串比音符字符串短,则从开头重复。

    • set_notes(notes)

      使用由’CDEFGAB’+‘#-’+'0123’或’R’组成的字符串设置音符。大小写不敏感,且空格会被忽略。

      示例:pyxel.sound(0).set_notes("G2B-2D3R RF3F3F3")

    • set_tones(tones)

      使用由’TSPN’组成的字符串设置音色。大小写不敏感,且空格会被忽略。

      示例:pyxel.sound(0).set_tones("TTSS PPPN")

    • set_volumes(volumes)

      使用由’01234567’组成的字符串设置音量。大小写不敏感,且空格会被忽略。

      示例:pyxel.sound(0).set_volumes("7777 7531")

    • set_effects(effects)

      使用由’NSVF’组成的字符串设置音效。大小写不敏感,且空格会被忽略。

      示例:pyxel.sound(0).set_effects("NFNF NVVS")

    Music 类

    • snds_list

      二维的声音列表(0-63),带有通道的数量。

    • set(snds0, snds1, snds2, snds3)

      设置所有通道的声音(0-63)列表。如果指定了空列表,则对应通道不会用来播放。

      示例:pyxel.music(0).set([0, 1], [2, 3], [4], [])

    高级 APIs

    Pyxel 还有一些“高级 API”,出于“可能令用户感到迷惑”、“需要专业知识”等一些原因,在本文尚未提及。

    ⭐️ 优质书籍推荐

    在这里插入图片描述

    【内容简介】

    本书以理论结合编程开发为原则,使用Python作为开发语言,讲解最优化算法的原理和应用,详细介绍了Python基础、Gurobi 优化器、线性规划、整数规划、多目标优化、动态规划、图与网络分析、智能优化算法。对于算法部分的每一种算法都包含原理和编程实践,使读者对最优化算法的认识更加深入。

    目录

    • 第1章 最优化算法概述
    • 第2章 Python编程方法
    • 第3章 Gurobi优化器
    • 第4章 线性规划
    • 第5章 整数规划
    • 第6章 多目标优化
    • 第7章 动态规划
    • 第8章 图与网络分析
    • 第9章 智能优化算法

    📚 京东购买链接:《Python最优算法实战》
    📚 当当购买链接:《Python最优算法实战》

    本文资料下载链接:https://code.haiyong.site/636/

  • 相关阅读:
    EIGRP_协议知识点
    代码检查过程中为什么需要涉及到编译呢?
    酒店数字化转型,就从这4步开始
    代码随想录 | Day 45 - LeetCode 70. 爬楼梯 (进阶)、LeetCode 322. 零钱兑换、LeetCode 279.完全平方数
    一个.Net版本的ChatGPT SDK
    springboot+vue.js大学生竞赛报名作品评分管理系统
    【leetcode】【2022/8/22】655. 输出二叉树
    与AI结对编程式是什么体验 Copilot vs AlphaCode, Codex, GPT-3
    MyBatis 面试题(八)
    FFmpeg安卓平台编译
  • 原文地址:https://blog.csdn.net/qq_53544522/article/details/127645961