〜ゲーム入門編〜



入門編ではゲームを作成するときの基本的なプログラミング方法を紹介します。

サンプルプログラムを元に様々な処理を実現させるプログラムの作り方を紹介します。

サンプルプログラムの複雑化、長文化を防ぐためになるべく短くサンプルを書いています。

そのため、本来行うべき終了処理、例外処理などは極力書いていません。

例えば、画像を段々右に移動するプログラムは画面の外までいけば表示しないようにプログラムする必要がありますが

サンプルでは、複雑化、長文化してしまうこのような条件処理は極力書いていません。

あくまで、サンプルを説明する場ですからね。状況にあった例外処理はご自分で付け足してください☆



17. 画像を分割して読み込む


 キャラは画面上を動くためには、普通16枚画像が必要です。キャラが10人いただけで画像数は160枚になってしまい、

160個のファイルを個別に読み込んでいたのでは、読み込み時間も遅くなり、コードも無駄に長くなってしまいますよね。

そこで、あらかじめくっつけた画像をプログラムで分割してみようじゃないかと考えるわけです。


今まで使ってきた画像はいかにも将来分割されそうな感じをかもし出していましたね。

今回分割してみましょう。

まずいつも使っているchar.pngは1個のキャラが(32 x 32)ピクセルの画像が横4個、縦4個あつまった計16個の画像の集まりです。

分割するための関数はLoadDivGraphを使います。この関数の引数はこうなっています。

int LoadDivGraph( char *FileName , int AllNum , int XNum , int YNum , int XSize , int YSize , int *HandleBuf ) ;

パッと見難しそうに見えますが、見たら簡単なんでまず見てください。


FileName   : 分割読み込みする画像ファイル文字列のポインタ
AllNum    : 画像の分割総数
XNum ,YNum  : 画像の横向きに対する分割数と縦に対する分割数
XSize ,YSize : 分割された画像一つの大きさ
HandleBuf   : 分割読み込みして得たグラフィックハンドルを保存するint型の配列へのポインタ

これを判りやすく書くと

char.pngは1個のキャラが(32 x 32)ピクセルの画像が横4個、縦4個あつまった計16個の画像の集まりですから、

今image[16]という配列に画像ハンドルをいれていくためには

int image[16];
LoadDivGraph( "ファイルの場所" , 16 , 4 , 4 , 32 , 32 , image ) ;

このように書きます。格納される順番はこのようになります。[ ]は配列要素数を表しています。


[0] [1] [2] [3]
[4] [5] [6] [7]
[8] [9] [10] [11]
[12] [13] [14] [15]

つまり一番右上の画像は[3]に画像ハンドルが入るということですね。

この事を踏まえ、サンプルを見てみましょう。

ここでは配列要素[12]に入っているキャラを表示させて見ましょう。

↓コピー&コンパイル用サンプルプログラム↓


#include "DxLib.h"
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        
    int image[16];
    char Key[256];
 
    if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理
 
    SetDrawScreen( DX_SCREEN_BACK ) ;                         //描画先を裏画面に設定
    LoadDivGraph( "char.png" , 16 , 4 , 4 , 32 , 32 , image );//画像を分割してimage配列に保存
 
    while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
            //↑メッセージ処理        ↑画面をクリア         ↑キーボード入力状態取得       ↑ESCが押されると終了
 
                DrawGraph( 320 , 240 , image[12] , TRUE ) ;//[12]の画像を描画
 
                ScreenFlip();//裏画面を表画面に反映
    }
 
    DxLib_End();
    return 0;
}

実行結果

→掲示板で質問する



- Remical Soft -