ページ 11

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

Posted: 2018年7月14日(土) 15:12
by parsley
シューティングゲームを作ろうと思い、弾やキャラクターをメインファイルとは別のファイルにしているのですが、弾と敵の当たり判定を行う関数をメインファイルで作ろうとしたのですが、弾の座標だけメインファイルだけでは使えませんでした。

コード:

#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を使うのが問題なのかと思い通常の変数に変えても未解決と言われました。別ファイルで作成した弾の変数などをメイン関数で使うときはどうしたらよいでしょうか?

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

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

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

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

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

コード:

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: 別ファイルで宣言した変数が使えない

Posted: 2018年7月15日(日) 12:39
by かずま
こんな感じじゃないのでしょうか?

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);
	}
}

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

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

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

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

Posted: 2018年7月15日(日) 20:32
by parsley
>かずまさん
言われた通り直してみたらできました!ありがとうございます!

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