2013/06/14

キー入力

ゲームボーイには十字キーとAボタン、Bボタン、セレクトボタン、スタートボタンがあります。
これらのキー入力でスプライトを動かしてみましょう。

Test3.c
#include <stdio.h>
#include <gb.h>

// タイルデータ
#include "testtile.c"

void main()
{
 UBYTE i;//ループ用
 UBYTE x,y;//x,y座標用
 UBYTE input;//キー入力用

 DISPLAY_OFF;// 画面全体を非表示
 HIDE_SPRITES;// スプライトを非表示

 SPRITES_8x8;// スプライトモードを8*8に設定
 set_sprite_data(0, 4, TestTileLabel); // タイルデータをスプライトとして設定(0番から4つ)

 set_sprite_tile( 0, 0);// スプライト0番にタイル0番を設定

 SHOW_SPRITES;// スプライトを表示
 DISPLAY_ON;// 画面全体を表示

 // 初期座標を設定
 x = 80;
 y = 72;

 while (1) {// 無限ループ
  input = joypad();// キー入力
  if (input & J_RIGHT) x++;// 右入力
  if (input & J_LEFT) x--;// 左入力
  if (input & J_DOWN) y++;// 下入力
  if (input & J_UP) y--;// 上入力
  move_sprite( 0, x, y);// スプライト0番の座標を設定
  
  delay(10);//10ミリ秒待つ
 }
}
これを、前回同様にコンパイルしてエミュレータで実行します。
これだけでは分からないと思いますが、十字キーを押すと、その方向へ0が動きます。

input = joypad();// キー入力
joypad()関数でキー入力を取得します。
すると、キーに対応したビットがONになりますので
if文でAND(論理積)をかけて判定します。

ゲームボーイはまだ終わってない!から抜粋させていただきますと、以下の通りとなります。

ボタン種類と定数の対応関係
ボタン種類  ボタン定数 値
 START J_START 0x80U
 SELECT J_SELECT 0x40U
 B J_B 0x20U
 A J_A 0x10U
 下 J_DOWN 0x08U
 上 J_UP 0x04U
 左 J_LEFT 0x02U
 右 J_RIGHT 0x01U

そして、main関数の中ではwhile(1)で無限ループさせています。
ループの最後にあるdelay(10)でウェイトをかけています。
この値が大きくなるほど、処理の間隔が開きますので、移動スピードが遅くなります。
ちなみに、delay()の引数の単位はミリ秒です。

0 件のコメント:

コメントを投稿