現在21章なのですが、
1>ini.obj : error LNK2001: 外部シンボル ""struct bullet_info_t * bullet_info" (?bullet_info@@3PAUbullet_info_t@@A)" は未解決です。
1>out.obj : error LNK2001: 外部シンボル ""struct bullet_info_t * bullet_info" (?bullet_info@@3PAUbullet_info_t@@A)" は未解決です。
1>F:\backup\20100927C直下\Documents and Settings\(ユーザ名)\デスクトップ\study\project\1章\Debug\RyuJin.exe : fatal error LNK1120: 外部参照 1 が未解決です。
以上のようなエラーが出ます。
全ての自作ファイルと21章のファイルとをWinMergeを利用して見比べたところ、私の目には間違いが見受けられませんでした。
このエラーを修正したいと思います。お力添えをよろしくお願いします。
以下に関係のありそうなコードを貼り付けますが、不足がありましたらお教えください。
ini.cpp
#include "../include/GV.h"
void input_bullet_info(bullet_info_t *binfo,int size_x,int size_y,int col_num,double range){
binfo->size_x =size_x; binfo->size_y =size_y;
binfo->col_num=col_num; binfo->range =range;
}
//一番最初の初期化
void first_ini(){
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;
input_bullet_info(&bullet_info[0],76, 76, 5,17.0);
input_bullet_info(&bullet_info[1],22, 22, 6, 4.0);
input_bullet_info(&bullet_info[2], 5,120,10, 2.5);
input_bullet_info(&bullet_info[3],19, 34, 5, 2.0);
input_bullet_info(&bullet_info[4],38, 38,10, 2.0);
input_bullet_info(&bullet_info[5],14, 16, 3, 3.5);
input_bullet_info(&bullet_info[6],14, 18, 3, 2.0);
input_bullet_info(&bullet_info[7],16, 16, 9, 2.5);
input_bullet_info(&bullet_info[8],12, 18,10, 1.5);
input_bullet_info(&bullet_info[9],13, 19, 3, 2.0);
}
//何度もする初期化
void ini(){
stage_count=1;
//void memset(void バッファ, int 文字、 size_t カウント);
//カウントの文字数分、文字をコピーしてバッファに書き込む。
//戻り値は、バッファのポインタ。
//メモリブロックを何かの値で初期化したい場合、利用できる。
memset(&ch,0,sizeof(ch_t));//自機のバッファに0を書き込む
ch.x=FIELD_MAX_X/2;
ch.y=FIELD_MAX_Y*3/4;
memset(enemy,0,sizeof(enemy_t)*ENEMY_MAX);
//sizeof演算子:渡された型や変数のメモリサイズを調べる。
//この場合、enemy_tのサイズを見ている。
memset(enemy_order,0,sizeof(enemy_order_t)*ENEMY_ORDER_MAX);
memset(shot,0,sizeof(shot_t)*SHOT_MAX);
memset(cshot,0,sizeof(cshot_t)*CSHOT_MAX);
ch.power=500;
memset(effect,0,sizeof(effect_t)*EFFECT_MAX);
memset(del_effect,0,sizeof(del_effect_t)*DEL_EFFECT_MAX);
ch.x=FIELD_MAX_X/2;
ch.y=FIELD_MAX_Y*3/4;
ch.power=500;
}
#include "../include/GV.h"
#define ENEMY_RANGE_MAX 4
#define CSHOT_RANGE_MAX 2
#define CRANGE 2.0
//敵当たり判定
int enemy_range[ENEMY_RANGE_MAX]={16,30,16,50};
//自機ショットの当たり判定
int cshot_range[CSHOT_RANGE_MAX]={6,};
//当たりを判定
int out_judge_cshot(int i,int s){
int j;
if(cshot[i].cnt>0){//ショットの軌道が一度でも計算されていたら
double x=cshot[i].x-enemy[s].x;//敵と自機ショットの距離
double y=cshot[i].y-enemy[s].y;//↑の縦座標
//オーバーフロー対策
if(cshot[i].knd>=CSHOT_RANGE_MAX || enemy[s].knd>=ENEMY_RANGE_MAX)
printfDx("out_judge_cshot内オーバーフロー");
//敵当たり判定+自機当たり判定
double r =cshot_range[cshot[i].knd]+enemy_range[enemy[s].knd];
//中間を計算する必要があれば
if(cshot[i].spd>r){
//1フレーム前の位置を格納
double pre_x=cshot[i].x+cos(cshot[i].angle+PI)*cshot[i].spd;
double pre_y=cshot[i].y+sin(cshot[i].angle+PI)*cshot[i].spd;
double px,py;
for(j=0;j<cshot[i].spd/r;j++){//進んだ分(cshot[i].spd÷当たり判定分ループ)
px=pre_x-enemy[s].x;
py=pre_y-enemy[s].y;
if(px*px+py*py<r*r)
return 1;
pre_x+=cos(cshot[i].angle)*r;
pre_y+=sin(cshot[i].angle)*r;
}
}
if(x*x+y*y<r*r)//当たり判定内なら
return 1;//当たり
}
return 0;//そうでないならはずれ=0
}
//自機⇔敵ショット当たり判定
int out_judge_enemyshot(int s, int n){
int j;
if(shot[s].bullet[n].cnt>0){//ショット軌道計算が一度でも行われていたら
double x=shot[s].bullet[n].x-ch.x;//敵と自機ショットの距離
double y=shot[s].bullet[n].y-ch.y;
//オーバーフロー対策
if(shot[s].bullet[n].knd>=10)
printfDx("out_judge_enemyshot内オーバーフロー\n");
//敵の当たり判定と自機ショットの当たり判定の合計範囲
double r = bullet_info[shot[s].bullet[n].knd].range+CRANGE;
//中間を計算する必要があれば
if(shot[s].bullet[n].spd>r){
//1フレーム前にいた位置を格納
double pre_x=shot[s].bullet[n].x+cos(shot[s].bullet[n].angle+PI)*shot[s].bullet[n].spd;
double pre_y=shot[s].bullet[n].y+sin(shot[s].bullet[n].angle+PI)*shot[s].bullet[n].spd;
double px,py;
for(j=0;j<shot[s].bullet[n].spd/r;j++){//進んだ分/当たり判定 分ループ
px=pre_x-ch.x;
py=pre_y-ch.y;
if(px*px+py*py<r*r)
return 1;
pre_x+=cos(shot[s].bullet[n].angle)*r;
pre_y+=sin(shot[s].bullet[n].angle)*r;
}
}
if(x*x+y*y<r*r)//当たり判定内なら
return 1;//当たり
}
return 0;
}
//敵消滅判定
extern void enter_del_effect(int);
void enemy_death_judge(int s){
int i;
se_flag[8]=1;
if(enemy[s].hp<0){//敵のhoが0より小さければ
enemy[s].flag=0;//敵生存フラグoff
se_flag[1]=1;//ティウン音
enter_del_effect(s);
for(i=0;i<SHOT_MAX;i++){//shotの総数まで
if(shot[i].flag!=0){//登録されたショットがあれば
if(s==shot[i].num){
shot[i].flag=2;//flag2で登録停止
break;
}
}
}
}
}
//自機ショット⇔敵の処理
void cshot_and_enemy(){
int i,s;
for(i=0;i<CSHOT_MAX;i++){//自機ショット総数まで
if(cshot[i].flag>0){//自機ショットが登録されていれば
for(s=0;s<ENEMY_MAX;s++){//敵総数
if(enemy[s].flag>0){
if(out_judge_cshot(i,s)){//自機ショットと敵が一致していれば
cshot[i].flag=0;//その自機ショットを消す
enemy[s].hp-=cshot[i].power;//hpからpower分引く
enemy_death_judge(s);//敵消滅判定
}
}
}
}
}
}
//敵ショット⇔自機の処理
void enemyshot_and_ch(){
int s,n;
for(s=0;s<SHOT_MAX;s++){//自機ショット総数まで
if(shot[s].flag>0){//自機ショットが登録されていれば
for(n=0;n<SHOT_BULLET_MAX;n++){//弾総数
if(shot[s].bullet[n].flag==1){
if(out_judge_enemyshot(s,n)){//時期にその弾が接触していたら
shot[s].bullet[n].flag=0;//弾をオフ
/*喰らいボム処理ここ*/
if(ch.flag==0 && ch.mutekicnt==0){//ステータスが通常で、無敵じゃない時
ch.flag =2; //1:喰らいボム受付中 2:死んで浮き上がり中
ch.cnt =0;
se_flag[3] =1;//ティウン音
return;
}
}
}
}
}
}
}
//当たり判定メイン
void out_main(){
cshot_and_enemy();
enemyshot_and_ch();
}
#ifndef STRUCT_H
#define STRUCT_H
//キャラ構造体
typedef struct
{
int flag; //フラグ
int cnt; //カウンタ
int power; //パワー
int point; //ポイント
int score; //スコア
int num; //残機
int mutekicnt; //無敵とカウント
int shot_mode; //ショットモード
int money; //お金
int img; //画像
int slow; //スロー判定
double x,y; //座標
int shot_cnt;
}ch_t; //構造体の中のchっていう変数
//敵構造体(knd=kind,種類)
typedef struct{
//フラグ、カウンタ、移動パターン、向き、敵の種類、(HP?)、MAXHP、ドロップ、画像
int flag,cnt,pattern,muki,knd,hp,hp_max,item_n[6],img,back_col;//<-背景色;
//座標、速度(v)x成分、スピード、角度
double x,y,vx,vy,sp,ang;
//弾幕開始時間、弾幕の種類、弾の種類、色、状態、待機時間、停滞時間
int bltime,blknd,blknd2,col,state,wtime,wait;
}enemy_t;
typedef struct{
//カウンタ、移動パターン、敵の種類
int cnt,pattern,knd;
//初期座標とスピード
double x,y,sp;
//弾幕開始時間、弾幕の種類、色、体力、弾の種類、停滞時間、アイテム(6)
int bltime,blknd,col,hp,blknd2,wait,item_n[6];
}enemy_order_t;
//PAD 構造体
typedef struct{
int key[PAD_MAX];
}pad_t; //構造体の中のpadっていう変数
//コンフィグの構造体
typedef struct{
int left,up,right,down,shot,bom,slow,start,change;
}configpad_t;//configpadで呼ぶ
//弾に関する構造体
typedef struct{
//フラグ、種類、カウンタ、色、状態、少なくとも消さない時間、エフェクトの色
int flag,knd,cnt,col,state,till,eff;
//座標、角度、速度、ベースの角度、一時記憶スピード
double x,y,angle,spd,base_angle[1],rem_spd[1];
}bullet_t;
//ショットに関する構造体
typedef struct{
//フラグ、種類、カウント、どの敵から発射されたか
int flag,knd,cnt,num;
//ベース角度、ベーススピード
double base_angle[1],base_spd[1];
bullet_t bullet[SHOT_BULLET_MAX];
}shot_t;
//キャラショットに関する構造体
typedef struct{
int flag,power,cnt,knd;
double x,y,angle,spd;
}cshot_t;
//エフェクト
typedef struct{
int flag,cnt,col,knd,img,eff,brt;
double x,y,r,ang;
}effect_t;
//消滅エフェクト
typedef struct{
int flag,cnt,col;
double x,y;
}del_effect_t;
//弾の情報
typedef struct{
int size_x,size_y,col_num;
double range;
}bullet_info_t;
#endif
#include "../../../include/DxLib.h"
#include "define.h"
#include "math.h"
#ifdef GLOBAL_INSTANCE//GLOBALがあるなら
#define GLOBAL //普通このあとに置き換えるものが続く。ないから空白
#else //そうでないなら
#define GLOBAL extern //GLOBALをexternとせよ
#endif //終わり
#include "function.h"
//画像の変数宣言
GLOBAL int img_ch[2][12];
//構造体の変数宣言。ch_tって型のchって変数
GLOBAL ch_t ch;
//コンフィグの構造体
GLOBAL configpad_t configpad;
//メインループの関数制御するやつ。状態を見る(フラグ?)
GLOBAL int func_state;
//ボードの変数
GLOBAL int img_board[40];
//ゲーム中のカウンタ
GLOBAL int stage_count;
//敵画像ハンドル
GLOBAL int img_enemy[3][9];//敵画像9枚分 X3体分
//敵の基本情報(いっぱい変数作った構造体)
GLOBAL enemy_t enemy[ENEMY_MAX];
//敵の出現情報(数は出現最大数まで)
GLOBAL enemy_order_t enemy_order[ENEMY_ORDER_MAX];
//弾の画像
GLOBAL int img_bullet[10][10];
//音楽ファイル用変数部(?)
GLOBAL int sound_se[SE_MAX];
//サウンドフラグ
GLOBAL int se_flag[SE_MAX];
//ショット情報
GLOBAL shot_t shot[SHOT_MAX];
//自機ショット用画像
GLOBAL int img_cshot[2];
//自機ショット登録用変数
GLOBAL cshot_t cshot[CSHOT_MAX];
//消滅エフェクトの画像に使う変数
GLOBAL int img_del_effect[5];
//消滅エフェクト
GLOBAL del_effect_t del_effect[DEL_EFFECT_MAX];
//エフェクト
GLOBAL effect_t effect[EFFECT_MAX];
//背景画像
GLOBAL int img_back[10];
GLOBAL int count;
//弾情報
GLOBAL bullet_info_t bullet_info[10];//弾情報