ソースコードを分離したらエラーを吐き出した。

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

ソースコードを分離したらエラーを吐き出した。

#1

投稿記事 by keito940 » 8年前

二段ジャンプまでなんとか実装できたのですが、コードを分離しようと思ってコードを分離してみたところ、LNK2005 "int CameraY" (?CameraY@@3HA) は既に main.obj で定義されています。(CameraXも同様です。)というエラーと、1 つ以上の複数回定義されているシンボルが見つかりました。 というエラーを吐き出してしまいます。どうすればちゃんとコンパイルできるのでしょうか?
ソースコードは以下のとおりです。
main.cpp

コード:

#include "DxLib.h"

#define SCREEN_WIDTH (320)		//画面の横幅
#define SCREEN_HEIGHT (240)		//画面の縦幅
#define STAGE_WIDTH  (400)
#define STAGE_HEIGHT (320)
#define CHIP_SIZE (16)			//チップのサイズ
#define MAP_WIDTH (STAGE_WIDTH/CHIP_SIZE)
#define MAP_HEIGHT (STAGE_HEIGHT/CHIP_SIZE)
HANDLE Stdout;

//テスト用のマップデータ。実際の開発では、Tiled(フリーのマップエディタ)を使う予定。
//このテストプログラムがある程度の段階に達したら、本格的な開発に移ります。
//TinyXML2は便利だ
char MapData[MAP_HEIGHT][MAP_WIDTH]
{
	1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 
	1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
	1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 
	1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
	1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,

	1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
	1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
	1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
	1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
	1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,

	1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
	1,0,0,0,0, 0,1,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
	1,0,0,0,0, 1,1,1,1,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
	1,0,0,0,1, 1,1,1,1,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
	1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,1,1,1,0, 0,0,0,0,1,

	1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
	1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
	1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
	1,0,0,0,0, 0,0,1,0,1, 1,1,1,1,1, 1,1,1,1,1, 0,0,0,0,1,
	1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1,
};

float PlayerX, PlayerY;
float SaveX, SaveY;
float MoveX, MoveY;
float VectX;
float DropPower, Grav;
float MaxVect;
char JumpFlag, Dir, AirFlag, NonVertJump, dir, DirT, DashB, SlideFlag, MaxJump;

int DashCnt, JumpTimer, SlideTimer, JumpCount;
int Input, EdgeInput, Pad;
int FreamStartTime;
int CameraX = 0;
int CameraY = 0;
float CharX, CharY, ViewCharX, ViewCharY;

int main();
int MapHitCheck(float X, float Y, float *MoveX, float *MoveY, int Size);
int CharMove(float *X, float *Y, float MoveX, float MoveY, float *Drop, float *G, 
	char *Jump, char *Air, char *Vert,int *JumpT,float *Vect, int Size,char *Slide,int *JCount);
int MapChipParam(float X, float Y);
int CameraCheck(float X, float Y);
//マップチップのデータ獲得
int MapChipParam(float X, float Y) {
	int x, y;

	x = (int)X / CHIP_SIZE;
	y = (int)Y / CHIP_SIZE;

	if (x >= MAP_WIDTH || y >= MAP_HEIGHT || x < 0 || y < 0) return 0;

	return MapData[y][x];
}

//衝突判定
int MapHitCheck(float X, float Y, float *MoveX, float *MoveY, int Size) {
	float afX, afY;
	afX = X + *MoveX;
	afY = Y + *MoveY;
	float blx, brx, bby, bty;
	blx = (float)((int)afX / Size)*Size;
	brx = (float)((int)afX / Size + 1)*Size;
	bty = (float)((int)afY / Size)*Size;
	bby = (float)((int)afY / Size + 1)*Size;
	if (MapChipParam(afX, afY) == 1) {
		if (*MoveY > 0.0F) {
			printf("\n下に当たりました。");
			//移動量を補正する
			*MoveY = bty - Y - 1.0F;
			//上の壁に当たったと判定する
			return 3;
		}
		if (*MoveY < 0.0F) {
			printf("\n上に当たりました。");
			//移動量を補正する
			*MoveY = bby - Y + 1.0F;
			//下の壁に当たったと判定する
			return 4;
		}
		//右の当たり判定
		if (*MoveX > 0.0F) {
			printf("\n右に当たりました。");
			//移動量を補正する
			*MoveX = blx - X - 1.0F;
			//右の壁に当たったと判定する
			return 1;
		}
		//左の当たり判定
		if (*MoveX < 0.0F) {
			printf("\n左に当たりました。");
			//移動量を補正する
			*MoveX = brx - X + 1.0F;
			//左の壁に当たったと判定する
			return 2;
		}
		//ここに来たら適当な値を返す
		return 4;
	}
	return 0;
}

//当たり判定チェック
int CharMove(float *X, float *Y, float MoveX, float MoveY, float *Drop,float *G,char *Jump,char *Air,char *Vert, int *JumpT,float *Vect,int Size, char *Slide, int *JCount){
	float Dummy = 0.0F;
	float hsize;
	//直前フレーム
	float PrevX = *X + MoveX;
	float PrevY = *Y + MoveY;
	//ベクトルのバックアップ
	float SaveMoveX = MoveX;
	float SaveMoveY = MoveY;

	hsize = Size * 0.5F; 
	//上下の当たり判定チェック、上に衝突したら落下させ、下に衝突したら着地させる。
	{
		//左下
		if (MapHitCheck(*X - hsize, *Y + hsize - 1.0F, &Dummy, &MoveY,(int)Size) == 3) *Drop = 0.0F,MoveY -= 1.0F,printf("\n上下::左下");
		//右下
		if (MapHitCheck(*X + hsize, *Y + hsize - 1.0F, &Dummy, &MoveY,(int)Size) == 3) *Drop = 0.0F,MoveY -= 1.0F,printf("\n上下::右下");
		//左上
		if (MapHitCheck(*X - hsize, *Y - hsize + 1.0F, &Dummy, &MoveY,(int)Size) == 4) *Drop *= -0.5F,MoveY = 0.0F,printf("\n上下::左上");
		//右上
		if (MapHitCheck(*X + hsize, *Y - hsize + 1.0F, &Dummy, &MoveY,(int)Size) == 4) *Drop *= -0.5F,MoveY = 0.0F,printf("\n上下::右上");
		//問題ないのなら移動させる
		PrevY = *Y + MoveY;
		*Y = PrevY;
	}
	//左右の当たり判定チェック
	{
		//左下
		if (MapHitCheck(*X - hsize + 1.0F, *Y + hsize, &MoveX, &Dummy, (int)Size))*Slide = FALSE, *Vect = 0.0F, MoveX += 1.0F, printf("\n左右::左下");
		//右上
		if (MapHitCheck(*X + hsize - 1.0F, *Y + hsize, &MoveX, &Dummy, (int)Size))*Slide = FALSE, *Vect = 0.0F, MoveX -= 1.0F, printf("\n左右::右下");
		//左上
		if (MapHitCheck(*X - hsize + 1.0F, *Y - hsize, &MoveX, &Dummy, (int)Size))*Slide = FALSE, *Vect = 0.0F, MoveX += 1.0F, printf("\n左右::左上");
		//右上
		if (MapHitCheck(*X + hsize - 1.0F, *Y - hsize, &MoveX, &Dummy, (int)Size))*Slide = FALSE, *Vect = 0.0F, MoveX -= 1.0F, printf("\n左右::右上");
		//問題ないのなら移動させる
		PrevX = *X + MoveX;
		*X = PrevX;
	}
	//着地判定
	{
		if (MapChipParam(*X - hsize, *Y + hsize + 1.0F) == 0 && MapChipParam(*X + hsize, *Y + hsize + 1.0F) == 0) {
			*Air = TRUE;
			*G = 0.5F;
		}
		else {
			*JumpT = 0;
			*Drop = 0.0F;
			*G = 0.0F;
			*Air = FALSE;
			*JCount = 0;
			*Vert = FALSE;
			*Jump = FALSE;
		}
	}
	return 0;
}

//カメラの位置計算
int CameraCheck(float X, float Y) {
	//カメラのチェック
	CharX = X;
	CharY = Y;
	//カメラの位置を計算する
	CameraX = (int)CharX - SCREEN_WIDTH / 2;
	CameraY = (int)CharY - SCREEN_HEIGHT / 2;
	//カメラの補正
	if (CameraX < 0)CameraX = 0;
	if (CameraX >(STAGE_WIDTH - SCREEN_WIDTH))CameraX = (STAGE_WIDTH - SCREEN_WIDTH);
	if (CameraY < 0)CameraY = 0;
	if (CameraY >(STAGE_HEIGHT - SCREEN_HEIGHT))CameraY = (STAGE_HEIGHT - SCREEN_HEIGHT);
	ViewCharX = CharX - CameraX;
	ViewCharY = CharY - CameraY;
	return 0;
}

int init(void) {
	ChangeWindowMode(TRUE),SetGraphMode(320,240,32),printf("初期化しています…"); 
	if (DxLib_Init() == -1) { return -1; }
	PlayerX = 240.0F, PlayerY = 200.0F, MoveX = 0.0F, MoveY = 0.0F;
	JumpFlag = FALSE, DropPower = 0.0F, Grav = 0.5F, Dir = TRUE;
	Input = 0, EdgeInput = 0, FreamStartTime = GetNowCount();
	DashCnt = 0,MaxVect = 0.0F, NonVertJump = FALSE, dir = 0,DirT = FALSE;
	MaxJump = FALSE,DashB = FALSE;
	return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	AllocConsole(); FILE* out = 0; freopen_s(&out, "CON", "w", stdout); Stdout = GetStdHandle(STD_OUTPUT_HANDLE);
	init();
	while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) {
		main();
	}
	DxLib_End(); fclose(out); FreeConsole();
	return 0;
}
move.cpp

コード:

#include "DxLib.h"

#define SCREEN_WIDTH (320)		//画面の横幅
#define SCREEN_HEIGHT (240)		//画面の縦幅
#define STAGE_WIDTH  (400)
#define STAGE_HEIGHT (320)
#define CHIP_SIZE (16)			//チップのサイズ
#define MAP_WIDTH (STAGE_WIDTH/CHIP_SIZE)
#define MAP_HEIGHT (STAGE_HEIGHT/CHIP_SIZE)
extern char MapData[MAP_HEIGHT][MAP_WIDTH];

extern float PlayerX, PlayerY;
extern float SaveX, SaveY;
extern float MoveX, MoveY;
extern float VectX;
extern float DropPower, Grav;
extern float MaxVect;
extern char JumpFlag, Dir, AirFlag, NonVertJump, dir, DirT, DashB, SlideFlag, MaxJump;

extern int DashCnt, JumpTimer, SlideTimer, JumpCount;
extern int Input, EdgeInput, Pad;
extern int FreamStartTime;
extern int CameraX = 0;
extern int CameraY = 0;
extern float CharX, CharY, ViewCharX, ViewCharY;

int main();
int MapHitCheck(float X, float Y, float *MoveX, float *MoveY, int Size);
int CharMove(float *X, float *Y, float MoveX, float MoveY, float *Drop, float *G,
	char *Jump, char *Air, char *Vert, int *JumpT, float *Vect, int Size, char *Slide, int *JCount);
int MapChipParam(float X, float Y);
int CameraCheck(float X, float Y);

int main(void) {
	FreamStartTime = GetNowCount();
	while (GetNowCount() - FreamStartTime < 1000 / 60) {}
	system("cls");
	printf("メインループ開始\n");
	printf("\nPlayerX=%d,PlayerY=%d,Grav=%8.2f,DropPower=%8.2f", (int)PlayerX, (int)PlayerY, Grav, DropPower);
	printf("\nMoveX=%8.1f,MoveY=%8.1f,Jump=%d", MoveX, MoveY, JumpFlag);
	printf("\nCharX=%8.1f,CharY=%8.1f,CameraX=%d,CameraY=%d,ViewX=%8.1f,ViewY=%8.1f", CharX, CharY, CameraX, CameraY, ViewCharX, ViewCharY);
	printf("\n現在の向き=%d\t右は1、左は0,NonVert = %d,VectX = %8.1f,JumpTimer = %d,DashCnt = %d", Dir, NonVertJump, VectX, JumpTimer, DashCnt);
	printf("\nDashT=%d,DashB=%d", DirT, DashB);
	//カメラの処理を行う
	CameraCheck(PlayerX, PlayerY);
	//入力状態を更新
	{
		int i;
		i = GetJoypadInputState(DX_INPUT_KEY_PAD1);
		EdgeInput = i & ~Input;
		Input = i;
	}
	//移動処理
	{
		int DashT;
		int ContTimer = 8;
		//ベクトルを初期化し、加減速処理を行う。
		if (NonVertJump == FALSE) {
			MoveX = 0.0F;
			VectX = 0.0F;
			MaxVect = 0.0F;
		}
		else {
			MoveX = VectX;
		}
		MoveY = 0.0F;
		char RunButton;
		//0なら移動していない、1なら右へ移動中、2なら左へ移動中
		char NonVertJumpFlag = 0;
		//左右に押されているか確認する。
		if ((Input&PAD_INPUT_LEFT) || (Input&PAD_INPUT_RIGHT)) {
			DirT = TRUE;
		}
		else {
			DirT = FALSE;
		}
		//ダッシュのトリガーをチェックする
		if (DashCnt == 1 && DirT == TRUE) {
			DashT = FALSE;
		}
		else {
			DashT = TRUE;
		}
		{
			int DashTime = 8;
			if ((Input&PAD_INPUT_2)) {
				RunButton = TRUE;
			}
			else {
				RunButton = FALSE;
			}
			//右へ移動
			if (NonVertJump == FALSE && (Input&PAD_INPUT_RIGHT)) {
				NonVertJumpFlag = 1;
				Dir = TRUE;
				//レバー二段ダッシュの判定を行う
				if ((Input&PAD_INPUT_RIGHT)) {
					if ((DashT == TRUE && DashCnt < DashTime) && dir == 1) {
						DashB = TRUE;
					}
					if (DashB == TRUE) {
						RunButton = TRUE;
					}
					if (dir == 2) {
						DashB = FALSE;
						RunButton = FALSE;
					}
					dir = 1;
				}
				if (RunButton == TRUE && JumpFlag == FALSE) {
					MoveX = 8.0F;
				}
				else if (RunButton == FALSE && JumpFlag == FALSE) {
					MoveX = 5.0F;
				}
				else {
					MoveX = 3.0F;
				}
				DashCnt = 0;
			}
			//左に移動
			else if (NonVertJump == FALSE && (Input&PAD_INPUT_LEFT)) {
				NonVertJumpFlag = 2;
				Dir = FALSE;
				if ((Input&PAD_INPUT_LEFT)) {
					if ((DashT == TRUE && DashCnt < DashTime) && dir == 2) {
						DashB = TRUE;
					}
					if (DashB == TRUE) {
						RunButton = TRUE;
					}
					if (dir == 1) {
						RunButton = FALSE;
					}
					dir = 2;
				}
				if (RunButton == TRUE && JumpFlag == FALSE) {
					MoveX = -8.0F;
				}
				else if (RunButton == FALSE && JumpFlag == FALSE) {
					MoveX = -5.0F;
				}
				else {
					MoveX = -3.0F;
				}
				DashCnt = 0;
			}
			else {
				DashB = FALSE;
				RunButton = FALSE;
			}
			DashCnt++;
		}
		//ジャンプボタンが押されているフレームを格納する。
		char JumpButton;
		if ((Input&PAD_INPUT_1)) {
			JumpTimer++;
		}
		else {
			JumpTimer = 0;
			if (JumpFlag == TRUE) {
				JumpButton = TRUE;
			}
		}
		//ジャンプ回数管理
		if (JumpCount > 2) {
			MaxJump = TRUE;
		}
		else {
			MaxJump = FALSE;
		}
		//長押しで重力が弱く、離せば、重力が強く。
		//なお、カービィっぽくスライディングを出すために、下を押している時は出ない。
		if (!(Input&PAD_INPUT_DOWN) && JumpTimer > 0) {
			if (JumpTimer == 1 && NonVertJumpFlag == 0 && JumpFlag == FALSE) {
				JumpFlag = TRUE;
				JumpCount += 1;
				DropPower = -7.0F;
			}
			if (JumpTimer == 1 && NonVertJumpFlag == 1 && JumpFlag == FALSE) {
				JumpFlag = TRUE;
				JumpCount += 1;
				DropPower = -7.0F;
				if (RunButton == TRUE) {
					VectX = 8.0F;
					MaxVect = 8.0F;
				}
				else {
					VectX = 5.0F;
					MaxVect = 5.0F;
				}
				//斜めに飛んでいることを確認
				NonVertJump = TRUE;
			}
			if (JumpTimer == 1 && NonVertJumpFlag == 2 && JumpFlag == FALSE) {
				JumpFlag = TRUE;
				JumpCount += 1;
				DropPower = -7.0F;
				if (RunButton == TRUE) {
					VectX = -8.0F;
					MaxVect = -8.0F;
				}
				else {
					VectX = -5.0F;
					MaxVect = -5.0F;
				}
				NonVertJump = TRUE;
			}
			//空中ジャンプ(二段まで)
			if (JumpTimer == 1 && JumpFlag == TRUE && MaxJump == FALSE) {
				JumpCount += 1;
				DropPower = -7.0F;
			}
			Grav = 0.25F;
		}
		else {
			if (JumpFlag == FALSE) {
				JumpButton = FALSE;
			}
			if (JumpFlag == TRUE) {
				Grav = 0.5F;
			}
		}
	}
	//ジャンプボタンでスライディング(カービィ同様)
	if (JumpFlag == FALSE) {
		if ((Input&PAD_INPUT_DOWN) && (Input&PAD_INPUT_1)) {
			SlideFlag = TRUE;
			SlideTimer = 0;
		}
	}
	if (SlideFlag == TRUE) {
		if (Dir == TRUE) {
			MoveX = 8.0F;
		}
		else {
			MoveX = -8.0F;
		}
		if (SlideTimer > 7) {
			SlideFlag = FALSE;
		}
		SlideTimer++;
	}
	//空中での移動を解禁する
	if (NonVertJump == TRUE && VectX == 0 || DropPower > 0) {
		VectX = 0.0F;
		NonVertJump = FALSE;
	}
	//右へジャンプしているときに左で減速
	if (NonVertJump == TRUE && VectX > 0 && (Input&PAD_INPUT_LEFT)) {
		//マリオ3以降よろしく、方向転換する。
		Dir = FALSE;
		VectX -= 1.0F;
		DropPower += 0.1F;
		MoveX = VectX;
	}
	//マリオ3のように加速
	if (NonVertJump == TRUE && VectX > 0 && MaxVect > VectX && (Input&PAD_INPUT_RIGHT)) {
		Dir = TRUE;
		VectX += 1.0F;
		DropPower += 0.1F;
		MoveX = VectX;
	}
	//左へジャンプしているときに右で減速
	if (NonVertJump == TRUE && VectX < 0 && (Input&PAD_INPUT_RIGHT)) {
		//マリオ3以降よろしく、方向転換する。
		Dir = TRUE;
		VectX += 1.0F;
		DropPower += 0.1F;
		MoveX = VectX;
	}
	if (NonVertJump == TRUE && VectX < 0 && MaxVect < VectX && (Input&PAD_INPUT_LEFT)) {
		Dir = FALSE;
		VectX -= 1.0F;
		DropPower += 0.1F;
		MoveX = VectX;
	}
	//落下処理
	DropPower += Grav;
	MoveY = DropPower;
	//移動量に基づいて移動する。
	CharMove(&PlayerX, &PlayerY, MoveX, MoveY, &DropPower, &Grav, &JumpFlag, &AirFlag, &NonVertJump, &JumpTimer, &VectX, CHIP_SIZE, &SlideFlag, &JumpCount);
	//マップの描画
	{
		int i, j;
		for (i = 0; i < MAP_HEIGHT; i++) {
			for (j = 0; j < MAP_WIDTH; j++) {
				if (MapData[i][j] == 1) {
					DrawBox(j*CHIP_SIZE - CameraX, i*CHIP_SIZE - CameraY, j*CHIP_SIZE + CHIP_SIZE - CameraX, i*CHIP_SIZE + CHIP_SIZE - CameraY, GetColor(255, 255, 255), TRUE);
				}
			}
		}
	}
	//キャラの描画
	DrawBox((int)(ViewCharX)-(CHIP_SIZE / 2), (int)(ViewCharY)-(CHIP_SIZE / 2), (int)(ViewCharX + CHIP_SIZE) - (CHIP_SIZE / 2), (int)(ViewCharY + CHIP_SIZE) - (CHIP_SIZE / 2), GetColor(255, 0, 0), TRUE);
}

YuO
記事: 947
登録日時: 14年前
住所: 東京都世田谷区

Re: ソースコードを分離したらエラーを吐き出した。

#2

投稿記事 by YuO » 8年前

keito940 さんが書きました:move.cpp

コード:

extern int CameraX = 0;
extern int CameraY = 0;
ここが問題です。
externと初期化子 (や関数定義) が両方ある場合,宣言では無く定義になります。
分割する場合に,externを付ける場合は初期化子 (「=」以降) を付けてはいけません。

ref) ISO/IEC 14882:2011 / 3.1 Declarations and definitions / ¶2

keito940
記事: 105
登録日時: 8年前

Re: ソースコードを分離したらエラーを吐き出した。

#3

投稿記事 by keito940 » 8年前

main.cppの

コード:

int CameraX = 0;
int CameraY = 0;
を、

コード:

int CameraX, CameraY;
に変えて、
init()の部分に、

コード:

CameraX = 0, CameraY = 0;
を付け加えてから、問題の部分を

コード:

extern int CameraX, CameraY;
に変えたら、治りました。
オフトピック
コードを分離する時は、宣言と初期化処理は分離しないといけないのか…。
また一つゲーム制作への道が見えてきました…。

keito940
記事: 105
登録日時: 8年前

Re: ソースコードを分離したらエラーを吐き出した。

#4

投稿記事 by keito940 » 8年前

main.cppの

コード:

int CameraX = 0;
int CameraY = 0;
を、

コード:

int CameraX, CameraY;
に変えて、
init()の部分に、

コード:

CameraX = 0, CameraY = 0;
を付け加えてから、問題の部分を

コード:

extern int CameraX, CameraY;
に変えたら、治りました。
オフトピック
コードを分離する時は、宣言と初期化処理は分離しないといけないのか…。
また一つゲーム制作への道が見えてきました…。

返信

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