関数に必要な情報を全て引数として取り込めるようにしたい

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
wasawasa
記事: 94
登録日時: 11年前

関数に必要な情報を全て引数として取り込めるようにしたい

#1

投稿記事 by wasawasa » 11年前

初めまして。
プログラムを複数のファイルに分割する為にPictureRead、Obj_Syutugen、Anim_Draw、Anim_AllDraw関数を関数の外の必要なデータを引数として取り込めるようにしたくて次のようにプログラムを書きなおした所、下記のようなエラーが吐き出されてしまいました。

コード:

 
#include "DxLib.h"
#define Anim_longest_Picture 5//最も多い枚数の画像を使うアニメの使用画像枚数
#define ObjApMax 3//ObjApの要素の数
#define ObjPalMax 3//ObjPalの要素の数
#define SpriteAmount 12//スプライトの総数
#define PictureReadAmount 2//読み込む画像ファイルの数
//配列の生成に変数は使えない
//関数の外では変数に値を代入できない
//配列は定義時に値を代入する事
int TimeCount;//全体の時間カウント
int Object_Gr[SpriteAmount];//画像格納変数
double Object_point[SpriteAmount][2]={//各画像の原点
	{20,20},
	{20,20},
	{20,20},
	{20,20},
	{20,20},
	{20,20},
	{20,20},
	{20,20},
	{20,20},
	{20,20},
	{20,20},
	{20,20}
};
		
struct Anim{
	int Picture[Anim_longest_Picture];//アニメに使う画像番号 [アニメ番号][使用画像]
	int Frame[Anim_longest_Picture];//アニメの各画像の表示フレーム [アニメ番号][フレーム数]
};

struct Anim AnimObj[6] = {
	{{0,1,-1,-1,-1},{100,200,-1,-1,-1}},//0:自機ニュートラル
	{{2,3,-1,-1,-1},{10,20,-1,-1,-1}},
	{{4,5,-1,-1,-1},{10,20,-1,-1,-1}},
	{{6,7,-1,-1,-1},{100,200,-1,-1,-1}},
	{{8,9,-1,-1,-1},{10,20,-1,-1,-1}},
	{{10,11,-1,-1,-1},{10,20,-1,-1,-1}}
};
struct ReadFileInf{
	char *FileName;//ファイルのポインタ
	int allnum,xnum,ynum,xsize,ysize;//画像の分割総数,横に対する分割数,縦に対する分割数,分割された画像一つのx方向の大きさ,y方向の大きさ
};
struct ReadFileInf ReadForObject_Gr[PictureReadAmount] = {
	{ "../Picture/STGtate_test.png" , 6 , 2 , 3 , 40 , 40 },
	{"../Picture/STGtate_test2.png" , 6 , 2 , 3 , 40 , 40 }
};

struct Obj{
	int AnimNo,Stcnt,layer;//アニメ番号,アニメ切り替え基準カウンター,表示レイヤー
	int flag;//出現する時間and出現判定
	double x,y;//x座標,y座標
};
struct Obj ObjPal[ObjPalMax] = {//オブジェクト毎のパラメータ
	{4,0,80,	   0,	100,100},
	{0,0,50,	1000,	110,110},
	{0,0,50,	2000,	150,110}
};
struct Obj ObjAp[ObjApMax] = {//出現しているオブジェクトのデータ(出現していない所は全て-1)
	{-1,-1,-1,	 -1,	-1,-1},
	{-1,-1,-1,	 -1,	-1,-1},
	{-1,-1,-1,	 -1,	-1,-1}
};

void PictureRead(int *OG_inPictureRead , struct ReadFileInf *RFOG_inPictureRead , int PRA__inPictureRead){//画像ファイル読み込み
	//使用外部データ:int Object_Gr,struct ReadFileInf ReadForObject_Gr, define PictureReadAmount
	//呼び出し元:main
	int i;
	int a=0;
	for(i = 0; i < PRA__inPictureRead; i ++){
		LoadDivGraph( RFOG_inPictureRead[i].FileName , RFOG_inPictureRead[i].allnum , RFOG_inPictureRead[i].xnum , RFOG_inPictureRead[i].ynum , RFOG_inPictureRead[i].xsize , RFOG_inPictureRead[i].ysize , OG_inPictureRead + a );
		a += RFOG_inPictureRead[i].allnum;
	}
}
void Obj_Syutugen(int TC_inObj_Syutugen , struct Obj *OA_inObj_Syutugen , 
                  struct Obj *OP_inObj_Syutugen , int OAM_inObj_Syutugen , int OPM_inObj_Syutugen){//オブジェクトの出現管理 
	//使用外部変数:int TimeCount, struct Obj ObjAp[] , struct Obj ObjPal[] , define ObjApMax , define ObjPalMax
	//呼び出し元:main
	int i,j;

	for(i = 0; i < OPM_inObj_Syutugen; i ++){
		if(TC_inObj_Syutugen == OP_inObj_Syutugen[i].flag){
			for(j = 0; j < OAM_inObj_Syutugen; j++){
				if(OA_inObj_Syutugen[j].flag == -1){
					OA_inObj_Syutugen[j].AnimNo = OP_inObj_Syutugen[i].AnimNo;
					OA_inObj_Syutugen[j].flag   = OP_inObj_Syutugen[i].flag;
					OA_inObj_Syutugen[j].layer  = OP_inObj_Syutugen[i].layer;
					OA_inObj_Syutugen[j].Stcnt  = OP_inObj_Syutugen[i].Stcnt;
					OA_inObj_Syutugen[j].x      = OP_inObj_Syutugen[i].x;
					OA_inObj_Syutugen[j].y		= OP_inObj_Syutugen[i].y;
					break;
				}
			}
		}
	}
}

void Anim_Draw(int ObjectNumber , int AlP_inAnim_Draw , struct Obj *OA_inAnim_Draw , struct Anim *AO_inAnim_Draw ,
             double *Op_inAnim_Draw , int *OG_inAnimDraw , int TC_inAnimDraw){//アニメ描画 
	//使用外部変数:define Anim_longest_Picture , struct Obj ObjAp[] , struct Anim AnimObj[]
	              //double Object_point[][] , int Object_Gr[] , int TimeCount
	//呼び出し元:Anim_All_Draw
	int i,j;
	int a[AlP_inAnim_Draw];//アニメの各画像の終了フレーム
	for(i = 0; i < AlP_inAnim_Draw; i ++){//aの初期化
		a[i] = 0;
	}
	int b=0;//aの最大値
	int c=0;
	for(i = 0; i < AlP_inAnim_Draw; i ++){
		for(j = 0; j <= i; j ++){
			if(AO_inAnim_Draw[OA_inAnim_Draw[ObjectNumber].AnimNo].Frame[j] >=0){
				a[i] += AO_inAnim_Draw[OA_inAnim_Draw[ObjectNumber].AnimNo].Frame[j];
			}
			else{
				a[i] = -1;
			}
		}
	}
	for(i = 0;i < AlP_inAnim_Draw; i ++){
		if(a[i]>b){
			b = a[i];
		}
	}
	c = (TC_inAnimDraw - OA_inAnim_Draw[ObjectNumber].Stcnt)%b;
	for(i = 0;i < AlP_inAnim_Draw; i ++){
		if(c<a[i]){
			DrawGraph( OA_inAnim_Draw[ObjectNumber].x - Op_inAnim_Draw[AO_inAnim_Draw[OA_inAnim_Draw[ObjectNumber].AnimNo].Picture[i]][0], 
				       OA_inAnim_Draw[ObjectNumber].y - Op_inAnim_Draw[AO_inAnim_Draw[OA_inAnim_Draw[ObjectNumber].AnimNo].Picture[i]][1], 
					   Object_Gr[AO_inAnim_Draw[OA_inAnim_Draw[ObjectNumber].AnimNo].Picture[i]], TRUE ); //画像の描画
			break;
		}
	}
}

void Anim_AllDraw(int OAM_inAnim_AllDraw , struct Obj *OA_inAnim_AllDraw , int AlP_inAnim_AllDraw , struct Anim *AO_inAnim_AllDraw , 
                                double *Op_inAnim_AllDraw , int *OG_inAnim_AllDraw , int TC_inAnim_AllDraw){//定義されたアニメの描画
	//使用外部変数:ObjApMax,struct Obj ObjAp[]
	//Anim_Draw内部:define Anim_longest_Picture , struct Obj ObjAp[] , struct Anim AnimObj[]
	              //double Object_point[][] , int Object_Gr[] , int TimeCount
	//呼び出し元:main
	int i,j,k;
	int dumy=100000;//並び替え時の比較対象
	int H=0;
	int KariObj[OAM_inAnim_AllDraw];//臨時出現オブジェクトデータベース
	for(i = 0; i < OAM_inAnim_AllDraw; i ++){
		KariObj[i]=-1;
	}
	for(j = 0; j < OAM_inAnim_AllDraw; j ++){//レイヤー順に並び替え
		for(i = 0; i < OAM_inAnim_AllDraw; i ++){
			if(OA_inAnim_AllDraw[i].flag>=0){//並び替えの対象は出現しているものに限る
				if(dumy>=OA_inAnim_AllDraw[i].layer){
					for(k = 0; k < j; k++){
						if(i==KariObj[k]){
							H=1;
						}
					}
					if(H==0){
						dumy=OA_inAnim_AllDraw[i].layer;
						KariObj[j]=i;
					}
					H=0;
				}
			}
		}
		H=0;
		dumy=100000;
	}
	for(j = 0; j < OAM_inAnim_AllDraw; j ++){
		if(KariObj[j] >= 0 && KariObj[j] < OAM_inAnim_AllDraw){
			Anim_Draw(KariObj[j],OA_inAnim_AllDraw,AlP_inAnim_AllDraw,AO_inAnim_AllDraw,Op_inAnim_AllDraw,OG_inAnim_AllDraw,TC_inAnim_AllDraw);
		}
	}
}

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
        ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定
		TimeCount=0;	
		PictureRead(Object_Gr,ReadForObject_Gr,PictureReadAmount);

        // while( 裏画面を表画面に反映, メッセージ処理, 画面クリア )
        while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){
			Obj_Syutugen(TimeCount,ObjAp,ObjPal,ObjApMax,ObjPalMax);
			Anim_AllDraw(ObjApMax,ObjAp,Anim_longest_Picture,AnimObj,Object_point,Object_Gr,TimeCount);
			TimeCount++;
        }
        
        DxLib_End(); // DXライブラリ終了処理
        return 0;
}  
[エラーメッセージ]
1>c:\aaaa\visual studio 2008\projects\tatestg_test\tatestg_test\main.cpp(104) : error C2057: 定数式が必要です。
1>c:\aaaa\visual studio 2008\projects\tatestg_test\tatestg_test\main.cpp(104) : error C2466: サイズが 0 の配列を割り当てまたは宣言しようとしました。
1>c:\aaaa\visual studio 2008\projects\tatestg_test\tatestg_test\main.cpp(104) : error C2133: 'a' : サイズが不明です。
1>c:\aaaa\visual studio 2008\projects\tatestg_test\tatestg_test\main.cpp(128) : error C2109: 配列または、ポインタでない変数に添字が使われました。
1>c:\aaaa\visual studio 2008\projects\tatestg_test\tatestg_test\main.cpp(129) : error C2109: 配列または、ポインタでない変数に添字が使われました。
1>c:\aaaa\visual studio 2008\projects\tatestg_test\tatestg_test\main.cpp(145) : error C2057: 定数式が必要です。
1>c:\aaaa\visual studio 2008\projects\tatestg_test\tatestg_test\main.cpp(145) : error C2466: サイズが 0 の配列を割り当てまたは宣言しようとしました。
1>c:\aaaa\visual studio 2008\projects\tatestg_test\tatestg_test\main.cpp(145) : error C2133: 'KariObj' : サイズが不明です。
1>c:\aaaa\visual studio 2008\projects\tatestg_test\tatestg_test\main.cpp(171) : error C2664: 'Anim_Draw' : 2 番目の引数を 'Obj *' から 'int' に変換できません。(新しい機能 ; ヘルプを参照)
1> この変換が可能なコンテキストはありません。
1>c:\aaaa\visual studio 2008\projects\tatestg_test\tatestg_test\main.cpp(184) : error C2664: 'Anim_AllDraw' : 5 番目の引数を 'double [12][2]' から 'double *' に変換できません。(新しい機能 ; ヘルプを参照)
1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。

多分、構造体を引数として渡す時にミスを起こしているのと#defineで定義したAnim_longest_Picture,ObjApMax,ObjPalMax,SpriteAmount,PictureReadAmountの値を変数に入れる事が出来なくてエラーを起こしているのだと思いますが、前者はどこで間違っているのかが分からず、後者はdefineの値を配列の要素数を定義する時にも使用しているためAnim_longest_Picture,ObjApMax,ObjPalMax,SpriteAmount,PictureReadAmountの定義方法を変数での定義に変える事が出来ずどうしていいか分からずに困っています。
プログラミングはwindows7でVC++ 2008EEを使って行っています。
基礎しか学んだことのない初心者ですがよろしくお願いします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 関数に必要な情報を全て引数として取り込めるようにしたい

#2

投稿記事 by softya(ソフト屋) » 11年前

一行ズレている様ですが、104 行、145行のエラーは配列の可変長となるので、配列の可変長確保はC言語ならmallocが必要です。
171行は、単なる引数の間違いだと思いますが、関数の引数が多すぎるのが間違いを誘発していると思います。ややこしいので設計を見なおしたほうが良いです。
184行は、2次元配列をポインタで受けてるので受取れないです。
double Op_inAnim_Draw[][2]
とすればよいかと。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

wasawasa
記事: 94
登録日時: 11年前

Re: 関数に必要な情報を全て引数として取り込めるようにしたい

#3

投稿記事 by wasawasa » 11年前

返信ありがとうございます。引数のややこしさは自分でやっててよく分かったので関数を別ファイルでコンパイルできた後に見直してみたいと思います。
それはそれとして、171行目と184行目のエラーは直せたのですが、104行目と145行目は(下のコードでは8行目と51行目)次のように書きなおしたところ、「'void *' から 'int *' に変換できません。」というエラー文が表示されてしまいました。

コード:

 
void Anim_Draw(int ObjectNumber , int AlP_inAnim_Draw , struct Obj *OA_inAnim_Draw , struct Anim *AO_inAnim_Draw ,
             double Op_inAnim_Draw[][2] , int *OG_inAnimDraw , int TC_inAnimDraw){//アニメ描画 
    //使用外部変数:define Anim_longest_Picture , struct Obj ObjAp[] , struct Anim AnimObj[]
                  //double Object_point[][] , int Object_Gr[] , int TimeCount
    //呼び出し元:Anim_All_Draw
    int i,j;
    int *a;//アニメの各画像の終了フレーム
	a = malloc(AlP_inAnim_Draw*sizeof(int));
    for(i = 0; i < AlP_inAnim_Draw; i ++){//aの初期化
        a[i] = 0;
    }
    int b=0;//aの最大値
    int c=0;
    for(i = 0; i < AlP_inAnim_Draw; i ++){
        for(j = 0; j <= i; j ++){
            if(AO_inAnim_Draw[OA_inAnim_Draw[ObjectNumber].AnimNo].Frame[j] >=0){
                a[i] += AO_inAnim_Draw[OA_inAnim_Draw[ObjectNumber].AnimNo].Frame[j];
            }
            else{
                a[i] = -1;
            }
        }
    }
    for(i = 0;i < AlP_inAnim_Draw; i ++){
        if(a[i]>b){
            b = a[i];
        }
    }
    c = (TC_inAnimDraw - OA_inAnim_Draw[ObjectNumber].Stcnt)%b;
    for(i = 0;i < AlP_inAnim_Draw; i ++){
        if(c<a[i]){
            DrawGraph( OA_inAnim_Draw[ObjectNumber].x - Op_inAnim_Draw[AO_inAnim_Draw[OA_inAnim_Draw[ObjectNumber].AnimNo].Picture[i]][0], 
                       OA_inAnim_Draw[ObjectNumber].y - Op_inAnim_Draw[AO_inAnim_Draw[OA_inAnim_Draw[ObjectNumber].AnimNo].Picture[i]][1], 
                       Object_Gr[AO_inAnim_Draw[OA_inAnim_Draw[ObjectNumber].AnimNo].Picture[i]], TRUE ); //画像の描画
            break;
        }
    }
	free(a);
}
 
void Anim_AllDraw(int OAM_inAnim_AllDraw , struct Obj *OA_inAnim_AllDraw , int AlP_inAnim_AllDraw , struct Anim *AO_inAnim_AllDraw , 
                                double Op_inAnim_AllDraw[][2] , int *OG_inAnim_AllDraw , int TC_inAnim_AllDraw){//定義されたアニメの描画
    //使用外部変数:ObjApMax,struct Obj ObjAp[]
    //Anim_Draw内部:define Anim_longest_Picture , struct Obj ObjAp[] , struct Anim AnimObj[]
                  //double Object_point[][] , int Object_Gr[] , int TimeCount
    //呼び出し元:main
    int i,j,k;
    int dumy=100000;//並び替え時の比較対象
    int H=0;
    int KariObj;//臨時出現オブジェクトデータベース
	KariObj = malloc(OAM_inAnim_AllDraw*sizeof(int));
    for(i = 0; i < OAM_inAnim_AllDraw; i ++){
        KariObj[i]=-1;
    }
    for(j = 0; j < OAM_inAnim_AllDraw; j ++){//レイヤー順に並び替え
        for(i = 0; i < OAM_inAnim_AllDraw; i ++){
            if(OA_inAnim_AllDraw[i].flag>=0){//並び替えの対象は出現しているものに限る
                if(dumy>=OA_inAnim_AllDraw[i].layer){
                    for(k = 0; k < j; k++){
                        if(i==KariObj[k]){
                            H=1;
                        }
                    }
                    if(H==0){
                        dumy=OA_inAnim_AllDraw[i].layer;
                        KariObj[j]=i;
                    }
                    H=0;
                }
            }
        }
        H=0;
        dumy=100000;
    }
    for(j = 0; j < OAM_inAnim_AllDraw; j ++){
        if(KariObj[j] >= 0 && KariObj[j] < OAM_inAnim_AllDraw){
            Anim_Draw(KariObj[j],
				      AlP_inAnim_AllDraw,OA_inAnim_AllDraw,AO_inAnim_AllDraw,Op_inAnim_AllDraw,OG_inAnim_AllDraw,TC_inAnim_AllDraw);
        }
    }
	free(KariObj);
}
mallocの書き方はhttp://seclan.dll.jp/c99d/c99d04.htmを参考にしてみたのですが、これでは間違いなのでしょうか?

アバター
へにっくす
記事: 634
登録日時: 13年前
住所: 東京都

Re: 関数に必要な情報を全て引数として取り込めるようにしたい

#4

投稿記事 by へにっくす » 11年前

wasawasa さんが書きました:「'void *' から 'int *' に変換できません。」というエラー文が表示されてしまいました。
以下のように、キャストしてあげればいいだけです。

コード:

int *p = (int*)malloc(500*sizeof(int));
Visual C++でソースの拡張子が.cppの場合は、C++言語としてコンパイルします。
C++言語の場合、明示的にキャストしないとだめですよ。
C言語としてコンパイルさせたい場合は、拡張子を.cにしてください。
wasawasa さんが書きました:mallocの書き方はhttp://seclan.dll.jp/c99d/c99d04.htmを参考にしてみたのですが、これでは間違いなのでしょうか?
C言語とタイトルにあるので間違いではありません。
written by へにっくす

wasawasa
記事: 94
登録日時: 11年前

Re: 関数に必要な情報を全て引数として取り込めるようにしたい

#5

投稿記事 by wasawasa » 11年前

へにっくすさんのアドバイスを参考にして以下のように書きなおした結果無事コンパイルできました。ありがとうございます。

コード:

#include "DxLib.h"
#define Anim_longest_Picture 5//最も多い枚数の画像を使うアニメの使用画像枚数
#define ObjApMax 3//ObjApの要素の数
#define ObjPalMax 3//ObjPalの要素の数
#define SpriteAmount 12//スプライトの総数
#define PictureReadAmount 2//読み込む画像ファイルの数
//配列の生成に変数は使えない
//関数の外では変数に値を代入できない
//配列は定義時に値を代入する事
int TimeCount;//全体の時間カウント
int Object_Gr[SpriteAmount];//画像格納変数
double Object_point[SpriteAmount][2]={//各画像の原点
    {20,20},
    {20,20},
    {20,20},
    {20,20},
    {20,20},
    {20,20},
    {20,20},
    {20,20},
    {20,20},
    {20,20},
    {20,20},
    {20,20}
};
        
struct Anim{
    int Picture[Anim_longest_Picture];//アニメに使う画像番号 [アニメ番号][使用画像]
    int Frame[Anim_longest_Picture];//アニメの各画像の表示フレーム [アニメ番号][フレーム数]
};
 
struct Anim AnimObj[6] = {
    {{0,1,-1,-1,-1},{100,200,-1,-1,-1}},//0:自機ニュートラル
    {{2,3,-1,-1,-1},{10,20,-1,-1,-1}},
    {{4,5,-1,-1,-1},{10,20,-1,-1,-1}},
    {{6,7,-1,-1,-1},{100,200,-1,-1,-1}},
    {{8,9,-1,-1,-1},{10,20,-1,-1,-1}},
    {{10,11,-1,-1,-1},{10,20,-1,-1,-1}}
};
struct ReadFileInf{
    char *FileName;//ファイルのポインタ
    int allnum,xnum,ynum,xsize,ysize;//画像の分割総数,横に対する分割数,縦に対する分割数,分割された画像一つのx方向の大きさ,y方向の大きさ
};
struct ReadFileInf ReadForObject_Gr[PictureReadAmount] = {
    { "../Picture/STGtate_test.png" , 6 , 2 , 3 , 40 , 40 },
    {"../Picture/STGtate_test2.png" , 6 , 2 , 3 , 40 , 40 }
};
 
struct Obj{
    int AnimNo,Stcnt,layer;//アニメ番号,アニメ切り替え基準カウンター,表示レイヤー
    int flag;//出現する時間and出現判定
    double x,y;//x座標,y座標
};
struct Obj ObjPal[ObjPalMax] = {//オブジェクト毎のパラメータ
    {4,0,80,       0,   100,100},
    {0,0,50,    1000,   110,110},
    {0,0,50,    2000,   150,110}
};
struct Obj ObjAp[ObjApMax] = {//出現しているオブジェクトのデータ(出現していない所は全て-1)
    {-1,-1,-1,   -1,    -1,-1},
    {-1,-1,-1,   -1,    -1,-1},
    {-1,-1,-1,   -1,    -1,-1}
};
 
void PictureRead(int *OG_inPictureRead , struct ReadFileInf *RFOG_inPictureRead , int PRA__inPictureRead){//画像ファイル読み込み
    //使用外部データ:int Object_Gr,struct ReadFileInf ReadForObject_Gr, define PictureReadAmount
    //呼び出し元:main
    int i;
    int a=0;
    for(i = 0; i < PRA__inPictureRead; i ++){
        LoadDivGraph( RFOG_inPictureRead[i].FileName , RFOG_inPictureRead[i].allnum , RFOG_inPictureRead[i].xnum , RFOG_inPictureRead[i].ynum , RFOG_inPictureRead[i].xsize , RFOG_inPictureRead[i].ysize , OG_inPictureRead + a );
        a += RFOG_inPictureRead[i].allnum;
    }
}
void Obj_Syutugen(int TC_inObj_Syutugen , struct Obj *OA_inObj_Syutugen , 
                  struct Obj *OP_inObj_Syutugen , int OAM_inObj_Syutugen , int OPM_inObj_Syutugen){//オブジェクトの出現管理 
    //使用外部変数:int TimeCount, struct Obj ObjAp[] , struct Obj ObjPal[] , define ObjApMax , define ObjPalMax
    //呼び出し元:main
    int i,j;
 
    for(i = 0; i < OPM_inObj_Syutugen; i ++){
        if(TC_inObj_Syutugen == OP_inObj_Syutugen[i].flag){
            for(j = 0; j < OAM_inObj_Syutugen; j++){
                if(OA_inObj_Syutugen[j].flag == -1){
                    OA_inObj_Syutugen[j].AnimNo = OP_inObj_Syutugen[i].AnimNo;
                    OA_inObj_Syutugen[j].flag   = OP_inObj_Syutugen[i].flag;
                    OA_inObj_Syutugen[j].layer  = OP_inObj_Syutugen[i].layer;
                    OA_inObj_Syutugen[j].Stcnt  = OP_inObj_Syutugen[i].Stcnt;
                    OA_inObj_Syutugen[j].x      = OP_inObj_Syutugen[i].x;
                    OA_inObj_Syutugen[j].y      = OP_inObj_Syutugen[i].y;
                    break;
                }
            }
        }
    }
}
 
void Anim_Draw(int ObjectNumber , int AlP_inAnim_Draw , struct Obj *OA_inAnim_Draw , struct Anim *AO_inAnim_Draw ,
             double Op_inAnim_Draw[][2] , int *OG_inAnimDraw , int TC_inAnimDraw){//アニメ描画 
    //使用外部変数:define Anim_longest_Picture , struct Obj ObjAp[] , struct Anim AnimObj[]
                  //double Object_point[][] , int Object_Gr[] , int TimeCount
    //呼び出し元:Anim_All_Draw
    int i,j;
    int *a = (int*)malloc(AlP_inAnim_Draw*sizeof(int));//[AlP_inAnim_Draw];//アニメの各画像の終了フレーム
    for(i = 0; i < AlP_inAnim_Draw; i ++){//aの初期化
        a[i] = 0;
    }
    int b=0;//aの最大値
    int c=0;
    for(i = 0; i < AlP_inAnim_Draw; i ++){
        for(j = 0; j <= i; j ++){
            if(AO_inAnim_Draw[OA_inAnim_Draw[ObjectNumber].AnimNo].Frame[j] >=0){
                a[i] += AO_inAnim_Draw[OA_inAnim_Draw[ObjectNumber].AnimNo].Frame[j];
            }
            else{
                a[i] = -1;
            }
        }
    }
    for(i = 0;i < AlP_inAnim_Draw; i ++){
        if(a[i]>b){
            b = a[i];
        }
    }
    c = (TC_inAnimDraw - OA_inAnim_Draw[ObjectNumber].Stcnt)%b;
    for(i = 0;i < AlP_inAnim_Draw; i ++){
        if(c<a[i]){
            DrawGraph( OA_inAnim_Draw[ObjectNumber].x - Op_inAnim_Draw[AO_inAnim_Draw[OA_inAnim_Draw[ObjectNumber].AnimNo].Picture[i]][0], 
                       OA_inAnim_Draw[ObjectNumber].y - Op_inAnim_Draw[AO_inAnim_Draw[OA_inAnim_Draw[ObjectNumber].AnimNo].Picture[i]][1], 
                       Object_Gr[AO_inAnim_Draw[OA_inAnim_Draw[ObjectNumber].AnimNo].Picture[i]], TRUE ); //画像の描画
            break;
        }
    }
	free(a);
}
 
void Anim_AllDraw(int OAM_inAnim_AllDraw , struct Obj *OA_inAnim_AllDraw , int AlP_inAnim_AllDraw , struct Anim *AO_inAnim_AllDraw , 
                                double Op_inAnim_AllDraw[][2] , int *OG_inAnim_AllDraw , int TC_inAnim_AllDraw){//定義されたアニメの描画
    //使用外部変数:ObjApMax,struct Obj ObjAp[]
    //Anim_Draw内部:define Anim_longest_Picture , struct Obj ObjAp[] , struct Anim AnimObj[]
                  //double Object_point[][] , int Object_Gr[] , int TimeCount
    //呼び出し元:main
    int i,j,k;
    int dumy=100000;//並び替え時の比較対象
    int H=0;
    int *KariObj = (int*)malloc(OAM_inAnim_AllDraw*sizeof(int));//[OAM_inAnim_AllDraw];//臨時出現オブジェクトデータベース
    for(i = 0; i < OAM_inAnim_AllDraw; i ++){
        KariObj[i]=-1;
    }
    for(j = 0; j < OAM_inAnim_AllDraw; j ++){//レイヤー順に並び替え
        for(i = 0; i < OAM_inAnim_AllDraw; i ++){
            if(OA_inAnim_AllDraw[i].flag>=0){//並び替えの対象は出現しているものに限る
                if(dumy>=OA_inAnim_AllDraw[i].layer){
                    for(k = 0; k < j; k++){
                        if(i==KariObj[k]){
                            H=1;
                        }
                    }
                    if(H==0){
                        dumy=OA_inAnim_AllDraw[i].layer;
                        KariObj[j]=i;
                    }
                    H=0;
                }
            }
        }
        H=0;
        dumy=100000;
    }
    for(j = 0; j < OAM_inAnim_AllDraw; j ++){
        if(KariObj[j] >= 0 && KariObj[j] < OAM_inAnim_AllDraw){
            Anim_Draw(KariObj[j],
				      AlP_inAnim_AllDraw,OA_inAnim_AllDraw,AO_inAnim_AllDraw,Op_inAnim_AllDraw,OG_inAnim_AllDraw,TC_inAnim_AllDraw);
        }
    }
	free(KariObj);
}
 
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
        ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定
        TimeCount=0;    
        PictureRead(Object_Gr,ReadForObject_Gr,PictureReadAmount);
 
        // while( 裏画面を表画面に反映, メッセージ処理, 画面クリア )
        while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){
            Obj_Syutugen(TimeCount,ObjAp,ObjPal,ObjApMax,ObjPalMax);
            Anim_AllDraw(ObjApMax,ObjAp,Anim_longest_Picture,AnimObj,Object_point,Object_Gr,TimeCount);
            TimeCount++;
        }
        
        DxLib_End(); // DXライブラリ終了処理
        return 0;
}

閉鎖

“C言語何でも質問掲示板” へ戻る