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