Python 的复古游戏引擎
项目描述
[英语|中文| 德语| 西班牙语| 法语| 意大利语|日本语| 한국어 | 葡萄牙语| Русский ]
Pyxel是 Python 的复古游戏引擎。
由于其灵感来自复古游戏机的简单规格,例如只能显示 16 种颜色,同时只能播放 4 种声音,您可以尽情享受制作像素艺术风格的游戏。
Pyxel 的规范和 API 受到PICO-8和TIC-80的启发。
Pyxel 是开源的,可以免费使用。让我们开始用 Pyxel 制作复古游戏吧!
规格
- 在 Windows、Mac、Linux 和 Web 上运行
- 用 Python 编程
- 16个调色板
- 256x256 大小的 3 个图像库
- 256x256 大小的 8 个瓷砖地图
- 4 个通道,64 种可定义的声音
- 8首可以组合任意声音的音乐
- 键盘、鼠标和游戏手柄输入
- 图像和声音编辑器
调色板
如何安装
视窗
安装Python3(3.7 或更高版本)后,运行以下命令:
pip install -U pyxel
苹果电脑
安装Python3(3.7 或更高版本)后,运行以下命令:
pip3 install -U pyxel
Linux
安装 SDL2 包(libsdl2-dev
适用于 Ubuntu)、Python3(3.7 或更高版本)和python3-pip
后,运行以下命令:
sudo pip3 install -U pyxel
如果上述方法不起作用,请按照Makefile中的说明尝试自行构建。
网络
参考此页面并加载 Pyxel 脚本,如下所示:
<script src="https://raw.githubusercontent.com/kitao/pyxel/main//https://cdn.jsdelivr.net/gh/kitao/pyxel/wasm/pyxel.js"></script>
尝试 Pyxel 示例
安装 Pyxel 后,将 Pyxel 的示例复制到当前目录,使用以下命令:
pyxel copy_examples
要复制的示例如下:
- 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 - 使用 Image 类进行离屏渲染
- 12_perlin_noise.py - Perlin 噪声动画
- 30SecondsOfDaylight.pyxapp -亚当的第一个 Pyxel Jam 获胜游戏
- megaball.pyxapp - Adam的街机球物理游戏
可以使用以下命令执行示例:
cd pyxel_examples
pyxel run 01_hello_pyxel.py
pyxel play 30SecondsOfDaylight.pyxapp
如何使用
创建 Pyxel 应用程序
在 python 脚本中导入 Pyxel 模块后,init
首先使用函数指定窗口大小,然后使用函数启动 Pyxel 应用程序run
。
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)
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()
运行 Pyxel 应用程序
可以使用以下命令执行创建的 Python 脚本:
pyxel run PYTHON_SCRIPT_FILE
对于打包版本,它可以像普通的 Python 脚本一样执行:
cd pyxel_examples
python3 PYTHON_SCRIPT_FILE
(对于 Windows,键入python
而不是python3
)
特殊控制
Pyxel 应用程序运行时可以执行以下特殊控制:
Esc
退出应用程序Alt(Option)+1
将屏幕截图保存到桌面Alt(Option)+2
重置截屏视频的录制开始时间Alt(Option)+3
将截屏视频保存到桌面(最长 10 秒)Alt(Option)+0
切换性能监视器(fps、更新时间和绘制时间)Alt(Option)+Enter
切换全屏
如何创建资源
Pyxel Editor 可以创建在 Pyxel 应用程序中使用的图像和声音。
它从以下命令开始:
pyxel edit [PYXEL_RESOURCE_FILE]
如果指定的 Pyxel 资源文件 (.pyxres) 存在,则加载该文件,如果不存在,则使用指定的名称创建一个新文件。如果省略资源文件,则名称为my_resource.pyxres
.
启动 Pyxel Editor 后,可以通过拖放另一个资源文件来切换文件。如果在按住键的同时拖放资源文件Ctrl(Cmd)
,则只会加载当前正在编辑的资源类型(Image/Tilemap/Sound/Music)。此操作可以将多个资源文件合并为一个。
创建的资源文件可以用load
函数加载。
Pyxel Editor 具有以下编辑模式。
图像编辑器:
编辑图像库的模式。
通过将图像文件 (png/gif/jpeg) 拖放到图像编辑器屏幕上,可以将图像加载到当前选择的图像库中。
地图编辑器:
编辑瓷砖地图的模式,其中图像库的图像以瓷砖图案排列。
声音编辑器:
编辑声音的模式。
音乐编辑:
编辑音乐的模式,其中声音按播放顺序排列。
其他资源创建方法
Pyxel图像和tilemaps也可以通过以下方法创建:
- 从具有
Image.set
函数或Tilemap.set
函数的字符串列表创建图像 Image.load
使用函数在 Pyxel 调色板中加载图像文件 (png/gif/jpeg)
也可以通过以下方法创建 Pyxel 声音:
Sound.set
使用函数或Music.set
函数从字符串创建声音
请参阅 API 参考以了解这些函数的用法。
如何分发应用程序
Pyxel 支持跨平台工作的专用应用程序分发文件格式(Pyxel 应用程序文件)。
使用以下命令创建 Pyxel 应用程序文件 (.pyxapp):
pyxel package APP_ROOT_DIR STARTUP_SCRIPT_FILE
如果应用程序应该包含资源或附加模块,请将它们放在应用程序文件夹中。
可以使用以下命令执行创建的应用程序文件:
pyxel play PYXEL_APP_FILE
API 参考
系统
-
width
,height
屏幕的宽度和高度 -
frame_count
经过的帧数 -
init(width, height, [title], [fps], [quit_key], [display_scale], [capture_scale], [capture_sec])
width
使用屏幕大小 ( , ) 初始化 Pyxel 应用程序height
。可以指定以下选项:窗口标题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)。如果False
为资源类型 (image/tilemap/sound/music
) 指定,则不会加载资源。
输入
-
mouse_x
,mouse_y
鼠标光标的当前位置 -
mouse_wheel
鼠标滚轮的当前值 -
btn(key)
True
如果按下则 返回key
,否则返回False
。(键定义列表) -
btnp(key, [hold], [repeat])
True
如果key
在该帧按下则返回,否则 返回False
。当hold
和repeat
被指定时,True
将在按住 超过帧repeat
时以帧间隔返回。key
hold
-
btnr(key)
True
如果在该帧被释放则 返回key
,否则返回False
。 -
mouse(visible)
如果visible
是True
,则显示鼠标光标。如果False
,隐藏它。即使鼠标光标没有显示,它的位置也会更新。
图形
-
colors
调色板显示颜色列表。显示颜色由 24 位数值指定。使用colors.from_list
andcolors.to_list
直接分配和检索 Python 列表。
例如org_colors = pyxel.colors.to_list(); pyxel.colors[15] = 0x112233; pyxel.colors.from_list(org_colors)
-
image(img)
操作图像库img
(0-2)。(参见图像类)
例如pyxel.image(0).load(0, 0, "title.png")
-
tilemap(tm)
操作 tilemaptm
(0-7)。(参见 Tilemap 类) -
clip(x, y, w, h)
将屏幕的绘图区域从 (x
,y
) 设置为 widthw
和 heighth
。使用 将绘图区域重置为全屏clip()
。 -
camera(x, y)
将屏幕左上角坐标更改为 (x
,y
)。将左上角坐标重置为 (0
,0
)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)
从 ( , ) 绘制一个宽度w
、高度h
和颜色的矩形。col
x
y
-
rectb(x, y, w, h, col)
从 ( , ) 绘制宽度w
、高度h
和颜色的矩形的轮廓。col
x
y
-
circ(x, y, r, col)
在 ( , )处 绘制一个半径r
和颜色的圆。col
x
y
-
circb(x, y, r, col)
在 ( , )处 绘制半径r
和颜色的圆的轮廓。col
x
y
-
elli(x, y, w, h, col)
从 ( , )绘制一个宽度w
、高度h
和颜色 的椭圆。col
x
y
-
ellib(x, y, w, h, col)
从 ( , )绘制宽度w
、高度h
和颜色 的椭圆的轮廓。col
x
y
-
tri(x1, y1, x2, y2, x3, y3, col)
x1
用 ( ,y1
), (x2
,y2
), (x3
,y3
) 和 color 绘制一个三角形col
。 -
trib(x1, y1, x2, y2, x3, y3, col)
x1
用顶点 ( ,y1
), (x2
,y2
), (x3
,y3
) 和颜色 画出三角形的轮廓col
。 -
fill(x, y, col)
x
用 color 填充与 ( ,y
) 相同颜色连接的区域col
。 -
blt(x, y, img, u, v, w, h, [colkey])
将图像库(0-2) 的 ( , ) 大小为 (w
,h
) 的区域复制到 ( , )。如果为and/or设置负值,它将水平和/或垂直反转。如果指定,则视为透明色。u
v
img
x
y
w
h
colkey
bltm(x, y, tm, u, v, w, h, [colkey])
将大小为 (w
,h
) 的区域从tilemap (0-7) 的 ( , ) 复制到 (u
, ) 。如果为and/or设置负值,它将水平和/或垂直反转。如果指定,则视为透明色。tile 的大小为 8x8 像素,并作为.v
tm
x
y
w
h
colkey
(tile_x, tile_y)
text(x, y, s, col)
在 ( , )处 绘制一串s
颜色。col
x
y
声音的
-
sound(snd)
操作声音snd
(0-63)。(参见 Sound 类)
例如pyxel.sound(0).speed = 60
-
music(msc)
操作音乐msc
(0-7)。(见音乐课) -
play_pos(ch)
将通道ch
(0-3)的声音播放位置作为(sound no, note no)
.None
播放停止时返回。 -
play(ch, snd, [tick], [loop])
snd
在通道ch
(0-3)上 播放声音(0-63)。如果snd
是一个列表,它将按顺序播放。播放开始位置可以通过tick
(1 tick = 1/120 秒) 指定。如果True
为 指定loop
,则执行循环播放。 -
playm(msc, [tick], [loop])
播放音乐msc
(0-7)。播放开始位置可以通过tick
(1 tick = 1/120 秒) 指定。如果True
为 指定loop
,则执行循环播放。 -
stop([ch])
停止播放指定频道ch
(0-3)。stop()
停止播放所有频道。
数学
-
ceil(x)
返回大于或等于 的最小整数x
。 -
floor(x)
返回小于或等于 的最大整数x
。 -
sgn(x)
为正时返回 1x
,为零时返回 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)
设置 Perlin 噪声的种子。 -
noise(x, [y], [z])
返回指定坐标的 Perlin 噪声值。
图像类
-
width
,height
图片的宽高 -
set(x, y, data)
通过字符串列表 将图像设置在 (x
, ) 处。 例如y
pyxel.image(0).set(10, 10, ["0123", "4567", "89ab", "cdef"])
-
load(x, y, filename)
x
在 ( , ) 处加载图像文件 (png/gif/jpegy
)。 -
pget(x, y)
获取 (x
,y
) 处的像素颜色。 -
pset(x, y, col)
col
在 (x
,y
)处 绘制一个颜色像素。
瓦片地图类
-
width
,height
tilemap的宽高 -
refimg
tilemap引用的图片库(0-2) -
set(x, y, data)
通过字符串列表将 tilemap 设置为 (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)
tile
在 (x
,y
)处 画一个。瓦片是 的元组(tile_x, tile_y)
。
声音类
-
notes
笔记列表 (0-127)。数字越高,音高越高,在 33 处变为“A2”(440Hz)。其余为-1。 -
tones
音调列表(0:三角形/1:方形/2:脉冲/3:噪声) -
volumes
卷列表 (0-7) -
effects
效果列表(0:None / 1:Slide / 2:Vibrato / 3:FadeOut) -
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")
音乐课
-
snds_list
带有通道数的二维声音列表(0-63) -
set(snds0, snds1, snds2, snds3)
设置所有通道的声音列表(0-63)。如果指定了一个空列表,则该通道不用于播放。
例如pyxel.music(0).set([0, 1], [2, 3], [4], [])
高级 API
Pyxel 具有本参考中未提及的“高级 API”,因为它们“可能会使用户感到困惑”或“需要专业知识才能使用”。
如果您熟悉自己的技能,请尝试以此为线索创作出令人惊叹的作品!
如何贡献
提交问题
使用问题跟踪器提交错误报告和功能/增强请求。在提交新问题之前,请确保没有类似的未解决问题。
手动测试
非常欢迎任何手动测试代码并报告问题跟踪器中的增强功能的错误或建议的人!
提交拉取请求
补丁/修复以拉取请求 (PR) 的形式被接受。确保拉取请求地址的问题在问题跟踪器中打开。
提交的 pull request 被视为同意在MIT License下发布。
其他信息
执照
Pyxel 在MIT 许可下。它可以在专有软件中重复使用,前提是该软件或其主要部分的所有副本都包含 MIT 许可条款的副本以及版权声明。
招募赞助商
Pyxel 正在 GitHub 赞助商上寻找赞助商。考虑赞助 Pyxel 进行持续维护和功能添加。赞助商可以咨询有关 Pyxel 的好处。详情请看这里。