# pyxel
**Repository Path**: jrobot/pyxel
## Basic Information
- **Project Name**: pyxel
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2021-03-19
- **Last Updated**: 2021-03-30
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
#
[ [English](README.md) | [中文](README.cn.md) | [Español](README.es.md) | [Italiano](README.it.md) | [日本語](README.ja.md) | [한국어](README.ko.md) | [Português](README.pt.md) | [Русский](README.ru.md) ]
**Pyxel**是一个python的经典像素风游戏制作引擎。
由于像素风游戏的机制非常简单(如:最多只能显示16种颜色、播放4种声音等),现在你也可以轻松地享受这种游戏的制作过程。
游戏控制台以及API的设计参考了经典的[PICO-8](https://www.lexaloffle.com/pico-8.php)以及[TIC-80](https://tic.computer/)。
Pyxel是开源的,大家可以免费使用。现在就让我们一起用Pyxel制作自己的游戏吧!
## 说明
- 需要在Windows、Mac或Linux上运行
- 需要Python3
- 内置16色调色板
- 3个256x256的图像库
- 8个256x256的瓦片地图
- 4个声道各含有64个可选音调
- 可任意组合8个音乐
- 支持键盘、鼠标及游戏手柄输入
- 图像和音频编辑器
### 调色板
## 如何安装
### Windows
第一步,安装[Python3](https://www.python.org/)(3.6.8或更高版本)。
如果使用官方安装器来安装python,不要忘记勾选下图选项**将python添加到环境变量:**
第二步, 在命令提示符中输入以下`pip`指令直接安装pyxel:
```sh
pip install -U pyxel
```
### Mac
第一步,在已经安装了[Homebrew](https://brew.sh/)包管理工具的环境下,输入以下命令安装[Python3](https://www.python.org/)(3.6.8或更高版本)和必需的软件包:
```sh
brew install python3 gcc sdl2 sdl2_image gifsicle
```
你可以用其他方式安装Python3,但要注意的是,你必须安装其他库。
第二步,**重启终端**,并使用`pip3`命令安装Pyxel:
```sh
pip3 install -U pyxel
```
### Linux
为各linux发行版安装[Python3](https://www.python.org/)(3.6.8或更高版本)及其依赖包。
**Ubuntu:**
```sh
sudo apt install python3 python3-pip libsdl2-dev libsdl2-image-dev gifsicle
sudo -H pip3 install -U pyxel
```
### 其他环境
为除上述外其他环境(32位Linux、树莓派等)安装Pyxel,请按以下步骤进行构建:
#### 安装所需的工具及依赖包
- C++构建工具链(包含gcc和make命令)
- libsdl2-dev和libsdl2-image-dev
- [Python3](https://www.python.org/)(3.6.8或更高版本)和pip工具
#### 任意文件夹中执行以下命令
```sh
git clone https://github.com/kitao/pyxel.git
cd pyxel
make -C pyxel/core clean all
pip3 install .
```
### 安装例程
安装Pyxel后,可以用以下命令将Pyxe例程复制到当前文件夹:
```sh
install_pyxel_examples
```
例程包含:
- [01_hello_pyxel.py](pyxel/examples/01_hello_pyxel.py) - 最简单的应用
- [02_jump_game.py](pyxel/examples/02_jump_game.py) - 用Pyxel制作的跳跃游戏
- [03_draw_api.py](pyxel/examples/03_draw_api.py) - 绘画API的示例
- [04_sound_api.py](pyxel/examples/04_sound_api.py) - 声音API的示例
- [05_color_palette.py](pyxel/examples/05_color_palette.py) - 调色板列表
- [06_click_game.py](pyxel/examples/06_click_game.py) - 鼠标点击游戏
- [07_snake.py](pyxel/examples/07_snake.py) - 带BGM的贪吃蛇游戏
- [08_triangle_api.py](pyxel/examples/08_triangle_api.py) - 三角形绘图示例
- [09_shooter.py](pyxel/examples/09_shooter.py) - 屏幕过渡射击游戏
这些例程可以像执行正常python程序一样运行:
**Windows:**
```sh
cd pyxel_examples
python 01_hello_pyxel.py
```
**Mac / Linux:**
```sh
cd pyxel_examples
python3 01_hello_pyxel.py
```
## 使用教程
### 创建Pyxel应用
在python代码导入Pyxel模块后,首先用`init`函数指定窗口大小,然后用`run`函数启动Pyxel应用。
```python
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代码封装成如下类:
```python
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()
```
有时也可简单使用`show`和`flip`画出简单的画面和动画。
`show`函数可以显示画面直到`ESC`键按下。
```python
import pyxel
pyxel.init(120, 120)
pyxel.cls(1)
pyxel.circb(60, 60, 40, 7)
pyxel.show()
```
`flip`函数可以更新一次画面。
```python
import pyxel
pyxel.init(120, 80)
while True:
pyxel.cls(3)
pyxel.rectb(pyxel.frame_count % 160 - 40, 20, 40, 40, 7)
pyxel.flip()
```
### 快捷键
以下快捷键可以在Pyxel运行时使用:
- `Esc`
退出应用
- `Alt(Option)+1`
截屏并保存在桌面
- `Alt(Option)+2`
重置屏幕录制的开始时间
- `Alt(Option)+3`
保存屏幕录制动图(gif)到桌面(最多30秒)
- `Alt(Option)+0`
切换性能监控(fps,更新时间,画面绘制时间)
- `Alt(Option)+Enter`
切换全屏
### 如何创建源文件
内置Pyxel编辑器可以为Pyxel应用创建图片和音频。
输入以下命令启动Pyxel编辑器:
```sh
pyxeleditor [pyxel_resource_file]
```
若指定Pyxel源文件(.pyxres)存在,则加载文件,若不存在,则以指定文件名新建文件。
若未指定源文件,则命名为`my_resource.pyxres`。
启动Pyxel编辑器后,可以通过拖放来切换文件。若在按下``Ctrl``(``Cmd``)键的同时拖放源文件,则只有当前正在编辑的类型(image/tilemap/sound/music)会被加载。通过本操作可以将多个源文件合并为一个。
创建后的源文件可用`load`函数来加载。
Pyxel编辑器有以下编辑模式。
**图像编辑器:**
此模式用来编辑图像库。
通过拖动png文件至图像编辑器界面,可以将图像加载至当选择前图像库。
**瓦片地图(Tilemap)编辑器:**
此模式用来编辑瓦片地图,其中图像库的图像以瓦片的样式排列。
**音频编辑器:**
此模式用来编辑音频。
**音乐编辑器:**
此模式用来编辑将录音有序编排形成的音乐。
### 其他创建源文件的方法
Pyxel图像和瓦片地图还可以通过以下方法创建:
- 在`Image.set`或`Tilemap.set`函数中通过字符串list来生成图像
- 在Pyxel调色板中用`Image.load`函数加载png文件
Pyxel音频也可以通过以下方法创建:
- 在`Sound.set`或`Music.set`函数中通过字符串来生成音频
这些函数的具体用法请查阅API参考手册。
### 如何创建独立可执行文件
使用内置的Pyxel Packager创建独立的可执行文件,在没有python的环境下也可以执行。
要创建独立的可执行文件,请在安装了[PyInstaller](https://www.pyinstaller.org/)的环境中,使用`pyxelpackager`命令指定用于启动应用程序的Python文件,如下所示:
```sh
pyxelpackager python_file
```
进程结束后,可执行文件便会生成在`dist`文件夹下。
若应用必须包含.pyxres和.png文件,将其放在`assets`文件夹下,他们便会被打包进可执行文件中。
可以使用``-i icon_file``指令自定义应用图标。
## API参考手册
### 系统
- `width`, `height`
画面的宽和高
- `frame_count`
经过的帧数
- `init(width, height, [caption], [scale], [palette], [fps], [quit_key], [fullscreen])`
初始化Pyxel应用的画面尺寸。画面的宽和高的最大值是256。
同时可以用`caption`指定窗口标题,`scale`设定放大倍数,`palette`设定色调,`fps`设定帧率,`quit_key`可指定退出键, `fullscreen`设置是否全屏启动。其中`palette`为16个24位真彩色元素的list。
例:`pyxel.init(160, 120, caption="Pyxel with PICO-8 palette", palette=[0x000000, 0x1D2B53, 0x7E2553, 0x008751, 0xAB5236, 0x5F574F, 0xC2C3C7, 0xFFF1E8, 0xFF004D, 0xFFA300, 0xFFEC27, 0x00E436, 0x29ADFF, 0x83769C, 0xFF77A8, 0xFFCCAA], quit_key=pyxel.KEY_NONE, fullscreen=True)`
- `run(update, draw)`
启动Pyxel应用并调用`update`更新帧、`draw`绘制画面。
- `quit()`
当前帧结束后退出Pyxel应用。
- `flip()`
强制绘制画面(通常应用中不会使用)。
- `show()`
绘制画面并一直等待(通常应用中不会使用)。
### 源文件
- `save(filename)`
保存源文件(.pyxres)到执行脚本的目录下。
- `load(filename, [image], [tilemap], [sound], [music])`
从执行脚本的目录下读取源文件(.pyxres)。如果某一源文件类型指定为False,则对应类型不会被加载。
### 输入
- `mouse_x`, `mouse_y`
当前鼠标指针的位置。
- `mouse_wheel`
当前鼠标滚轮的值。
- `btn(key)`
如果`key`被按下则返回`True`,否则返回`False`([按键定义列表](pyxel/__init__.py))。
- `btnp(key, [hold], [period])`
如果`key`被按下则返回`True`。若设置了`hold`和`period`参数,则当`key`被按下持续`hold`帧时,在`period`帧间隙返回`True`。
- `btnr(key)`
如果`key`被松开,则在此帧返回`True`,否则返回`False`。
- `mouse(visible)`
如果`visible`为`True`则显示鼠标指针,为`False`则不显示。即使鼠标指针不显示,其位置同样会被更新。
### 显示
- `image(img, [system])`
操作图像库`img`(0-2)(参考Image类)。若`system`指定为`True`,则图像库可存取。
3对应字体和源文件编辑器,4对应显示画面。
例:`pyxel.image(0).load(0, 0, "title.png")`
- `tilemap(tm)`
操作瓦片地图`tm`(0-7)(参考Tilemap类)
- `clip(x, y, w, h)`
设置画面绘制区域为从(`x`, `y`)开始的宽度`w`、高度为`h`的区域。`clip()`可以将绘制区域重置为全屏。
- `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`的圆形边框。
- `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`)的三角形边框。
- `blt(x, y, img, u, v, w, h, [colkey])`
将尺寸为(`w`, `h`)的区域从图像库的(`u`, `v`)复制到(`x`, `y`)。若`w`或`h`为负值,则在水平或垂直方向上翻转。若指定了`colkey`的值,则视作透明颜色。
- `bltm(x, y, tm, u, v, w, h, [colkey])`
根据从(`u`, `v`)开始的尺寸为(`w`, `h`)的tail信息,将瓦片地图(tilemap)`tm`(0-7)绘制到(`x`, `y`)处。若指定了`colkey`的值,则视作透明颜色。瓦片地图(tilemap)中一个tail尺寸为8x8。若tail编号为0,代表图像库中(0, 0)-(7, 7)的区域,若编号为1,代表(8, 0)-(15, 0)的区域。
- `text(x, y, s, col)`
用`col`颜色在(`x`, `y`)绘制字符串`s`。
### 声音
- `sound(snd, [system])`
操作音频`snd`(0-63)(参考Sound类)。若`system`为`True`,则sound 64可存取
示例:`pyxel.sound(0).speed = 60`
- `music(msc)`
操作音乐`msc`(0-7)(参考Music类)
- `play_pos(ch)`
获取`ch`声道的音频当前播放到的位置。个位数和十位数表示note的值,百位数和千位数表示sound的数字。当播放停止时,返回-1。
- `play(ch, snd, loop=False)`
在声道`ch`(0-3)播放音频`snd`(0-63)。当`snd`是列表时,按顺序播放。
- `playm(msc, loop=False)`
播放音乐`msc`(0-7)
- `stop([ch])`
停止所有声道的播放。若指定了`ch`(0-3),则只停止对应声道。
### Image类
- `width`, `height`
图像的宽和高。
- `data`
图像中的数据(256x256的二维列表)。
- `get(x, y)`
获取图像中(`x`, `y`)位置的值。
- `set(x, y, data)`
将图像中(`x`, `y`)位置的值设置为字符串列表的值。
示例:`pyxel.image(0).set(10, 10, ["1234", "5678", "9abc", "defg"])`
- `load(x, y, filename)`
从执行脚本所在的文件夹加载png文件到(`x`, `y`)
- `copy(x, y, img, u, v, w, h)`
将图像库`img`(0-2)中从(`u`, `v`)开始的尺寸为(`w`, `h`)的区域复制到(`x`, `y`)
### Tilemap类
- `width`, `height`
瓦片地图(tilemap)的宽和高。
- `data`
瓦片地图中的数据(256x256的二维列表)
- `refimg`
瓦片地图中引用的图像库。
- `get(x, y)`
获取瓦片地图中(`x`, `y`)位置的值。
- `set(x, y, data)`
将瓦片地图中(`x`, `y`)位置的值设置为字符串列表的值。
示例:`pyxel.tilemap(0).set(0, 0, ["000102", "202122", "a0a1a2", "b0b1b2"])`
- `copy(x, y, tm, u, v, w, h)`
将瓦片地图`tm`(0-7)中从(`u`, `v`)开始的尺寸为(`w`, `h`)的区域复制到(`x`, `y`)
### Sound类
- `note`
note(音符)列表(0-127) (33 = 'A2' = 440Hz)
- `tone`
tone(音调)列表(0:Triangle / 1:Square / 2:Pulse / 3:Noise)
- `volume`
volume(音量)列表(0-7)
- `effect`
effect(音效)列表(0:None / 1:Slide / 2:Vibrato / 3:FadeOut)
- `speed`
一个note(音符)的长度(120 = 1 second per tone)
- `set(note, tone, volume, effect, speed)`
用字符串来设置note,tone,volume和effect。若tone,volume,和effect的长度比note短,则将其循环处理。
- `set_note(note)`
用'CDEFGAB'+'#-'+'0123'或'R'组成的字符串来设置note。不区分大小写,不计入空格。
示例:`pyxel.sound(0).set_note("G2B-2D3R RF3F3F3")`
- `set_tone(tone)`
用'TSPN'组成的字符串设置tone。不区分大小写,不计入空格。
示例:`pyxel.sound(0).set_tone("TTSS PPPN")`
- `set_volume(volume)`
用'01234567'组成的字符串设置volume。不区分大小写,不计入空格。
示例:`pyxel.sound(0).set_volume("7777 7531")`
- `set_effect(effect)`
用'NSVF'组成的字符串设置effect。不区分大小写,不计入空格。
示例:`pyxel.sound(0).set_effect("NFNF NVVS")`
### Music类
- `ch0`
声道0中播放的sound(0-63)列表。若列表为空,则此声道未被使用。
- `ch1`
声道1中播放的sound(0-63)列表。若列表为空,则此声道未被使用。
- `ch2`
声道2中播放的sound(0-63)列表。若列表为空,则此声道未被使用。
- `ch3`
声道3中播放的sound(0-63)列表。若列表为空,则此声道未被使用。
- `set(ch0, ch1, ch2, ch3)`
设置所有声道的音频sound(0-63)播放列表。若指定了空列表,则对应声道未被使用。
示例:`pyxel.music(0).set([0, 1], [2, 3], [4], [])`
- `set_ch0(data)`
设置声道0的音频sound(0-63)播放列表。
- `set_ch1(data)`
设置声道1的音频sound(0-63)播放列表。
- `set_ch2(data)`
设置声道2的音频sound(0-63)播放列表。
- `set_ch3(data)`
设置声道3的音频sound(0-63)播放列表。
## 如何参与
### 提交问题
使用[issue tracker](https://github.com/kitao/pyxel/issues)来提交bug报告或功能需求。
提交问题之前,请搜索issue tracker以确认没有人提出过类似的问题。
提交报告时,从[这里](https://github.com/kitao/pyxel/issues/new/choose)选取合适的模板。
### 手动测试
欢迎大家手动测试代码并提交bug,或者提出改进意见!
### 提交pull request
可以通过pull requests(PRs)形式来提交补丁或修复。请确认你的pull request对应的issue地址在issue tracker中依然是open状态。
一旦提交pull request,则默认同意在[MIT license](LICENSE)的许可下发布。
## 其他信息
- [Wiki](https://github.com/kitao/pyxel/wiki)
- [Subreddit](https://www.reddit.com/r/pyxel/)
- [Discord server (English)](https://discord.gg/FC7kUZJ)
- [Discord server (Japanese - 日本語版)](https://discord.gg/qHA5BCS)
## 许可证
Pyxel开源在[MIT license](http://en.wikipedia.org/wiki/MIT_License)下,你可以将pyxel用在你的软件中,但同时所述软件的所有版本都必须包含MIT License许可条款及版权声明。
Pyxel使用以下软件:
- [SDL2](https://www.libsdl.org/)
- [miniz-cpp](https://github.com/tfussell/miniz-cpp)
- [Gifsicle](https://www.lcdf.org/gifsicle/)