〜サンプルプログラム編〜





s0. 「たった今入力された」を判定する

汎用的に使えるよう関数として40節に新しく作りました。

キーがどれ位押されたかを監視する関数

をご覧下さい。






s1. 関数ポインタ基本



シューティングゲーム等は、敵の攻撃によって様々な関数で計算して玉を発射します。

その時間や状況によって使う関数が変わるのです。すなわち大量の関数名が出てきますね。


if(1回目の攻撃なら)
  ShotType1();
if(2回目の攻撃なら)
  ShotType2();
if(3回目の攻撃なら)
  ShotType3();
if(4回目の攻撃なら)
  ShotType4();


と書いてもいいですけど、なんだかちょっと賢くない書きかたのような気がしますね。

これをあらかじめ、「関数のポインタを配列でまとめて」おいて、配列要素番号を変更する事で

どの関数に処理を渡すか決定できれば随分スムーズにプログラムが書けるんじゃないでしょうか。

if(攻撃モード変更したら)
  i++;
ShotType[i]();

こんな風に書けば随分スマートですね。

では関数をポインタを使って配列にまとめてみるプログラムをかいて見ましょう。

サンプルプログラムでは

ShotType1();
ShotType2();
ShotType3();

という関数をShotFunctionで纏めています。

以後、ShotFunctionを使用する事で、任意のショットタイプ関数へ処理を渡す事が出来ます。


#include "DxLib.h"
 
int c=0,White,i=0;
 
void ShotType1( void ) ;        // 敵のショットパターン1関数
void ShotType2( void ) ;        // 敵のショットパターン2関数
void ShotType3( void ) ;        // 敵のショットパターン3関数
 
void (*ShotFunction[])( void ) =
{
        ShotType2,              //この順番で配列に格納される
        ShotType1,              //[0],[1],[2]の順番で使用すると
        ShotType3,              //2,1,3の順番で処理される。
} ;
 
void ShotType1( void ){
        DrawString(200,200,"タイプ1ショット発射中。",White);
}
void ShotType2( void ){
        DrawString(200,200,"タイプ2ショット発射中。",White);
}
void ShotType3( void ){
        DrawString(200,200,"タイプ3ショット発射中。",White);
}
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        
        ChangeWindowMode( TRUE ) ;                   //ウィンドウモードに変更
        if( DxLib_Init() == -1 ) return -1;      // DXライブラリ初期化処理 エラーが起きたら終了 
         
        White = GetColor( 255 , 255 , 255 ) ;    //色の取得
        SetDrawScreen( DX_SCREEN_BACK ) ;        // 描画先を裏画面に設定
   
        while( 1 ){
                ClearDrawScreen();                   // 裏画面のデータを全て削除
                
                if     (c==0)
                        i=0;
                else if(c==100)
                        i=1;
                else if(c==200)
                        i=2;
                else if(c==300)
                        break;
 
                ShotFunction[i]();                                   // 各関数へ処理を渡す
                
                c++;
        ScreenFlip() ;                                       // 裏画面データを表画面へ反映
        }
 
        DxLib_End() ;                                            // DXライブラリ使用の終了処理
        return 0 ;                                               // ソフトの終了
}

実行結果

→掲示板で質問する



- Remical Soft -