【HSPプログラミング講座#23】キーボード入力でキャラクタ(スプライト)を動かす
タイトルとURLをコピーしました
キーボード入力でキャラクタ(スプライト)を動かす
今回のHSPプログラミングはキャラクタ(スプライト)をキーボードの矢印キーを使って動かしていくプログラムを作っていきます。 RPGの主人公が画面の中を動き回るイメージです。 と言っても高度な技を使うわけではなくて、いつも通りシンプルで解りやすく説明していくので安心してください。
キーボードの入力を感知する
今回のプログラムも解りやすくするために、今までのプログラムを少し改造した感じにしています。 プログラムの内容をざっくり説明すると、画像ファイルを読み込んで、キャラクタ登録して、スプライトを表示するというやり方はほとんど変えていません。 今回のポイントとなるのはキーボードから矢印キーの入力を感知してスプライトを移動させるという部分です。 それではレッツ!プログラミング!
1行目と9行目はスプライトを使うときの「決まり事」なので説明は不要ですね。 3行目と4行目の変数は主人公の座標を入れるのに使っています。(まぁ主人公と言ってもただの草ですけど・・・) 5行目はキーボードのボタンが押されると、押したキーに合わせた数字が得られるので、その数字を「ky変数」入れるために用意しています。
7行目の「screen」はウインドウの大きさを変える命令です。 第1パラメータはウインドウ番号で0番を指定しています。つまり目に見える表示画面のサイス変更を指しています。 第2パラメータが横幅の大きさ、第3パラメータが縦幅の大きさを指定しています。
11行目は、次の12行目で読み込む画像のウインドウ番号を指しています。1番は目に見えない裏側の画面を指しているので、ここに「mapbg.bmp」の画像ファイルを読み込みます。
13行目は、裏画面に読み込んだ画像から、主人公を切り出すサイズを表しています。
14行目の第1パラメータはキャラクタ番号、第2と第3パラメータは、裏画面に読み込んだ画像から、主人公用に切り抜く座標を指しています。
16行目の「es_set」は、第1パラメータが使用するスプライト番号、第2と第3パラメータは現在の主人公のx,y座標、第4パラメータは使用するキャラクタ番号です。
18行目の「gcel」はこのあと画面に書き込むウインドウ番号を指します。0番を指定しているので目に見える画面に書き込みを行います。
ココまでのプログラムは、今までやってきたこととほとんど変わりませんよね? このあとの21行目から27行目までがキーボード入力に関するプログラムです。
21行目の「stick」ではキーボードの状態を数字で取得しています。その取得した数字を格納するために「ky変数」を5行目で準備していました。
さて問題はココからなんです。。 キーボードの状態を数字で表していますが「何番の数字がどのキーなのか?」ということです。 具体的に言うと数字の1番は「左矢印キー」、2番が「上矢印キー」、4番が「右矢印キー」、8番が「下矢印キー」となっています。 なんか数字が飛び飛びになっていて使いづらく感じますよね。。。 でもこの数字って実はとても良くできているんです。 その解説をするためには、ちょっと難しいのですが2進数というのを知っておいたほうが良いのでココで説明しますね。
2進数というのは0と1だけで数を表す方法です。 ちなみに人間がよく使っているのは10進数です。0から9までの10種類の数字を使って数を表しますよね。 コンピュータは電気信号のONとOFFだけで動作ししていて、ONの状態が1、OFFの状態が0で表されているので、2進数はコンピュータが数字を扱う上での基本なんですよ。 下記に2進数で数を表してみますね。
0 = 0
1 = 1
2 = 10
3 = 11
4 = 100
5 = 101
6 = 110
7 = 111
8 = 1000
9 = 1001
上記の左側が10進数で右側が2進数です。 10進数は10まで行くと桁が増えますが、2進数は0と1しか使えないので、すぐに桁が増えていきます。 ちなみにHSPプログラミングで2進数を表すには先頭に「0b」を入れる決まりになっています。 なので下記のようになります。
0 = 0b0
1 = 0b1
2 = 0b10
3 = 0b11
4 = 0b100
5 = 0b101
6 = 0b110
7 = 0b111
8 = 0b1000
9 = 0b1001
という感じに表現します。0bを入れないと10進数と間違えちゃいますからね。 さてココで話を少し戻しますとキーボードの上下左右の矢印キーがなんで飛び飛びになっていたのかがわかります。 下記のようになっているからです。
1 = 0b0001 = 左矢印
2 = 0b0010 = 上矢印
4 = 0b0100 = 右矢印
8 = 0b1000 = 下矢印
上記の左側が10進数、中央が2進数、右側が矢印キーです。 中央の数字はわかりやすいように4桁にして表現しています。 中央の数字をよく見てみると矢印キーごとに1桁ずつになっていることがわかりますね!? ちなみに2進数の桁のことを「ビット」を言います。 例えば「10進数の8は、2進数で言うと4ビット目が1になっている」というような言い方をします。
コンピュータの世界ではよく32ビットとか、64ビットとか耳にすることがあると思いますけど、実はこの桁数のことを言っているんですよ!(へぇ~って感じですよね)
なので4ビット目が1のときは下矢印が押されていて、0のときは押されていない。と表すことができるんです。 ちなみに「0b1111」だったら上下左右のキーが全て押されているということになります。 このように考えるとわかりやすいですね!
ちょっと説明が長くなってしまいましたが次に進みたいと思います。
23行目から26行目までの「if」は、見たこともないことをしていますね。。。。
if ky & 0b0001 : myx-=8
「&」ってなんだよ!ってツッコミが入りそうですが、ココではちょっと説明を省略しましょう。 2進数のところで頭がパンパンになっていますから。。。
簡単に説明すると「もしky変数が0b0001だったらmyx変数を8減らす」って事が書いてあります。 ここでさらに気になるのが「myx-=8」ですよね。。 これは下記と同じ意味です。
myx = myx – 8
ただ省略しているだけです。 前回のプログラミング講座でも「aaa++」が出てきましたよね。 コレと同じような感じです。 自分自身の変数を足したり引いたりするときによく使います。
これを日本語で説明すると「左矢印キーが押されていたら主人公の左に8ドット移動させる」という意味になります。 わかりますか? わからなければ繰り返し読み返してみてくださいね。
続いて27行目です。 ここでも初めて見るプログラムが出てきました。
if ky & $80 : end
先ほど2進数は「0b」を付ける学びましたが、今回出てきた「$」は16進数を表しています。 16進数は数が16に達すると桁が上がります。 簡単に触れておきますと下記のとおりです。
0 = $0
1 = $1
2 = $2
3 = $3
4 = $4
5 = $5
6 = $6
7 = $7
8 = $8
9 = $9
10= $A
11= $B
12= $C
13= $D
14= $E
15= $F
16= $10
というような感じで16進数を表しています。 2進数だと桁が大きくなりすぎて扱いにくいので16進数で表すことがよくあります。 なんとなく覚えておいてください。
ということで「$80」というのは2進数で言うと「0b10000000」になります。8ビット目が1になるとESCキーがONになったという意味です。 ESCキーを押したらこのプログラムは終了します。
次に進みましょう! 29行目は「ex_pos」です。
es_pos 0,myx,myy
この命令はスプライトの位置を移動させる命令です。 第1パラメータは移動させたいスプライト番号を指定します。 第2と第3パラメータはx,y座標です。 これは簡単なので説明は不要ですよね?
以降に続くプログラムについては以前に勉強したので問題ないと思いますが軽く説明しておきましょうかね。
redraw 0
es_draw
redraw 1
await 1000/60
goto *main
redraw 0 については初めてだったかもしれませんが、画面を書き換えないように止めています。 その間に es_draw でスプライトを表示させています(が redraw 0 で止められているので実際には表示されません) そして redraw 1 で画面を書き換えます。 これでスプライトが新しい場所に現れるのです。 await 1000/60 は「60分の1秒」だけプログラムを止めています。 これは以前にも説明しましたが、モニターの書き換えタイミングをに合わせて調整しています。
ちょっとわかりにくいと思いますが redraw はコンピュータに画面の書き換えのONとOFFを指示していますけど、await はモニターの書き換えに合わせています。 await を入れないとモニターが描き終わるまでの時間に、コンピュータの計算が速すぎて移動しすぎちゃうんです。
もう少し表現を解りやすくすると、コンピュータは絵を書き終わっているけど、モニターは画面の上から下に向かってゆっくり表示されているので、モニターが画面をまだ表示し終わってないのに、次の座標にスプライトが動いちゃうので、人間の目にはワープしたように見えちゃうんですね。
この説明でわかりました??
これですべての説明が終わりましたので、プログラムを実行して動きを確認してみてください。
この草原が主人公です!(笑) キーボードの上下左右のボタンで動かしてみてください。 押すたびに8ドットずつ移動していきますよね。
ただ、キーを押しっぱなしにして動き続けてくれないのが難点ですが。。
ポチポチたくさんキーを叩いて動かしてみてくださいね。 それから画面の端まで行くと、止まらずに消えていってしまいますね。 本当は画面端に来たら、それ以上行かないように処理を入れたいですけどね。
まぁ、できるだけプログラムを解りやすく、見やすくするために最低限のプログラムになっているので、色々な処理を付け加えていくのはこれからにしましょうね。
まとめ
だんだんプログラムが長くなってきましたが、今回のポイントはキーボードの入力を変数で受け取って、その受け取った数値によって押されたキーを判別し、主人公の位置を移動させるところです。
それから2進数の表現方法です。16進数も含めてこれから出現することがあるので覚えておいてください。 2進数の特徴としては桁が上がると下記のように数字が倍になります。
1,2,4,8,16,23,64,128、256,512・・・
なんかパソコンでよく出てくる数字ですよね。64ギガバイトとか256ギガバイトみたいな感じで。 コンピュータの電気信号のONとOFF、つまり2進数の桁数から来ていたんですね~