別ファイルで宣言した変数が使えない

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

別ファイルで宣言した変数が使えない

#1

投稿記事 by parsley » 4ヶ月前

シューティングゲームを作ろうと思い、弾やキャラクターをメインファイルとは別のファイルにしているのですが、弾と敵の当たり判定を行う関数をメインファイルで作ろうとしたのですが、弾の座標だけメインファイルだけでは使えませんでした。

コード:

#pragma once
#include"../support/vec3.h"


class Bullet {
public:
	t2k::vec3 loc;
	bool live;
	int image;

};

class N_Bullet : public Bullet {
public:

	void initialze();
	void draw();
	void move();
	void create(int sx, int sy);

};

で弾のクラスを作っていて

コード:

#include"bullet.h"
#include"../support/vec3.h"

extern t2k::vec3 loc;


bool Hit() {
	

	int nx = enemy.x - loc.x ;
	int ny = enemy.y - loc.y;
	float length = sqrt((nx*nx) + (ny*ny));
	
	if (length < (br + pr)) {
		return true;
	}
	return false;
	
	
}

メインファイルで使おうとすると敵キャラの座標であるenemy.x、yはエラーは起こさないのですがlocのほうは未解決の外部参照と出てしまいます。vec3を使うのが問題なのかと思い通常の変数に変えても未解決と言われました。別ファイルで作成した弾の変数などをメイン関数で使うときはどうしたらよいでしょうか?

アバター
usao
記事: 1472
登録日時: 5年前

Re: 別ファイルで宣言した変数が使えない

#2

投稿記事 by usao » 4ヶ月前

extern t2k::vec3 loc;
というのは,
t2k::vec3型のlocというインスタンスがどこか(非ローカルな場所)に存在しているハズ
ということを宣言しているだけだから
その実態が存在しないなら当然エラーになるわけですが,存在するんですか?

#仮に,もし,このexternで,class Bulletのメンバのlocのことを指そうとしている,という話なのだとしたら,
何かをものすごく勘違いしていると思う.

parsley
記事: 8
登録日時: 6ヶ月前

Re: 別ファイルで宣言した変数が使えない

#3

投稿記事 by parsley » 4ヶ月前

まだプログラムを始めて数か月しかたっておらず参考書やネットで自分なりに調べてはいるのですが理解力が足りずすみません。さらに質問に質問を重ねて申し訳ないのですがインスタンスが存在するには何があればいいのでしょうか?

コード:

void N_Bullet::create(int sx, int sy){
	live = true;
	loc.x = sx;
	loc.y = sy;

}

void N_Bullet::draw() {
	if (!live)return; 
		DrawRotaGraph(loc.x, loc.y, 1.0F, (PI / 180) * 270, b[8], true);
		DrawCircle(loc.x, loc.y, pr, -1, false);
	
}

void N_Bullet::move() {
	if (Rotate == 0) {
		t2k::vec3 v(1, 0, 0);
		loc += (v*5.0F);
	}
	if (Rotate == 1) {
		t2k::vec3 v(-1, 0, 0);
		loc += (v*5.0F);
	}
一応これがvec3 locを使っている場所なんですが…
extern t2k::vec3 を使ったのは別にextern N_Bullet bullet;があるのですがそれだけだとlocが定義されていないと言われたので使いました。(解決してないのですが)

かずま

Re: 別ファイルで宣言した変数が使えない

#4

投稿記事 by かずま » 4ヶ月前

こんな感じじゃないのでしょうか?

main.cpp

コード:

#include "bullet.h"
#include "../support/vec3.h"

extern N_Bullet bullet; // bullet は、別のファイルで定義した変数

bool Hit()
{
	int nx = enemy.x - bullet.loc.x;  // loc は、N_Bullet のメンバ変数
	int ny = enemy.y - bullet.loc.y;  // x, y は、t2k::vec3 のメンバ変数
	float length = sqrt(nx*nx + ny*ny);
	return length < br + pr;
}
bullet.cpp

コード:

#include "bullet.h"

N_Bullet bullet;  // 変数 bullet は、N_Bulletクラスのインスタンス

void N_Bullet::create(int sx, int sy)
{
	live = true;
	loc.x = sx;
	loc.y = sy;
}

void N_Bullet::draw()
{
	if (!live) return; 
	DrawRotaGraph(loc.x, loc.y, 1.0F, (PI / 180) * 270, b[8], true);
	DrawCircle(loc.x, loc.y, pr, -1, false);
}

void N_Bullet::move()
{
	if (Rotate == 0) {
		t2k::vec3 v(1, 0, 0);
		loc += (v*5.0F);
	}
	if (Rotate == 1) {
		t2k::vec3 v(-1, 0, 0);
		loc += (v*5.0F);
	}
}

アバター
usao
記事: 1472
登録日時: 5年前

Re: 別ファイルで宣言した変数が使えない

#5

投稿記事 by usao » 4ヶ月前

オフトピック
> まだプログラムを始めて数か月しかたっておらず参考書やネットで自分なりに調べてはいるのですが理解力が足りずすみません。さらに質問に質問を重ねて申し訳ないのですがインスタンスが存在するには何があればいいのでしょうか?

これは 苦言 ではなく 助言 ですが,
{型,インスタンス,通用範囲,生存期間,etc…}といった事柄があやふやな状態では
この先,高頻度で同じように躓くことになるかもしれません.
一度基礎的な事柄に立ち返って固めるのが近道かと.

parsley
記事: 8
登録日時: 6ヶ月前

Re: 別ファイルで宣言した変数が使えない

#6

投稿記事 by parsley » 4ヶ月前

>かずまさん
言われた通り直してみたらできました!ありがとうございます!

>usaoさん
そうですね…今後のためにも、もっと基礎を固めていこうと思います。わざわざ質問に答えていただきありがとうございます。

返信

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