いつまでもキャラが左上に半切れになってる状態じゃ面白くないので、最低限の枠組みを表示してみましょう。

まずGV.hにボード画像を格納する為の変数を用意します。



--GV.hに以下を追加--

GLOBAL int img_board[40];



ついでに次の節の準備をする為、初期化関数を用意しておきましょう。

そして、キャラクタが動く領域をあらわす範囲を定義しておきます。

FIELD_MAX_X, 〜Yはそれぞれキャラクタが動ける領域の広さです。

FIELD_X, 〜Yはその領域の左上の座標です。

下に示す数値は(32,16)の座標から横に384,縦に448の広さがキャラクタが動ける領域だという事になります。



--define.hを変更--

#include "struct.h"

#define FIELD_MAX_X 384
#define FIELD_MAX_Y 448

#define FIELD_X 32
#define FIELD_Y 16




キャラクタに表示する画像をcalc_chで計算させます。

カウンタをふやして行き、24周期で1周します。その中で4種類の画像をループさせます。

データファイルにあるキャラクタ画像を見てもらったら解るとおり、キャラクタは4種類で1動作になっていますから、

以下の式で画像番号をループさせているのです。



--char.cppを変更--

#include "../include/GV.h"

void calc_ch(){
        ch.cnt++;
        ch.img=(ch.cnt%24)/6;
}



メインループから呼ぶ関数を宣言する時はfunction.hにも書いてやるんでしたね。



--function.hに以下を追加--

GLOBAL void calc_ch();



load.cppではボードの画像データを読み込みます。

配列要素番号が飛び飛びになっているのは、特に意味はありませんが、

のちのちに画像をさしかえやすくしてあります。別に0から連続でも全く構いません。




--load.cppを変更--

#include "../include/GV.h"

void load(){
        img_board[10] = LoadGraph("../dat/img/board/10.png");
        img_board[11] = LoadGraph("../dat/img/board/11.png");
        img_board[12] = LoadGraph("../dat/img/board/12.png");
        img_board[20] = LoadGraph("../dat/img/board/20.png");
        LoadDivGraph( "../dat/img/char/0.png" , 12 , 4 , 3 , 73 , 73 , img_ch[0] ) ;
}



キャラクタの初期座標を設定します。



--ini.cppを変更--

#include "../include/GV.h"

//一番最初の初期化
void first_ini(){
        ch.x=FIELD_MAX_X/2;
        ch.y=FIELD_MAX_Y*3/4;
}



ボードを描画する為のgraph_board関数を用意します。



--graph.cppを変更--

#include "../include/GV.h"

void graph_ch(){
        DrawRotaGraphF(ch.x+FIELD_X,ch.y+FIELD_Y,1.0f,0.0f,img_ch[0][ch.img],TRUE);
}

void graph_board(){
        DrawGraph(  0,  0,img_board[10],FALSE);
        DrawGraph(  0, 16,img_board[11],FALSE);
        DrawGraph(  0,464,img_board[12],FALSE);
        DrawGraph(416,  0,img_board[20],FALSE);
}

void graph_main(){
        graph_ch();
        graph_board();
}


main.cppではメインループのcase 0内に「first_ini();」が入っただけです。



--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();//現在のキー入力処理を行う
        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();
                                graph_main();//描画メイン
                                break;
                        default:
                                printfDx("不明なfunc_state\n");
                                break;
                }

                if(CheckStateKey(KEY_INPUT_ESCAPE)==1)break;//エスケープが入力されたらブレイク
    ScreenFlip();//裏画面反映
    }

    DxLib_End();//DXライブラリ終了処理
    return 0;
}


実行結果



- Remical Soft -