ページ 11

すいませんこのエラー原因がわかりません

Posted: 2015年1月04日(日) 20:17
by isyy
龍神録のサイトを参考にしてゲームを制作してるのですが10番の敵を表示させてみようのところで詰んでいます。いろいろと改変してみてるのですがエラーが取れません。どなたかお力をかしていただけないでしょうか 
ソースコードはこれで

コード:

 
main.cpp
#include "GV.h"

//ループで必ず行う3大処理
//ループで必ず行う3大処理
int ProcessLoop(){
    if(ProcessMessage()!=0)return -1;//プロセス処理がエラーなら-1を返す
    if(ClearDrawScreen()!=0)return -1;//画面クリア処理がエラーなら-1を返す
    GetHitKeyStateAll_2();//現在のキー入力処理を行う
    GetHitPadStateAll();  //現在のパッド入力処理を行う
    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=99;
                break;
            case 99://STGを始める前に行う初期化
                ini();
                func_state=100;
                break;

                func_state=100;
                break;
            case 100:
                calc_ch();       //キャラクタ計算
				ch_move();      //キャラクタの移動制御
				enemy_main();//敵処理メイン
                graph_main();//描画メイン
				stage_count++;
                break;
            default:
                printfDx("不明なfunc_state\n");
                break;
        }

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

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

コード:

load.cpp
#include "DxLib.h"
#include "GV.h"
extern int img_ch[2][12];

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

}

コード:

graph.cpp
#include "DxLib.h"
#include "GV.h"
#include "struct.h"
extern struct ch_t ch;
extern int img_ch[2][12];
extern struct enemey_t enemy[];

void graph_enemy(){
        int i;
        for(i=0;i<ENEMY_MAX;i++){
                if(enemy[i].flag==1){
                        DrawRotaGraphF(enemy[i].x+FIELD_X,enemy[i].y+FIELD_Y,1.0f,0.0f,img_enemy[0][enemy[i].img],TRUE);
                }
        }
}


void graph_ch(){
        DrawRotaGraphF(ch.x,ch.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();
	    graph_enemy();
}

コード:

fanction.cpp
#include "DxLib.h"
//graph.cpp
        //描画メイン
        GLOBAL void graph_main();

//key.cpp
        //現在のキー入力処理を行う
        GLOBAL int GetHitKeyStateAll_2();
        //受け取ったキー番号の現在の入力状態を返す
        GLOBAL int CheckStateKey(unsigned char Handle);

//laod.cpp
        //データのロード
        GLOBAL void load();
		GLOBAL void first_ini();
		GLOBAL void calc_ch();
		GLOBAL void GetHitPadStateAll();
		GLOBAL void ch_move();
        GLOBAL int CheckStatePad(unsigned int Handle);
		GLOBAL void enemy_main();
        GLOBAL void ini();

コード:

enemey.cpp
#include "DxLib.h"
#include "struct.h"
#include "GV.h"
extern struct enemey_t enemy[];
//敵の移動パターン0での移動制御
void enemy_pattern0(int i){
    if(enemy[i].cnt<60){
        enemy[i].y+=2.0;
    }
    if(enemy[i].cnt>60+240){
        enemy[i].y-=2.0;
    }
}

//敵データの登録
void enemy_enter(){
    if(stage_count==100){//ゲームが始まって100カウントで登録
        enemy[0].cnt    =0;
        enemy[0].muki   =1;
        enemy[0].flag   =1;
        enemy[0].bltime =150;
        enemy[0].hp     =1000;
        enemy[0].hp_max =enemy[0].hp;
        enemy[0].pattern=0;
        enemy[0].x      =FIELD_MAX_X/2;
        enemy[0].y      =-20;
    }
}

//敵の行動制御
void enemy_act(){
    int i;
    for(i=0;i<ENEMY_MAX;i++){
        if(enemy[i].flag==1){//その敵のフラグがオンになってたら
            enemy_pattern0(i);
            enemy[i].cnt++;
            enemy[i].img=enemy[i].muki*3+(enemy[i].cnt%18)/6;
            //敵が画面から外れたら消す
            if(enemy[i].x<-50 || FIELD_MAX_X+50<enemy[i].x || enemy[i].y<-50 || FIELD_MAX_Y+50<enemy[i].y)
                enemy[i].flag=0;
        }
    }
}

//敵処理メイン
void enemy_main(){
    enemy_enter();
    enemy_act();
}

コード:

define.h

#define FIELD_MAX_X 384
#define FIELD_MAX_Y 448

#define FIELD_X 32
#define FIELD_Y 16

#define PAD_MAX 16
#define ENEMY_MAX 30

コード:

struct.h
//キャラクターに関する構造体
  struct ch_t{
        int flag;       //フラグ
        int cnt;        //カウンタ
        int power;      //パワー
        int point;      //ポイント
        int score;      //スコア
        int num;        //残機数
        int mutekicnt;  //無敵状態とカウント
        int shot_mode;  //ショットモード
        int money;      //お金
        int img;        //画像
        int slow;       //スローかどうか
        float x,y;     //座標
} ;

//パッドに関する構造体
 struct pad_t{
        int key[PAD_MAX];
};

//コンフィグに関する構造体
 struct configpad_t{
        int left;
		int	up;
		int	right;
		int	down;
		int	shot;
		int	bom;
		int	slow;
		int	start;
		int	change;
 };
  struct enemy_t{
        //フラグ、カウンタ、移動パターン、向き、敵の種類、HP最大値、落とすアイテム、画像
        int flag;
		int	cnt;
		int	pattern;
		int	muki;
		int	knd;
		int	hp;
		int	hp_max;
		int	item_n[6];
		int	img;
        //座標、速度x成分、速度y成分、スピード、角度
        double x;
		double	y;
		double	vx;
		double	vy;
		double	sp;
		double	ang;
        
        int bltime;//弾幕開始時間、
		int	blknd;//弾の種類
		int	blknd2;//弾の種類
		int	col;//色
		int	state;//状態
		int	wtime;//待機時間
		int	wait;//停滞時間
};

コード:

key.cpp
#include "DxLib.h"
#include "GV.h"
#include "struct.h"
 extern struct configpad_t configpad;
unsigned int stateKey[256];

int GetHitKeyStateAll_2(){
    char GetHitKeyStateAll_Key[256];
    GetHitKeyStateAll( GetHitKeyStateAll_Key );
    for(int i=0;i<256;i++){
        if(GetHitKeyStateAll_Key[i]==1) stateKey[i]++;
        else                            stateKey[i]=0;
    }
    return 0;
}

int CheckStateKey(unsigned char Handle){
        return stateKey[Handle];
}

//パッドの入力状態を格納する変数
extern struct pad_t pad;

//引数1と引数2のうち大きい方を引数1に代入する
void input_pad_or_key(int *p, int k){
          *p =   *p>k ?   *p : k;
}
//パッドとキーボードの両方の入力をチェックする関数
void GetHitPadStateAll(){
        int i,PadInput,mul=1;
        PadInput = GetJoypadInputState( DX_INPUT_PAD1 );//パッドの入力状態を取得
        for(i=0;i<16;i++){
                if(PadInput & mul)  pad.key[i]++;
                else                pad.key[i]=0;
                mul=2;
        }
        input_pad_or_key(&pad.key[configpad.left]   ,CheckStateKey(KEY_INPUT_LEFT    ));
        input_pad_or_key(&pad.key[configpad.up]     ,CheckStateKey(KEY_INPUT_UP      ));
        input_pad_or_key(&pad.key[configpad.right]  ,CheckStateKey(KEY_INPUT_RIGHT   ));
        input_pad_or_key(&pad.key[configpad.down]   ,CheckStateKey(KEY_INPUT_DOWN    ));
        input_pad_or_key(&pad.key[configpad.shot]   ,CheckStateKey(KEY_INPUT_Z       ));
        input_pad_or_key(&pad.key[configpad.bom]    ,CheckStateKey(KEY_INPUT_X       ));
        input_pad_or_key(&pad.key[configpad.slow]   ,CheckStateKey(KEY_INPUT_LSHIFT  ));
        input_pad_or_key(&pad.key[configpad.start]  ,CheckStateKey(KEY_INPUT_ESCAPE  ));
        input_pad_or_key(&pad.key[configpad.change] ,CheckStateKey(KEY_INPUT_LCONTROL));
}

//渡されたパッドキー番号の入力状態を返す。返り値が-1なら不正
int CheckStatePad(unsigned int Handle){
        if(0<=Handle && Handle<PAD_MAX){
                return pad.key[Handle];
        }
        else{
                printfDx("CheckStatePadに渡した値が不正です\n");
                return -1;
        }
}

コード:

GV.h
#include "DxLib.h"
#include "define.h"
#ifdef GLOBAL_INSTANCE
#define GLOBAL
#else
#define GLOBAL extern 
#endif
#include "function.h"           //関数宣言
#include "math.h"

//画像用変数宣言部
GLOBAL int img_ch[2][12];       //キャラクタ画像9枚分 X2(変身用)

//構造体変数宣言部
extern struct  ch_t ch;                 //キャラクタデータ宣言
extern struct configpad_t configpad;
GLOBAL int func_state;
GLOBAL int img_board[40];
GLOBAL void calc_ch();
GLOBAL int stage_count;
GLOBAL int img_enemy[3][9];//敵画像9枚分 X3体分
extern struct enemey_t enemy[];

コード:

ini.cpp
#include "DxLib.h"
#include "define.h"
#include "struct.h"
#include "GV.h"

 struct ch_t ch;
 struct pad_t pad;
 struct configpad_t configpad;
 struct enemy_t enemy[ENEMY_MAX];
void first_ini(){
	//一番最初の初期化
        ch.x=FIELD_MAX_X/2;
        ch.y=FIELD_MAX_Y*3/4;
		configpad.down=0;
        configpad.left=1;
        configpad.right=2;
        configpad.up=3;
        configpad.bom=4;
        configpad.shot=5;
        configpad.slow=11;
        configpad.start=13;
        configpad.change=6;

}
void ini(){
        stage_count=1;
        memset(&ch,0,sizeof(ch_t));//自機データの初期化
        ch.x=FIELD_MAX_X/2;
        ch.y=FIELD_MAX_Y*3/4;
        memset(enemy,0,sizeof(enemy_t)*ENEMY_MAX);//敵データの初期化
}
エラーの出てる箇所はenemey.cpp 7~12行目、18~26行目、34~40行目
          graph.cpp 11~12行目
エラーの種類は同じでenemey_t enemey[]Error;式は完全なオブジェクト型へのポインターである必要があります。です
宜しくお願いします。

Re: すいませんこのエラー原因がわかりません

Posted: 2015年1月04日(日) 20:22
by みけCAT
コードを提示するときはBBcodeを有効にした状態でcodeタグで囲み、
かつ適切なインデントをしていただけると、見やすくて助かります。

コンパイルはしていませんが、GV.hで

コード:

extern struct ch_t ch; //キャラクタデータ宣言
という行より前でstruct.hをincludeしていないのがまずいのではないでしょうか?

Re: すいませんこのエラー原因がわかりません

Posted: 2015年1月04日(日) 20:31
by isyy
ご指摘ありがとうございます。GV.hにstruct.hをincludeしてみたのですが赤線はまだ消えません。

Re: すいませんこのエラー原因がわかりません

Posted: 2015年1月04日(日) 21:09
by box
コンパイル時にエラーが出ているのであれば、
どのソースファイルの
何行目で
どんなエラーメッセージが出ている
か、といったような詳しい内容をコピペしてくださると、
回答しようとする側が質問者さんの陥っている状況を推測しやすくなると思います。

Re: すいませんこのエラー原因がわかりません

Posted: 2015年1月04日(日) 21:32
by isyy
すいません。今見やすいように改変しました。

Re: すいませんこのエラー原因がわかりません

Posted: 2015年1月04日(日) 21:45
by みけCAT
struct.hではenemey_tではなくenemy_tが定義されているのに、
enemey.cppやgraph.cppではenemy_tではなくenemey_tが使用されており、統一されていないのがまずいと思います。
ファイル名に合わせて、struct.hとini.cppのenemy_tを全てenemey_tに書き換えるといいと思います。

Re: すいませんこのエラー原因がわかりません

Posted: 2015年1月05日(月) 08:32
by isyy
ご指摘ありがとうございます。おかげでエラーが取れました。
以下の部分のコードを改変してみのですが
ini.cpp

コード:

#include "DxLib.h"
#include "define.h"
#include "struct.h"
#include "GV.h"

 struct ch_t ch;
 struct pad_t pad;
 struct configpad_t configpad;
 struct enemey_t enemey;
void first_ini(){
	//一番最初の初期化
        ch.x=FIELD_MAX_X/2;
        ch.y=FIELD_MAX_Y*3/4;
		configpad.down=0;
        configpad.left=1;
        configpad.right=2;
        configpad.up=3;
        configpad.bom=4;
        configpad.shot=5;
        configpad.slow=11;
        configpad.start=13;
        configpad.change=6;

}
void ini(){
        stage_count=1;
        memset(&ch,0,sizeof(ch_t));//自機データの初期化
        ch.x=FIELD_MAX_X/2;
        ch.y=FIELD_MAX_Y*3/4;
        memset(enemy,0,sizeof(enemey_t)*ENEMY_MAX);//敵データの初期化
}
struct.h

コード:

#include "define.h"
//キャラクターに関する構造体
  struct ch_t{
        int flag;       //フラグ
        int cnt;        //カウンタ
        int power;      //パワー
        int point;      //ポイント
        int score;      //スコア
        int num;        //残機数
        int mutekicnt;  //無敵状態とカウント
        int shot_mode;  //ショットモード
        int money;      //お金
        int img;        //画像
        int slow;       //スローかどうか
        float x,y;     //座標
} ;

//パッドに関する構造体
 struct pad_t{
        int key[PAD_MAX];
};

//コンフィグに関する構造体
 struct configpad_t{
        int left;
		int	up;
		int	right;
		int	down;
		int	shot;
		int	bom;
		int	slow;
		int	start;
		int	change;
 };
  struct enemey_t{
        //フラグ、カウンタ、移動パターン、向き、敵の種類、HP最大値、落とすアイテム、画像
        int flag;
		int	cnt;
		int	pattern;
		int	muki;
		int	knd;
		int	hp;
		int	hp_max;
		int	item_n[6];
		int	img;
        //座標、速度x成分、速度y成分、スピード、角度
        double x;
		double	y;
		double	vx;
		double	vy;
		double	sp;
		double	ang;
        
        int bltime;//弾幕開始時間、
		int	blknd;//弾の種類
		int	blknd2;//弾の種類
		int	col;//色
		int	state;//状態
		int	wtime;//待機時間
		int	wait;//停滞時間
};
これをコンパイルすると以下のようなエラーが出ます
エラー 3 error LNK2001: 外部シンボル ""struct enemey_t * enemy" (?enemy@@3PAUenemey_t@@A)" は未解決です。 F:\DxLib_VC\サンプルプログラム実行用フォルダ\enemey.obj DxLib_VC2012用
エラー 4 error LNK2001: 外部シンボル ""struct enemey_t * enemy" (?enemy@@3PAUenemey_t@@A)" は未解決です。 F:\DxLib_VC\サンプルプログラム実行用フォルダ\graph.obj DxLib_VC2012用
エラー 5 error LNK2001: 外部シンボル ""struct enemey_t * enemy" (?enemy@@3PAUenemey_t@@A)" は未解決です。 F:\DxLib_VC\サンプルプログラム実行用フォルダ\ini.obj DxLib_VC2012用
エラー 6 error LNK1120: 1 件の未解決の外部参照 F:\DxLib_VC\サンプルプログラム実行用フォルダ\Debug\DxLib_VC2012用.exe DxLib_VC2012用
これはどういう意味でしょうか

Re: すいませんこのエラー原因がわかりません

Posted: 2015年1月05日(月) 08:44
by みけCAT
変数enemyの実体が無いと言う意味です。
識別子enemyを使っている場所をgrepなどで探して、全てenemeyに書き換えてください。
※ここでは「識別子」は「変数名」に近い意味です。例えばenemy_tは識別子enemyではありません。

Re: すいませんこのエラー原因がわかりません

Posted: 2015年1月05日(月) 10:06
by isyy
すいません。
以下のように改変はしてみたのですが
ini.cpp

コード:

#include "DxLib.h"
#include "define.h"
#include "struct.h"
#include "GV.h"

 struct ch_t ch;
 struct pad_t pad;
 struct configpad_t configpad;
 struct enemey_t enemey;
void first_ini(){
	//一番最初の初期化
        ch.x=FIELD_MAX_X/2;
        ch.y=FIELD_MAX_Y*3/4;
		configpad.down=0;
        configpad.left=1;
        configpad.right=2;
        configpad.up=3;
        configpad.bom=4;
        configpad.shot=5;
        configpad.slow=11;
        configpad.start=13;
        configpad.change=6;

}
void ini(){
        stage_count=1;
        memset(&ch,0,sizeof(ch_t));//自機データの初期化
        ch.x=FIELD_MAX_X/2;
        ch.y=FIELD_MAX_Y*3/4;
        memset(enemey,0,sizeof(enemey_t)*ENEMY_MAX);//敵データの初期化
}
graph.cpp

コード:

#include "DxLib.h"
#include "GV.h"
#include "struct.h"
extern struct ch_t ch;
extern int img_ch[2][12];
extern struct enemey_t enemey[];

void graph_enemy(){
        int i;
        for(i=0;i<ENEMY_MAX;i++){
                if(enemey[i].flag==1){
                        DrawRotaGraphF(enemey[i].x+FIELD_X,enemey[i].y+FIELD_Y,1.0f,0.0f,img_enemy[0][enemey[i].img],TRUE);
                }
        }
}


void graph_ch(){
        DrawRotaGraphF(ch.x,ch.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();
	    graph_enemy();
}
enmey.cpp

コード:

#include "DxLib.h"
#include "struct.h"
#include "GV.h"
extern struct enemey_t enemey[];
//敵の移動パターン0での移動制御
void enemy_pattern0(int i){
    if(enemey[i].cnt<60){
        enemey[i].y+=2.0;
    }
    if(enemey[i].cnt>60+240){
        enemey[i].y-=2.0;
    }
}

//敵データの登録
void enemy_enter(){
    if(stage_count==100){//ゲームが始まって100カウントで登録
        enemey[0].cnt    =0;
        enemey[0].muki   =1;
        enemey[0].flag   =1;
        enemey[0].bltime =150;
        enemey[0].hp     =1000;
        enemey[0].hp_max =enemey[0].hp;
        enemey[0].pattern=0;
        enemey[0].x      =FIELD_MAX_X/2;
        enemey[0].y      =-20;
    }
}

//敵の行動制御
void enemy_act(){
    int i;
    for(i=0;i<ENEMY_MAX;i++){
        if(enemey[i].flag==1){//その敵のフラグがオンになってたら
            enemy_pattern0(i);
            enemey[i].cnt++;
            enemey[i].img=enemey[i].muki*3+(enemey[i].cnt%18)/6;
            //敵が画面から外れたら消す
            if(enemey[i].x<-50 || FIELD_MAX_X+50<enemey[i].x || enemey[i].y<-50 || FIELD_MAX_Y+50<enemey[i].y)
                enemey[i].flag=0;
        }
    }
}

//敵処理メイン
void enemy_main(){
    enemy_enter();
    enemy_act();
}
GV.h

コード:

#include "DxLib.h"
#include "define.h"
#ifdef GLOBAL_INSTANCE
#define GLOBAL
#else
#define GLOBAL extern 
#endif
#include "function.h"           //関数宣言
#include "math.h"

//画像用変数宣言部
GLOBAL int img_ch[2][12];       //キャラクタ画像9枚分 X2(変身用)

//構造体変数宣言部
extern struct  ch_t ch;                 //キャラクタデータ宣言
extern struct configpad_t configpad;
GLOBAL int func_state;
GLOBAL int img_board[40];
GLOBAL void calc_ch();
GLOBAL int stage_count;
GLOBAL int img_enemy[3][9];//敵画像9枚分 X3体分
extern struct enemey_t enemey[];
これをコンパイルすると
エラー 1 error C2040: 'enemey' : 'enemey_t' は 'enemey_t []' と間接操作のレベルが異なります。 f:\dxlib_vc\サンプルプログラム実行用フォルダ\ini.cpp 9 1 DxLib_VC2012用
4 IntelliSense: 宣言に "enemey_t enemey[]" (宣言された 行 22 、ファイル名 "f:\dxlib_vc\サンプルプログラム実行用フォルダ\gv.h") との互換性がありません f:\DxLib_VC\サンプルプログラム実行用フォルダ\ini.cpp 9 18 DxLib_VC2012用
   5  IntelliSense: "enemey_t" から "void *" への適切な変換関数が存在しません f:\DxLib_VC\サンプルプログラム実行用フォルダ\ini.cpp 30 16 DxLib_VC2012用
6 IntelliSense: 宣言に "enemey_t enemey" (宣言された 行 9 、ファイル名 "f:\dxlib_vc\サンプルプログラム実行用フォルダ\ini.cpp") との互換性がありません f:\DxLib_VC\サンプルプログラム実行用フォルダ\GV.h 22 24 DxLib_VC2012用
とでて未解決は無事なくなりましたが新しいエラーが出てきました。

Re: すいませんこのエラー原因がわかりません

Posted: 2015年1月05日(月) 17:38
by isyy
ありがとうございます。無事解決できました