次はキャラを描画してみましょう。
そのために、まずキャラクタデータの構造体を定義し、キャラクタ変数を定義します。
キャラクタデータの構造体を以下のように定義します。
--struct.h変更-- //キャラクターに関する構造体 typedef struct{ int flag; //フラグ int cnt; //カウンタ int power; //パワー int point; //ポイント int score; //スコア int num; //残機数 int mutekicnt; //無敵状態とカウント int shot_mode; //ショットモード int money; //お金 int img; //画像 int slow; //スローかどうか double x,y; //座標 }ch_t;
構造体の定義はstruct.hファイルに書いて下さい。
なんだかいっぱいありますが、別に覚えなくて結構です。
キャラクタが持つべきデータは色々ありますよね。パワーだったりスコアだったり、現在のショットモードだったり・・。
それをとりあえず全部用意しているだけです。今は座標しか関係ないので、とりあえずキャラクタの構造体に
double型のx,yがあるなとだけ覚えておいて下さい。
では、次にキャラクタの画像を読み込ませます。img_chという変数に画像のハンドルを代入します。
キャラクタの画像は12枚で1セットになっています。龍神録は変身するため、これが2セット必要ですので
int img_ch[2][12];
として変数を定義して使用します。変数の定義はメインファイルで行っているものとし、
以下のload.cppではextern宣言してから使っています。
--load.cpp変更-- #include "../include/GV.h" extern int img_ch[2][12]; void load(){ LoadDivGraph( "../dat/img/char/0.png" , 12 , 4 , 3 , 73 , 73 , img_ch[0] ) ; }
読み込む画像は上記パスで確認して下さい。上の関数の読み込みの意味は
全部で12枚、横4枚、縦3枚、横-縦=73-73ピクセルでimg_ch[0]に格納する という意味です。
わからなければ本家リファレンスページでこの関数を確認して下さい。
では描画を行うgraph.cppも変更します。
先ほど同様、変数の定義はメインファイルで行っているものとし、ここではextern宣言をして利用します。
描画関数はこれから山のように出てきますので、
メインファイルからは全体を制御する為のgraph_main関数のみ呼び出します。
--graph.cpp変更-- #include "../include/GV.h" extern ch_t ch; extern int img_ch[2][12]; void graph_ch(){ DrawRotaGraphF(ch.x,ch.y,1.0f,0.0f,img_ch[0][ch.img],TRUE); } void graph_main(){ graph_ch(); }
では肝心なメインファイルmain.cppです。
--main.cpp変更-- #define GLOBAL_INSTANCE #include "../include/GV.h" //現在のキー入力処理を行う extern int GetHitKeyStateAll_2(); //受け取ったキー番号の現在の入力状態を返す extern int CheckStateKey(unsigned char Handle); //データのロード extern void load(); //描画メイン extern void graph_main(); int img_ch[2][12]; //キャラクタ画像9枚分 X2(変身用) ch_t ch; //キャラクタデータ //ループで必ず行う3大処理 int ProcessLoop(){ if(ProcessMessage()!=0)return -1;//プロセス処理がエラーなら-1を返す if(ClearDrawScreen()!=0)return -1;//画面クリア処理がエラーなら-1を返す GetHitKeyStateAll_2();//現在のキー入力処理を行う 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;//初期化と裏画面化 load();//データロード while(ProcessLoop()==0){//メインループ graph_main();//描画メイン if(CheckStateKey(KEY_INPUT_ESCAPE)==1)break;//エスケープが入力されたらブレイク ScreenFlip();//裏画面反映 } DxLib_End();//DXライブラリ終了処理 return 0; }
j
実行結果
上のように表示できれば完成です。左端にキャラがちょこっと見えるはずです。
いや〜なんだかメインファイルが読みにくくなってきました・・。
でも大丈夫。次の章で綺麗に整理しましょう。
- Remical Soft -