Pyxelでレトロゲームを作ろう!(3):音を作って鳴らそう
エディタを立ち上げる
- Thonnyのメニュー項目ツール → Open system shell… をクリック
- 出てきた黒い画面に「 pyxel edit ファイル名 」を入力してエンターキーを押す! ファイル名を省略した場合は “my_resource.pyxres” というファイル名になります。
効果音を作ってみよう!
エディタが立ち上がったら、左上にある左から3番めのアイコン、波のマークをクリックしましょう。音を作るエディタが出てきます。
音を作るエディタが出てきます。
では効果音を作ってみましょう。
注意 :Escを押すとエディタが終了してしまいます。間違えて押さないように気をつけながら作業し、 こまめにセーブしましょう 。
効果音のかんたんな作り方
- 「SPEED」の数字を1~3くらいの小さい数字にする(小さい数字ほど早い音になる)
- マウスで音の形を描く(超テキトーでOKです。意外といい音になる!)
- キーボードのスペースキーを押して、鳴らしてみる!
- せっかく作ったので、セーブボタンを押してセーブ(保存)する
音のいらない部分は、キーボードのバックスペース(Back Space)やデリート(Delete)のキーで消すことができます。 いろいろな音を作ってみましょう。
作った音を消さずに、新しい音を作りたいときは、 左上の「SOUND」の番号を変えてあげましょう。
あとで、「SOUNDの○番を鳴らす」のように番号を指定してプログラムで音を鳴らすので、何番にどんな音を作ったかは覚えておいてください。
セーブボタンを押して、セーブするのを忘れないように!!!
音を鳴らすプログラムを作ろう
前回こんなプログラムを作りました。
ここに、エディタのセーブデータを読み込んで、その音を鳴らす、いう処理を追加してみましょう。
from pyxel import *init(128,128)load("my_resource.pyxres")
cls(6)text(10,60,"HELLO",5)play(0,0)
show()
3行目と、7行目が追加された部分です。
load("my_resource.pyxres")
3行目の load( ) は、エディタのセーブデータを読み込むPyxelの関数です。
引数の “my_resource.pyxres” は、エディタで作ったデータのファイル名です。(ファイル名を指定していた場合は、”ファイル名.pyxres” にしましょう)
play(0,0)
7行目のplay( )は、音を鳴らすpyxelの関数です。
1番目の数字は、音を鳴らすチャンネルの番号です。とりあえず0でOK。
2番目の数字はエディタで作った音のSOUND番号です。 音を複数作ってセーブした人は、
play(0,1)
のように、鳴らしたいSOUNDの番号を指定してあげましょう。
プログラムができたら、実行してみてください。 音がなるはず!
たくさん音を鳴らしたい……!
今のプログラムでは、実行しても音が一度しか鳴らなくて微妙です。
というわけで、次のようにプログラムを変えてみましょう。
from pyxel import *init(128,128)load("my_resource.pyxres")
while True: #ゲームの処理 play(0,0)
#画面の表示 cls(6) text(10,60,"HELLO",5)
flip()
While True:
5行目の While True: というのが、繰り返し命令です。 この命令は、While True:の下にある、右にずらして書いたプログラムを永遠に繰り返し続けます。
プログラムを右にズラすには、カーソルを行の一番左に移動させてからTabキーを押します。 ※Tabキーは、キーボードの一番左、上から3番目あたりにある、Tab もしくは矢印が書いてあるキーです
また、Thonnyやvscodeを使っているなら、前の行の一番うしろで改行(エンターキー)すると、自動的にイイカンジなインデントになります。この自動インデント機能を使うと、必要な時だけ右にずらしてくれたりして間違えにくいのでおすすめです。
この、右へのズレ具合を「インデント」と言います。 繰り返す部分(6~11行目)のズレ具合を、綺麗に揃えるのがコツです。
インデントが正しくないとプログラムがうまく動かないので、気をつけて、正しく入力しましょう。
flip()
flip() は、Pyxelの画面を表示してプログラムの実行を続ける。という関数です。
今まで使っていた show() は、画面を表示した後にプログラムを止めてしまうので、代わりに flip() を使います。
#は、プログラムの中にコメント(メモ)を書きたいときに使います。
#の後ろに書いた文章はプログラムとして実行されないので、何をしている処理なのかメモしておいてわかりやすくしたりできます。
書けたら実行してみよう!
While True: ~ flip() で繰り返すプログラムは、 なんと1秒間に30回も繰り返されるので、 当然、作った音も1秒間に30回鳴ってしまいます。面白いけど、うるさい!
ボタンを押すと音がなるようにする
if文 を使って下記のようにすれば、「キーボードのスペースを押すと音がなるプログラム」にできます。
from pyxel import *init(128,128)load("my_resource.pyxres")
while True: #ゲームの処理 if btnp(KEY_SPACE): play(0,0)
#画面の表示 cls(6) text(10,60,"HELLO",5)
flip()
if 文
if文は、「もし〇〇なら、次のコードブロックを実行する」という処理をします。条件によって、あるプログラムを動かしたり動かさなかったりしたい場合に使います。
上の例だと、 btnp(KEY_SPACE) の部分が条件です。この条件はpyxelが用意しているもので、「スペースキーが押された瞬間」という条件です。
つまり、While True: でずーっとプログラムを繰り返し実行し続け、スペースキーが押された瞬間だけ音を鳴らす、というプログラムが出来上がりました。
ゲームループ
ゲームのような、プレイヤーがなにもしなくても動き続けないといけないようなプログラムを作るためには、無限にループし続ける処理が必要になることがあります。
この仕組みは、「ゲームループ」と言われたりします。
pyxelのflip()を使う場合は、ゲームループの一番最後にflip()を記述し、一度のループ毎にゲーム画面を表示してあげましょう。