実態の定義がされません

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

実態の定義がされません

#1

投稿記事 by isyy » 10年前

龍神録でのゲーム制作が終わったので今度は自作で一からゲームを制作しているのですが
敵表示が上手くいきません、以下ソースコード
main.cpp

コード:

#include "DxLib.h"
#include "SceneMgr.h"
  int x, y;// 画像のいる座標 
  char KeyBuf[256];// キーが押されてる状態を入れる文字配列 

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

    while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){//画面更新 & メッセージ処理 & 画面消去
		
        SceneMgr_Update();  //更新
        SceneMgr_Draw();    //描画

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

コード:

#pragma once

//更新
void Menu_Update();

//描画
void Menu_Draw();
menu.cpp

コード:

#include "Menu.h"
#include "SceneMgr.h"
#include "DxLib.h"

//更新
void Menu_Update(){
    if(CheckHitKey(KEY_INPUT_G)!=0){//Gキーが押されていたら
        SceneMgr_ChangeScene(eScene_Game);//シーンをゲーム画面に変更
    }
    if(CheckHitKey(KEY_INPUT_C)!=0){//Cキーが押されていたら
        SceneMgr_ChangeScene(eScene_Config);//シーンを設定画面に変更
    }
}

//描画
void Menu_Draw(){
    DrawString(0, 0,"メニュー画面です。",GetColor(255,255,255));
    DrawString(0,20,"Gキーを押すとゲーム画面に進みます。",GetColor(255,255,255));
    DrawString(0,40,"Cキーを押すと 設定画面に進みます。",GetColor(255,255,255));
}
config.h

コード:

#pragma once

//更新
void Config_Update();

//描画
void Config_Draw();
game.h

コード:

#pragma once

//更新
void Game_Update();

//描画
void Game_Draw();
game.cpp

コード:

#include "Game.h"
#include "SceneMgr.h"
#include "DxLib.h"
#include "struct.h"

#define ENEMY_MAX 30
#define WINDOW_H 480
#define WINDOW_W 640
#define MOVE_UP 1
#define MOVE_DAWN 0
#define MOVE_RIGHT 1
#define MOVE_LEFT 0
 struct ch_t ch;
 struct configpad_t configpad;
 struct enemy_t enemy[];
 int img_ch[2][12];
 int img_enemy[3][9];//敵画像9枚分 X3体分
 int i;
void GameInit(){
	ch.speed=50;
	ch.x=320;
	ch.y=500;
	enemy[i].x = 50;
	enemy[i].y = 200;
	enemy[i].muki = MOVE_RIGHT;
}
void KeyCheck()
{
			if(CheckHitKey(KEY_INPUT_LEFT)) ch.x-=ch.speed;
			if(CheckHitKey(KEY_INPUT_RIGHT))ch.x+=ch.speed;
			if(CheckHitKey(KEY_INPUT_UP))ch.y-=ch.speed;
			if(CheckHitKey(KEY_INPUT_DOWN))ch.y+=ch.speed;
}
void load(){
        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]);

}
void enemeyDraw(){
	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 enemy_Move(){
	int i;
	for (i = 0; i<ENEMY_MAX; i++)
			if(enemy[i].muki==MOVE_RIGHT)enemy[i].x+=enemy[i].sp;
			if(enemy[i].muki==MOVE_LEFT)enemy[i].x-=enemy[i].sp;
			if(enemy[i].x>WINDOW_H-enemy[i].h){
				enemy[i].x=WINDOW_H-enemy[i].w;
				enemy[i].muki=MOVE_LEFT;
			}
			if(enemy[i].x<0){
			enemy[i].x=0;
			enemy[i].muki=MOVE_RIGHT;
			}
}
void Ch_Draw(){
	if(ch.x >= 620)ch.x = ch.x - 10;
    if(ch.y>=460)ch.y=ch.y-10;
	if(ch.x==-10)ch.x=+10;
	if(ch.y==-10)ch.y=ch.y+10;
	DrawRotaGraphF(ch.x, ch.y, 1.0f, 0.0f, img_ch[0][ch.img], TRUE);
}
//更新
void Game_Update(){
    if(CheckHitKey(KEY_INPUT_ESCAPE)!=0){ //Escキーが押されていたら
        SceneMgr_ChangeScene(eScene_Menu);//シーンをメニューに変更
    }
}

//ゲームメイン
void Game_Draw(){
		GameInit();
		load();
		KeyCheck();
		enemeyDraw();
		enemy_Move();
		Ch_Draw();
}
secenMgr.h

コード:

#pragma once

typedef enum {
    eScene_Menu,    //メニュー画面
    eScene_Game,    //ゲーム画面
    eScene_Config,  //設定画面
} eScene ;

//更新
void SceneMgr_Update();

//描画
void SceneMgr_Draw();

// 引数 nextScene にシーンを変更する
void SceneMgr_ChangeScene(eScene nextScene);
secenMgr.cpp

コード:

#include "DxLib.h"
#include "Config.h"
#include "Game.h"
#include "Menu.h"
#include "SceneMgr.h"

static eScene Scene = eScene_Menu;    //シーン管理変数

//更新
void SceneMgr_Update(){
    switch(Scene){       //シーンによって処理を分岐
    case eScene_Menu:    //現在の画面がメニューなら
        Menu_Update();   //メニュー画面の更新処理をする
        break;//以下略
    case eScene_Game:
        Game_Update();
        break;
    case eScene_Config:
        Config_Update();
        break;
    }
}

//描画
void SceneMgr_Draw(){
    switch(Scene){      //シーンによって処理を分岐
    case eScene_Menu:   //現在の画面がメニュー画面なら
        Menu_Draw();    //メニュー画面の描画処理をする
        break;//以下略
    case eScene_Game:
        Game_Draw();
        break;
    case eScene_Config:
        Config_Draw();
        break;
    }
}

// 引数 nextScene にシーンを変更する
void SceneMgr_ChangeScene(eScene NextScene){
    Scene = NextScene;
}
struct.h

コード:

#include "define.h"
//キャラクターに関する構造体
  struct ch_t{
        int flag;       //フラグ
		int speed;
		int h;
		int w;
        int cnt;        //カウンタ
        int power;      //パワー
        int point;      //ポイント
        int score;      //スコア
        int num;        //残機数
        int mutekicnt;  //無敵状態とカウント
        int shot_mode;  //ショットモード
        int money;      //お金
        int img;        //画像
        int slow;       //スローかどうか
        float x,y;     //座標
		int shot_cnt;  //ショットのカウンタ
		int graph;
} ;
//
//パッドに関する構造体
 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 w;
		int h;
		int	cnt;
		int	pattern;
		int	muki;
		int	knd;
		int	hp;
		int	hp_max;
		int	item_n[6];
		int	img;
		int back_col;
        //座標、速度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;//停滞時間
};
これをコンパイルすると
エラー 2 error LNK2001: 外部シンボル ""struct enemy_t * enemy" (?enemy@@3PAUenemy_t@@A)" は未解決です。 F:\DxLib_VC 1月7日\サンプルプログラム実行用フォルダ\game.obj DxLib_VC2012用と出ますこれはなぜでしょうか?game.cppで構造体の宣言はしてるはずなのですが

Rittai_3D
記事: 525
登録日時: 12年前

Re: 実態の定義がされません

#2

投稿記事 by Rittai_3D » 10年前

気になったところですが、game.cpp の

コード:

struct enemy_t enemy[];
要素数が書いてありません。

コード:

void GameInit(){
    ch.speed=50;
    ch.x=320;
    ch.y=500;
    enemy[i].x = 50;
    enemy[i].y = 200;
    enemy[i].muki = MOVE_RIGHT;
}
i の値は不定なのでちゃんと初期化しましょう。 【訂正】グローバル変数は0で初期化されます。勘違いでした。すいません。
また、のちの関数内で int i; があるので、18行目の i は変更したほうがよいでしょう。
最後に編集したユーザー Rittai_3D on 2015年1月20日(火) 21:34 [ 編集 1 回目 ]
初心者です

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 実態の定義がされません

#3

投稿記事 by みけCAT » 10年前

isyy さんが書きました:

コード:

 struct ch_t ch;
 struct configpad_t configpad;
 struct enemy_t enemy[];
 int img_ch[2][12];
 int img_enemy[3][9];//敵画像9枚分 X3体分
 int i;
void GameInit(){
	ch.speed=50;
	ch.x=320;
	ch.y=500;
	enemy[i].x = 50;
	enemy[i].y = 200;
	enemy[i].muki = MOVE_RIGHT;
}
Rittai_3D さんが書きました:

コード:

void GameInit(){
    ch.speed=50;
    ch.x=320;
    ch.y=500;
    enemy[i].x = 50;
    enemy[i].y = 200;
    enemy[i].muki = MOVE_RIGHT;
}
i の値は不定なのでちゃんと初期化しましょう。
C言語/C++では明示的に初期化されていないグローバル変数は0で初期化されると思っているのですが、
Rittai_3Dさんが「i の値は不定」と考えた根拠は何でしょうか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Rittai_3D
記事: 525
登録日時: 12年前

Re: 実態の定義がされません

#4

投稿記事 by Rittai_3D » 10年前

>みけCATさん

すいません、勘違いしていました。
グローバル変数は0で初期化されていますよね。
訂正しておきます。
初心者です

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 実態の定義がされません

#5

投稿記事 by みけCAT » 10年前

オフトピック
DXライブラリが使用されているっぽくて、ファイルの拡張子っぽく見える文字列もcppなのに、
コードタグの指定がCで、structを用いて構造体変数を宣言しているので、C言語なのかC++なのか独自言語なのかよくわかりませんが、
厳密には、C++では明示的に初期化されていないグローバル変数は「引数のないコンストラクタが呼ばれる」のような気がします。

コード:

#include <cstdio>

struct hoge {
	int a;
	hoge(): a(42) {}
	hoge(int n): a(n) {}
};

hoge h;
hoge o = 0;

int main(void) {
	printf("%d\n", h.a);
	printf("%d\n", o.a);
	return 0;
}
というコードを実行すると、

コード:

42
0
と出力されます。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

isyy
記事: 19
登録日時: 10年前
住所: 北海道

Re: 実態の定義がされません

#6

投稿記事 by isyy » 10年前

ありがとうございます。無事に進めることができました。

閉鎖

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