if(Xキーが押されている)

2002年度ゲームプログラミング
ゲームプログラミング
第6回:ラケットを動かそう!
(キーボードによる物体の操作)
2002年度ゲームプログラミング
キーボードの入力を処理する

ライブラリーのパッド入力関数を使用

ゲーム機のパッド入力に対応していて、方向
キーとボタン(4個)の入力情報を得られる

プレイヤーごとに方向キー(4種類)、ボタン(4
種類)をあらかじめ登録しておくことが必要
※ボタンを沢山使いたい人は、ライブラリーを使
用せず別途プログラムを書くことも可能
2002年度ゲームプログラミング
使用するキーの登録
使用キーを登録する関数
joy_keymap(1,VK_UP,VK_DOWN,
VK_LEFT, VK_RIGHT,
'Z', 'X', 'C', 'V');
最初の引数:登録するプレイヤー
続く4つ:上下左右の方向にあたるキー
最後の4つ:ボタン1~4(英数字は‘で囲む)


whileループの前に登録しておこう
2002年度ゲームプログラミング
ボタン入力情報の取得
ボタン情報を取得する関数
int joy_bt(1,1);
 最初の引数がプレイヤー番号、二つ目の引
数がボタン番号(1,1だとZキー)
 int型の関数なので、整数の値が返ってくる
返り値は2種類
1:ボタンが押されている
0:ボタンが押されていない

2002年度ゲームプログラミング
キー入力に対応する文を表示
 処理の流れ
if(Zキーが押されている){
Hello!と表示
}
if(Xキーが押されている){
Good evening! と表示
}
2002年度ゲームプログラミング
if文の条件



もしZキーが押されていたら
if( joy_bt(1,1)==1) // joy_btが1なら
以下のようにも書ける
if( joy_bt(1,1)!=0) // joy_btが0以外なら
条件に等号、不等号ではなく単独の値を入れ
ると、入れた値が0かそうでないかで判断する。
(!=0に相当)
if( joy_bt(1,1)) // joy_btが0以外なら
2002年度ゲームプログラミング
文字の表示(おさらい)


表示準備
#include “stdio.h” //プログラムの頭に
char message[256]; //関数の頭に
実際の表示
sprintf(message,”hello”),
txt_window(0,0,640,480),
txt_print(message);
2002年度ゲームプログラミング
バーを動かそう



バーもボールと同様に、どこにあるかを示す
のに変数を使う。
左右にしか動かないので、barxだけ宣言
int barx=100; //宣言と初期値代入
gp1.bmpの3段目に、横に並べて美しい
バー用のキャラクターがある
→それを横に3つ並べてバーに
2002年度ゲームプログラミング
バーの表示


バーのキャラクターをdef_char()で設定する
0番はボール(0,0)
1、2番は壁(0,32)、(32,32)だったので、
3番をバー(0,64)に設定
def_char(sp,3,0,64,32,32);
for文で3回繰り返して横に並べよう
for(i=0;i<3;i++){
sp_set(sp,3,barx+i*32,448,1);
}
2002年度ゲームプログラミング
方向キーの入力を得る
方向キーの入力を得る関数
int joy_dir(1); //引数:プレイヤー番号
 返り値は押されている方向によって1~9が返
る
789
456
(キーボードのテンキーに対応)
123
例:↑を押している:返り値8
←と↓を押している:返り値1
何も押していない:返り値5

2002年度ゲームプログラミング
joy_dirを判定に使う




上が押されていたら
if(joy_dir(1)==8)
// 返り値が8
斜め上(左右との同時押し)にも対応させたい
場合は
if(joy_dir(1)>=7)
// 返り値7以上
左が押されていたら
if(joy_dir(1)==4)
// 返り値が4
斜め左(上下と同時)にも対応させたい場合は
if(joy_fir(1)%3==1) // 3で割ると1余る
2002年度ゲームプログラミング
方向キーでバーを動かす
 バーを動かす
→barxの値を変える
 右が押されていたら
→barxの値を増やす
 左が押されていたら
→barxの値を減らす
 バーが画面からはみ出ないように注意
2002年度ゲームプログラミング
押した回数をカウント(1)

回数の保存と表示(前回の復習)
int p = 0; // 宣言
sprintf(message,”%3d”,p);
//変数の値をmessageに書く

ボタンを押したらpを足す
→単純にif (joy_bt(1,1))p++;とするのは×
→押しっぱなしの状態と、押した瞬間とを区別
することが必要
2002年度ゲームプログラミング
押した回数をカウント(2)




直前に押されていたかで状態を判別
今押されていて、直前にも押されていた
→押しっぱなし
今押されていて、直前に押されていない
→新しく押した、回数を1増やす
直前に押されていたかを保存する変数を用意
int oldbutton=0; // 宣言(関数の頭に)
oldbutton=joy_bt(1,1); //状態の保存
(毎回更新→whileの中に)
2002年度ゲームプログラミング
押した回数をカウント(3)
処理の流れ
while(){
if(今押されている && oldbutton==0) p++;

キーの状態をoldbuttonに保存
表示
wait(10);
// キー情報更新
}
2002年度ゲームプログラミング
左右に動き続ける
常に動いている物を表現したい場合、
毎回どれくらい動くかを示す変数を用意する。
(ボールx,yにおけるdx,dyと同様)
int bardx=0;
//宣言と初期値代入
 押したキーに対応してbardxを変えてやる
if(右を押したら) bardx=1;
if(左を押したら) bardx=-1;
if(下を押したら) bardx=0;
barx=barx+bardx; //barxをbardxだけ足す

2002年度ゲームプログラミング
バーの動くスピードを変える



バーのスピードを示す変数を準備
int barspeed=1;
スピードを示す変数使ってバーを動かす
if(右を押した) bardx=barspeed;
if(左を押した)bardx=-barspeed;
ボタンを押したらスピードを変更
if(ボタン1押した)barspeed=1;
if(ボタン2押した)barspeed=2;
2002年度ゲームプログラミング
おまけ

方向キー以外の特殊キー
VK_SHIFT :シフトキー
VK_SPACE :スペースキー(‘ ’でもOK)

沢山のキーを使いたい場合に。
if ( GetKeyState(‘A’) & 0x80 )
// aキーが押されていたら