キャラクタを画面のキャラクタ移動可能領域内で上下左右に移動出来るように制御してみます。
斜めに進むときは、1/ルート2倍スピードをかけてやらないと、常にスピードは1にならないので、
斜めに進むときには、鉛直方向、水平方向の移動スピードを変更してやる必要があります。
--char.cppを変更-- #include "../include/GV.h" void calc_ch(){ ch.cnt++; ch.img=(ch.cnt%24)/6; } void ch_move(){//キャラクタの移動制御 int i,sayu_flag=0,joge_flag=0; double x,y,mx,my,naname=1; double move_x[4]={-4.0,4.0,0,0},move_y[4]={0,0,4.0,-4.0};//{左,右,下,上}のスピード int inputpad[4]; inputpad[0]=CheckStatePad(configpad.left); inputpad[1]=CheckStatePad(configpad.right); inputpad[2]=CheckStatePad(configpad.down); inputpad[3]=CheckStatePad(configpad.up); if(CheckStatePad(configpad.left)>0)//左キーが押されていたら ch.img+=4*2;//画像を左向きに else if(CheckStatePad(configpad.right)>0)//右キーが押されていたら ch.img+=4*1;//画像を右向きに for(i=0;i<2;i++)//左右分 if(inputpad[i]>0)//左右どちらかの入力があれば sayu_flag=1;//左右入力フラグを立てる for(i=2;i<4;i++)//上下分 if(inputpad[i]>0)//上下どちらかの入力があれば joge_flag=1;//上下入力フラグを立てる if(sayu_flag==1 && joge_flag==1)//左右、上下両方の入力があれば斜めだと言う事 naname=sqrt(2.0);//移動スピードを1/ルート2に for(int i=0;i<4;i++){//4方向分ループ if(inputpad[i]>0){//i方向のキーボード、パッドどちらかの入力があれば x=ch.x , y=ch.y;//今の座標をとりあえずx,yに格納 mx=move_x[i]; my=move_y[i];//移動分をmx,myに代入 if(CheckStatePad(configpad.slow)>0){//低速移動なら mx=move_x[i]/3; my=move_y[i]/3;//移動スピードを1/3に } x+=mx/naname , y+=my/naname;//今の座標と移動分を足す if(!(x<10 || x>FIELD_MAX_X-10 || y<5 || y>FIELD_MAX_Y-5)){//計算結果移動可能範囲内なら ch.x=x , ch.y=y;//実際に移動させる } } } }
sqrt関数を使用するのでmath.hをインクルードします。
そしてch_move関数をfunction.hに追加します。
--GV.hに以下を追加-- #include "math.h" --function.hに以下を追加-- GLOBAL void ch_move();
メイン関数には赤字の部分だけ追加します。
--main.cppを変更-- #define GLOBAL_INSTANCE #include "../include/GV.h" //ループで必ず行う3大処理 int ProcessLoop(){ if(ProcessMessage()!=0)return -1;//プロセス処理がエラーなら-1を返す if(ClearDrawScreen()!=0)return -1;//画面クリア処理がエラーなら-1を返す GetHitKeyStateAll_2();//現在のキー入力処理を行う GetHitPadStateAll(); //現在のパッド入力処理を行う return 0; } int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){ ChangeWindowMode(TRUE);//ウィンドウモード if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化 while(ProcessLoop()==0){//メインループ switch(func_state){ case 0: load(); //データロード first_ini();//初回の初期化 func_state=100; break; case 100: calc_ch(); //キャラクタ計算 ch_move(); //キャラクタの移動制御 graph_main();//描画メイン break; default: printfDx("不明なfunc_state\n"); break; } if(CheckStateKey(KEY_INPUT_ESCAPE)==1)break;//エスケープが入力されたらブレイク ScreenFlip();//裏画面反映 } DxLib_End();//DXライブラリ終了処理 return 0; }
実行結果
- Remical Soft -