



![]()
次はキャラを描画してみましょう。
そのために、まずキャラクタデータの構造体を定義し、キャラクタ変数を定義します。
キャラクタデータの構造体を以下のように定義します。
--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 -