なでしこを明後日の方向に

日本語プログラム言語なでしこを応援しています

なでしこでゲーム作る話  #6 操作の取得

マウスとかボタンを取得する話です。 キーは「キー状態」の命令で取得できます。

キー状態は1フレームに1回だけ

ゲームで同じキーを1フレーム内に複数回取得するのは得策ではありません。 1回だけ取得して変数に入れておき、操作で条件分岐するときは変数のほうを参照します。

たとえば右を押したら主人公と敵の両方が右に動くようにしたい時。

//よくない例
もしキー状態(右キー)==1ならば、主人公移動("右")
もしキー状態(右キー)==1ならば、敵移動("右")

主人公移動("右")を処理している間に右を離したら、主人公と敵は同じ動きになりません。
確実に連動させたいなら右キーの取得は1回にする必要があります。

マウスのX,Y、ボタンの取得

ボタンの状態はキー状態(1)、キー状態(2)でそれぞれ左ボタンと右ボタンです。

どうでもいいですが、マウスボタンは左利き用にするとクリック=右ボタンになります。
画面に「クリックでスタート」と表示しておいてキー状態(1)で分岐すると変な人からクレームが来ます。

キーとマウスの取得サンプル

裏イメージとはイメージ
そのサイズ「0,0,600,400」
その可視オフ
裏イメージ画面クリア
表イメージとはイメージ
そのサイズ「0,0,600,400」
表イメージ画面クリア

■マウス
 ・X
 ・Y
 ・押
 ・離
 ・右押
 ・右離

キーとはハッシュ

//毎フレーム呼ぶ
●キー操作取得
 keyとは変数
 key1から255まで繰り返す
   もしキー状態(key)==1ならば
     キーkey = キーkey+1
   違えば
     キーkey = 0
 
 //マウス関連
 マウス.離 = (マウス.押>0) && (キー1==0)
 マウス.押 = キー1
 マウス.右離 = (マウス.右押>0) && (キー2==0)
 マウス.右押 = キー2
 xyとは変数
 xy=母艦ハンドル0,0窓ハンドル画面座標計算
 マウス.X=机上マウスX - (xyから「,」まで切り取る)
 マウス.Y=机上マウスY - (xyから「,」まで切り取る)

●キー情報表示
 txtとは変数
 txt(マウスメンバ詳細列挙)一行追加
 keyとは変数
 key1から255まで繰り返す
   txt(キーkey>0)追加
   txt「 」追加
   もしkey%16==0ならば,
     txt改行追加
 裏イメージ,5,5txt文字表示

//ゲームループ
1ループ
  キー操作取得()
  キー情報表示()
  裏イメージ表イメージ0,0画像コピー
  裏イメージ画面クリア
  0.04秒待つ

●キー操作取得について。
1~255のキー状態をハッシュにいれます。 押しっぱなしにしていたらどんどん+1して、離していたら0にします。
キー@key = キー状態(key) などとすると分岐するときに困ります。(長く押している最中か押した瞬間かの判断がつかない)

マウスのほうは怪しげなことをしているので解説。
まず■マウスのグループにX,Y,押,離,右押,右離のメンバがあります。 それぞれXY座標とボタンの押している/離した瞬間であるを記録しておくところです。

ゲームではマウスボタンを離した瞬間を決定とする作りが多いです。
「前回が押している(マウス.押>0)」かつ「今回離している(キー@1==0)」が「マウスを離した」ということです。

次がマウスのXY座標の計算。
母艦ハンドルの0,0を窓ハンドル画面座標計算 で母艦の描画領域の左上が取れるみたいなので、机上マウスXとかから引けばいいみたい。
……うちの環境ではこれで動いてるよ!

●キー情報表示について

f:id:tkizzz:20190103014433j:plain

(キー@key>0)を文字表示しているので実際の値ではないです。
キーボードを適当にさわるとどこかが反応するはず。

最後がゲームループ。
0.04秒ごとにキー1~255とマウス情報を更新して描画します。

実際のゲームでは もしマウス.離==1ならば  とか もしキー90/*Z*/==1ならば とかで操作を反映していきます。