自機の操作
キー入力
さて、とりあえず無条件で●を右に移動させましたが、
本来はキーボードの「→」を押した時に右に移動するはずです。
そのへんを作ってみましょう。
まず、次の1行を追加します。
;自機移動
stick key
player_x = player_x + 5
stickは、押されているキーの番号を変数に代入する命令です。
keyは変数の名前なのでkeyじゃなくてもOK。
何もキーが押されてなければ変数keyには0が代入されます。
もしキーボードの「←」が押されてればkeyには1が代入され、
同様に「↑」なら2、「→」なら4、「↓」なら8が代入されます。
詳しくはヘルプ(stickにカーソルを合わせて「F1」キー)を見てみましょう。
カーソルキー以外のボタンを押したときの番号も記されています。
ちなみに、二つのキーを同時に押した場合はどうなるでしょうか。
たとえば「←」なら1、「↑」なら2ですが、
この2つを同時に押すと3が代入されます。
さて、「→」が押されたとき、つまり変数keyが4だったときに
●が右に移動すればいいわけですから、プログラムは次のようになります。
;自機移動
stick key
if(key = 4){ ;→を押した
player_x = player_x + 5
}
実行して「→」を連打してみてください。
少しずつ右に移動していきますね?
同様に「←」「↑」「↓」を押した時の処理も書きましょう。
;自機移動
stick key
if(key = 4){ ;→を押した
player_x = player_x + 5
}
if(key = 1){ ;←を押した
player_x = player_x – 5
}
if(key = 2){ ;↑を押した
player_y = player_y – 5
}
if(key = 8){ ;↓を押した
player_y = player_y + 5
}
これでキーを押した方向に移動するはずです。
player_xが増えれば右、
player_yが増えれば下に移動するというのはわかりますか?
押しっぱなし
●を自由に動かすことはできましたが、
連打しないと動かないのでは操作しづらいですね。
現状ではキーを押した瞬間しか変数keyに値が代入されていません。
キーを押しっぱなしにしても値が代入されるようにしましょう。
【メモ】
この資料では、現状のように連打しなければいけない状態を「押しっぱなし無効」、
押し続けている間は値が代入される(連打してるのと同じ)状態を「押しっぱなし有効」と呼ぶことにします。
(正式には「トリガータイプキー」「非トリガータイプキー」とか言うみたいです)
先ほど書いたstick命令は変数名しか指定していませんでしたが、
2番目のパラメータで「押しっぱなしを有効にするキー」を指定することができます。
具体的には、キーを押したときに変数に代入される値…
つまり→なら4、↑なら2を指定すると、そのキーは押しっぱなし有効になります。
今回は→←↑↓の4つを指定したいので、こういう場合はすべてを足します。
要するに、4+1+2+8=15ということで、「15」を指定します。
;自機移動
stick key, 15
if(key == 4){ ;→を押した
player_x = player_x + 5
}
これで、カーソルキーは連打しなくても移動できるようになりました。
【メモ】
どんな時も押しっぱなしを有効にすればいいというわけでもありません。
たとえばRPG等のメニュー画面を作っていたとしましょう。
キーボードの↑↓でカーソルが移動するわけですが、この場合押しっぱなしを有効にしたらどうなるでしょうか?
押しっぱなし有効にするということは「押し続けている間は1秒間に60回連打する」のと同じことになります。
ということは、カーソルを1つ下の段に移動させるには1/60秒間だけ↓キーを押さないといけないということになります。
こういう場合は、素直に↓を連打しないとカーソルが動かないようにした方が操作しやすいですよね?
斜め移動
まだ問題があります。
上下左右には移動できるようになりましたが斜め移動ができません。
上に書いた通り、「←」と「↑」を同時に押したときのkeyは3になります。
しかし、keyが3だった時にどうするかというプログラムは書いてないですね。
この状態を打破する方法は2つあります。
一つ目は、単純にキーが2つ押された時の処理を追加する方法。
つまり・・・
if(key = 3){ ;←↑を押した
player_x = player_x – 5
player_y = player_y – 5
}
という感じで斜め4方向分の処理を書きます。
ですが、今回は違う書き方をします。
すでに書いてあるif文の「=」の部分を「&」に書き直してください。
;自機移動
stick key, 15
if(key & 4){ ;→を押した
player_x = player_x + 5
}
if(key & 1){ ;←を押した
player_x = player_x – 5
}
if(key & 2){ ;↑を押した
player_y = player_y – 5
}
if(key & 8){ ;↓を押した
player_y = player_y + 5
}
「key = 4」は「keyが4だったら」という意味ですが、
「key & 4」は「keyに4が含まれていたら」というような意味です。
このように書けば、たとえば←と↑を押していれば
「key&1」と「key&2」が両方成り立つので、左に移動して上に移動します。
結果として左上に移動することになります。
「&」はキー入力時のif文以外ではほとんど使うことはないと思います。
キー入力時の特別な記述と思っていいでしょう。
【メモ】
「&」が本当は何者なのかを知るには、まず「2進数」という数値の表現方法を知る必要があります。
その後に「ビット演算」等のキーワードで調べてみてください。
今回のポイント
- 「stick 変数名」と書くと、その時押しているキーの番号が変数に入る。
- キーの押しっぱなしを有効にしたい場合は、
stick命令の2番目のパラメーターに
任意のキーの番号(複数ある場合は合計)を書く - キーが押された時の処理を書くには
if(変数名 & キーの番号){
必要な処理
}
と書く。
test@iwdjfnvn1