[ English | 中文 | Deutsch | Español | Français | Italiano | 日本語 | 한국어 | Português | Русский ]
Pyxel (ピクセル) はPython向けのレトロゲームエンジンです。
使える色は16色のみ、同時に再生できる音は4音までなど、レトロゲーム機を意識したシンプルな仕様で、Pythonでドット絵スタイルのゲームづくりが気軽に楽しめます。
Pyxelの仕様やAPIは、PICO-8やTIC-80のデザインを参考にしています。
Pyxelはオープンソースで、無料で自由に使えます。Pyxelでレトロゲームづくりを始めましょう!
- Windows、Mac、Linux対応
- Pythonによるプログラミング
- 16色パレット
- 256x256サイズ、3画像バンク
- 256x256サイズ、8タイルマップ
- 4音同時再生、定義可能な64サウンド
- 任意のサウンドを組み合わせ可能な8ミュージック
- キーボード、マウス、ゲームパッド
- 画像・サウンド編集ツール
Pyxelにはパッケージ版とスタンドアロン版の2種類があります。
パッケージ版Pyxelでは、Pythonの拡張モジュールとしてPyxelを使用します。
pip
コマンドを使ったPythonのパッケージ管理に慣れている方や、本格的なPythonアプリケーションを開発したい方におすすめです。
Windows
Python3 (バージョン3.7以上) をインストールした後に、次のコマンドを実行します。
pip install -U pyxel
Mac
Python3 (バージョン3.7以上) をインストールした後に、次のコマンドを実行します。
pip3 install -U pyxel
Linux
SDL2パッケージ (Ubuntuの場合はlibsdl2-dev
)、Python3 (バージョン3.7以上)、python3-pip
をインストールした後に、次のコマンドを実行します。
pip3 install -U pyxel
上記で動作しない場合は、cmake
、rust
をインストールした後に、以下の手順でセルフビルドを試してみてください。
git clone https://github.com/kitao/pyxel.git
cd pyxel
make clean all RELEASE=1
pip3 install .
スタンドアロン版Pyxelでは、Pythonに依存しない単体のツールとしてPyxelを使用します。
Pythonの設定を気にせず手軽にプログラミングを始めたい方や、Pyxelのゲームをすぐに遊んでみたいという方におすすめです。
Windows
ダウンロードページから、最新版のWindows向けインストーラー (pyxel-[バージョン名]-windows-setup.exe
) をダウンロードして実行します。
Mac
Homebrew導入後に、以下のコマンドを実行します。
brew tap kitao/pyxel
brew install pyxel
Linux
SDL2パッケージ (Ubuntuの場合はlibsdl2-dev
) のインストールとHomebrewの導入後に、以下のコマンドを実行します。
brew tap kitao/pyxel
brew install 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 - マップのある横スクロールアクションゲーム
サンプルは以下のコマンドで実行できます。
cd pyxel_examples
pyxel run 01_hello_pyxel.py
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)
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()
また、シンプルなグラフィックスやアニメーションを作成する場合は、show
関数やflip
関数を使った簡易的な記述も可能です。
show
関数は画面を表示して、Esc
キーが押されるまで待機します。
import pyxel
pyxel.init(120, 120)
pyxel.cls(1)
pyxel.circb(60, 60, 40, 7)
pyxel.show()
flip
関数は画面を一度更新します。
import pyxel
pyxel.init(120, 80)
while True:
pyxel.cls(3)
pyxel.rectb(pyxel.frame_count % 160 - 40, 20, 40, 40, 7)
pyxel.flip()
作成したPythonスクリプトは次のコマンドで実行できます。
pyxel run Pythonスクリプトファイル
またパッケージ版であれば、通常のPythonスクリプトと同様に実行することもできます。
python3 Pythonスクリプトファイル
(Windowsの場合はpython3
の代わりにpython
と入力してください)
Pyxelアプリケーション実行中に、以下の特殊操作を行うことができます。
Esc
アプリケーションを終了するAlt(Option)+1
スクリーンショットをデスクトップに保存するAlt(Option)+2
画面キャプチャ動画の録画開始時刻をリセットするAlt(Option)+3
画面キャプチャ動画をデスクトップに保存する (最大10秒)Alt(Option)+0
パフォーマンスモニタ (fps、update時間、draw時間) の表示を切り替えるAlt(Option)+Enter
フルスクリーン表示を切り替える
Pyxel Editorを使って、Pyxelアプリケーションで使用する画像やサウンドを作成することができます。
Pyxel Editorは次のコマンドで起動します。
pyxel edit [Pyxelリソースファイル]
指定したPyxelリソースファイル (.pyxres) が存在する場合は読み込み、存在しない場合は指定した名前で新規にファイルを作成します。リソースファイルを省略した場合はmy_resource.pyxres
がファイル名になります。
Pyxel Editorの起動後に、別のリソースファイルをドラッグ&ドロップすることでファイルを切り替えることができます。
また、Ctrl(Cmd)
キーを押しながらリソースファイルをドラッグ&ドロップすると、現在編集中のリソースタイプ (イメージ/タイルマップ/サウンド/ミュージック) のみが読み込まれます。この操作により、複数のリソースファイルを1つにまとめることができます。
作成したリソースファイルはPyxelアプリケーションからload
関数で読み込めます。
Pyxel Editorには以下の編集モードがあります。
イメージエディタ:
イメージバンクの画像を編集する画面です。
イメージエディタ画面に画像ファイル (png/gif/jpeg) をドラッグ&ドロップすると、画像を選択中のイメージバンクに読み込むことができます。
タイルマップエディタ:
イメージバンクの画像をタイル状に並べたタイルマップを編集する画面です。
サウンドエディタ:
サウンドを編集する画面です。
ミュージックエディタ:
サウンドを再生順に並べたミュージックを編集する画面です。
Pyxel用の画像やタイルマップは以下の方法で作成することもできます。
Image.set
やTilemap.set
関数で文字列のリストから作成するImage.load
関数でPyxel向け配色の画像ファイル (png/gif/jpeg) を読み込む
Pyxel用のサウンドやミュージックは以下の方法で作成することもできます。
Sound.set
やMusic.set
関数で文字列から作成する
各関数の使い方はAPIリファレンスを参照してください。
Pyxelではプラットフォームによらず動作する、専用のアプリケーション配布ファイル形式 (Pyxelアプリケーションファイル) をサポートしています。
Pyxelアプリケーションファイル (.pyxapp) は次のコマンドで作成します。
pyxel package アプリケーションのディレクトリ 起動スクリプトファイル
リソースや追加モジュールを同梱する場合は、アプリケーションのディレクトリ内に配置してください。
作成したアプリケーションファイルは以下のコマンドで実行します。
pyxel play Pyxelアプリケーションファイル
-
width
,height
画面の幅と高さ -
frame_count
経過フレーム数 -
init(width, height, [title], [fps], [quit_key], [capture_sec])
Pyxelアプリケーションを画面サイズ (width
,height
) で初期化します。title
でウィンドウタイトル、fps
で動作フレームレート、quit_key
でアプリケーション終了キー、capture_sec
で画面キャプチャ動画の最大録画時間を指定します。
例:pyxel.init(160, 120, title="Pyxel with Options", fps=60, quit_key=pyxel.KEY_NONE, capture_sec=0)
-
run(update, draw)
Pyxelアプリケーションを開始し、フレーム更新時にupdate
関数、描画時にdraw
関数を呼びます。 -
show()
画面を表示してEsc
キーが押されるまで待機します。(通常のアプリケーションでは使用しません) -
flip()
画面を一度更新します。(通常のアプリケーションでは使用しません) -
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], [period])
そのフレームにkey
が押されたらTrue
、押されなければFalse
を返します。hold
とperiod
を指定すると、hold
フレーム以上ボタンを押し続けた時にperiod
フレーム間隔でTrue
が返ります。 -
btnr(key)
そのフレームにkey
が離されたらTrue
、離されなければFalse
を返します。 -
mouse(visible)
visible
がTrue
ならマウスカーソルを表示し、False
なら非表示にします。マウスカーソルが非表示でも座標は更新されます。
-
colors
パレットの表示色リスト。表示色は24ビット数値で指定します。Pythonリストを直接代入、取得する場合はcolors.from_list
とcolors.to_list
を使用してください。
例: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)
タイルマップtm
(0-7) を操作します。(タイルマップクラスを参照のこと) -
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)
(x
,y
) に色col
のピクセルを描画します。 -
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
) に描画します。 -
tri(x1, y1, x2, y2, x3, y3, col)
頂点が (x1
,y1
)、(x2
,y2
)、(x3
,y3
)、色col
の三角形を描画します。 -
trib(x1, y1, x2, y2, x3, y3, col)
頂点が (x1
,y1
)、(x2
,y2
)、(x3
,y3
)、色col
の三角形の輪郭線を描画します。 -
blt(x, y, img, u, v, w, h, [colkey])
イメージバンクimg
(0-2) の (u
,v
) からサイズ (w
,h
) の領域を (x
,y
) にコピーします。w
、h
それぞれに負の値を設定すると水平、垂直方向に反転します。colkey
に色を指定すると透明色として扱われます。
-
bltm(x, y, tm, u, v, w, h, [colkey])
タイルマップtm
(0-7) の (u
,v
) から、横w
個 x 縦h
個のタイルを (x
,y
) に描画します。colkey
に色を指定すると透明色として扱われます。1タイルのサイズは8x8ピクセルで、(タイルx座標, タイルy座標)
のタプルとしてタイルマップに格納されています。 -
text(x, y, s, col)
色col
の文字列s
を (x
,y
) に描画します。
-
sound(snd)
サウンドsnd
(0-63) を操作します。(サウンドクラスを参照のこと)
例:pyxel.sound(0).speed = 60
-
music(msc)
ミュージックmsc
(0-7) を操作します。(ミュージッククラスを参照のこと) -
play_pos(ch)
チャンネルch
(0-3) のサウンド再生位置を(サウンド番号, ノート番号)
のタプルとして取得します。再生停止時はNone
を返します。 -
play(ch, snd, [loop])
チャンネルch
(0-3) でサウンドsnd
(0-63) を再生します。snd
がリストの場合順に再生されます。loop
にTrue
を指定するとループ再生します。 -
playm(msc, [loop])
ミュージックmsc
(0-7) を再生します。loop
にTrue
を指定するとループ再生します。 -
stop([ch])
指定したチャンネルch
(0-3) の再生を停止します。stop()
で全チャンネルの再生を停止します。
-
width
,height
イメージの幅と高さ -
set(x, y, data)
(x
,y
) に文字列のリストでイメージを設定します。
例:pyxel.image(0).set(10, 10, ["1234", "5678", "9abc", "defg"])
-
load(x, y, filename)
(x
,y
) に画像ファイル (png/gif/jpeg) を読み込みます。 -
pget(x, y)
(x
,y
) のピクセルの色を取得します。 -
pset(x, y, col)
(x
,y
) に色col
のピクセルを描画します。
-
width
,height
タイルマップの幅と高さ -
refimg
タイルマップが参照するイメージバンク (0-2) -
set(x, y, data)
(x
,y
) に文字列のリストでタイルマップを設定します。
例:pyxel.tilemap(0).set(0, 0, ["000102", "202122", "a0a1a2", "b0b1b2"])
-
pget(x, y)
(x
,y
) のタイルを取得します。タイルは(タイルx座標, タイルy座標)
のタプルです。 -
pset(x, y, tile)
(x
,y
) にタイルを設定します。タイルは(タイルx座標, タイルy座標)
のタプルです。
-
notes
音程 (0-127) のリスト。数値が大きいほど音程は高くなり、33で'A2'(440Hz)になります。休符は-1です。 -
tones
音色 (0:Triangle / 1:Square / 2:Pulse / 3:Noise) のリスト -
volumes
音量 (0-7) のリスト -
effects
エフェクト (0:None / 1:Slide / 2:Vibrato / 3:FadeOut) のリスト -
speed
再生速度。1が一番速く、数値が大きいほど再生速度は遅くなります。120で1音の長さが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")
-
sequences
サウンド (0-63) のリストをチャンネル数分連ねた2次元リスト -
set(seq0, seq1, seq2, seq3)
全チャンネルのサウンド (0-63) のリストを設定します。空リストを指定するとそのチャンネルは再生に使用しません。
例:pyxel.music(0).set([0, 1], [2, 3], [4], [])
Pyxelには「ユーザーを混乱させる可能性がある」「使うために専門の知識が必要」などの理由から、このリファレンスには記載していない「上級者向けAPI」があります。
腕に覚えのある方は、こちらを手がかりにして、あっと驚くような作品づくりに挑戦してみてください!
不具合の報告や機能の要望はIssue Trackerで受け付けています。新しいレポートを作成する前に、同じ内容のものがないか確認をお願いします。
動作確認を行い、Issue Trackerで不具合の報告や改善の提案をしてくれる方は大歓迎です!
パッチや修正はプルリクエスト (PR) として受け付けています。提出の前に問題がすでに解決済みでないかIssue Trackerで確認をお願いします。
提出されたプルリクエストはMITライセンスで公開することに同意したものと見なされます。
PyxelはMITライセンスです。ソースコードやライセンス表示用のファイル等で、著作権とライセンス全文の表示を行えば、自由に販売や配布をすることができます。