リュウグウノツカイのように

深海で悠々と暮らしたい

DXライブラリ/エフェクト描画/ハンドルの行方

まえがき

まずはこちらを御覧ください。 youtu.be

この動画では、DXライブラリを用いたアニメーション描画の例を解説しています。 ただ・・・あまりにもプログラムの解説が少ない!もっとちゃんと解説して!という意見がありそうなので、ブログで補足します。

分割のおさらい

 DXライブラリでは、DrawDivGraph関数を使い、1枚の画像を複数の画像に分割し、メモリ内に保存します。メモリ内に保存された画像たちは「ハンドル」という管理番号でプログラム上は扱い、配列でまとめて管理されることで、DrawGraph関数などの描画関連で使用されます。

分割のイメージ

ハンドル管理の悩み

 LoadDivGraph関数を使用するとき、引数でint型のポインタを入れるのが面倒だなぁと思うかもしれません。ハンドルは他の値と被らない(ユニークな)整数で、このint型のポインタ(アドレス)めがけて、配列の値として入ってきます。

//アニメーションを分割してメモリに読込
    LoadDivGraph(
        graphic.c.Path,             //アニメーションのパス
        (XNum * YNum),              //分割総数
        XNum, YNum,                 //|(横)分割数、-(縦)分割数
        animation.g.c.Width,        //分割した1枚の幅
        animation.g.c.Height,       //分割した1枚の高さ
        animation.Handle            //連続したハンドル配列の先頭
    );

 ポインタは文字通り目印です。目印がなければ、どこに値を入れていいのか分かりません。ポインタがメモリの住所に例えられるのは、住所がわからなければ郵便物を配達できないことに似ているからかもしれません。

どこに入れればいいの?

 LoadDivGraph関数で配列のアドレスを使うのは、例えばマンション全体の郵便受けにチラシを投函すると考えましょう。まず、指定のマンションを、住所を頼りに見つけます。次に各部屋のポストにチラシを入れていくイメージです。LoadDivGraphの分割も、まずは配列の住所(アドレス)を見つけ、次に配列の値を入れていきます。引数は配列のアドレスでないとだめなんです~。

ポインタはメモリ内の住所

ハンドル管理の悩み、ふたたび

 マンションごとに部屋の数が違うように、エフェクト画像も分割数が違うことがあります。

分割数のちがい
 エフェクトの種類により、分割数が違うというのは、C言語ではけっこう面倒なんです。配列の要素数、一度決めたら増やしたり減らしたりできませんから。かといって、分割数20の画像用のハンドル、分割数15の画像用ハンドル・・・みたいにしても、キリがありません。エフェクトの分割数を全て同じにできるなら良いですが、多くの人がフリー素材に頼っています。分割数を同じにするのも難しいんです。さらにDXライブラリと仲良くなると、違う分割数でも同じ処理にしたい欲がムクムクと出てくるんです。

#define DIV_MAX_20 15    //分割数
#define DIV_MAX_20 20    //分割数

int Handle[DIV_MAX_15];  //分割数15用のハンドル
int Handle[DIV_MAX_20];  //分割数20用のハンドル
//キリがない・・・

アドレスが分かればスグに解決!?

 今回は「配列の要素数が決まっていない」なことが問題です。でも、配列である以上、メモリ内の住所(アドレス)は必ずあるはず。配列であるという共通点をよく見ると、どちらも「アドレス」で場所を指定できるんです。

共通点をさぐろう!

解決するためのキーワード

 エフェクトが少ないうちは、LoadDivGraph関数を使うときに、こんなこと気にも留めません。でもエフェクトが多いRPG系やバトル系を作ってみると、だんだんと嫌気が差してくることでしょう。どんなエフェクト画像でも1つの処理で完結できれば、効率的にゲームが開発できます。解決するためのキーワードは、この2つ。C言語ならではの面白くも難しい部分は、また次回~。

 画像ごとに要素数を決めるには?/配列のアドレスを活用するには?