次はキャラを描画してみましょう。

そのために、まずキャラクタデータの構造体を定義し、キャラクタ変数を定義します。

キャラクタデータの構造体を以下のように定義します。




--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 -