返信が遅れてしまい申し訳ございません。時間が取れなくて返信が遅くなってしまいました。
>どれか1箇所だけで実体を定義してください。
>他の箇所では extern を付けてください。
今作成しているプログラムを実体定義をしたまま貼り付けます。
コード:
//CharaData.h
//インクルードガード
#ifndef CHARADATA_H
#define CHARADATA_H
//TRUE FALSE判定
#define TRUE 1
#define FALSE 0
//自機定数
#define PLAYER_SPEED 1 //自機のスピード
struct Chara{
int flag; //自機の存在フラグ
int hp; //自機のHP
int power; //自機の攻撃力
int RightLeft_flag; //左右キー入力
int UpDown_flag; //上下キー入力
double x; //自機の位置X
double y; //自機の位置Y
double vx; //自機の移動量X
double vy; //自機の移動量Y
};
//自機データ
extern Chara Chara; //■■■■
extern int R_jikiimage; //主人公Aの画像
extern int L_jikiimage; //主人公Bの画像
extern void Load_Graph();
extern void CharaMove();
extern void teigi();
#endif
//jittai.cpp
#include "CharaData.h"
Chara Chara;
void teigi(){
Chara.flag=0; //自機の存在フラグ
Chara.hp=0; //自機のHP
Chara.power=0; //自機の攻撃力
Chara.RightLeft_flag=0; //左右キー入力
Chara.UpDown_flag=0; //上下キー入力
Chara.x=30; //自機の位置X
Chara.y=30; //自機の位置Y
Chara.vx=0; //自機の移動量X
Chara.vy=0; //自機の移動量Y
}
//ImageDivision.cpp
#include "DxLib.h"
#include "CharaData.h"
//画像の読み込み
void Load_Graph(){
int R_jikiimage = LoadGraph( "media/jiki_a.png" ); //主人公Aの画像読み込み
int L_jikiimage = LoadGraph( "media/jiki_b.png" ); //主人公Bの画像読み込み
}
//CharaMove.cpp
#include<stdio.h>
#include<stdlib.h>
#include "math.h"
#include "DxLib.h"
#include "CharaData.h"
//自機データ
int R_jikiimage;
int L_jikiimage;
//キャラ移動
void CharaMove(){
//キャラクター構造体定義
//初期化
Chara.RightLeft_flag = FALSE;
Chara.UpDown_flag = FALSE;
Chara Chara ; //■■■■■
int naname = 0; //斜め移動変数
if( CheckHitKey(KEY_INPUT_RIGHT) == TRUE ){//右キー
Chara.RightLeft_flag = TRUE;
Chara.vx += PLAYER_SPEED; //右移動
}
if( CheckHitKey(KEY_INPUT_LEFT) == TRUE ){//左キー
Chara.RightLeft_flag = TRUE;
Chara.vx -= PLAYER_SPEED; //左移動
}
if( CheckHitKey(KEY_INPUT_UP) == TRUE ){//上キー
Chara.UpDown_flag = TRUE;
Chara.vy += PLAYER_SPEED; //上移動
}
if( CheckHitKey(KEY_INPUT_DOWN) == TRUE ){//下キー
Chara.UpDown_flag = TRUE;
Chara.vy -= PLAYER_SPEED; //下移動
}
//斜め処理(斜めでも速度を一定に)
if( Chara.RightLeft_flag == TRUE && Chara.UpDown_flag == TRUE ){
naname =sqrt(2.0); //1/√2
(Chara.vx / naname);
(Chara.vy / naname);
}
Chara.x += Chara.vx;
Chara.y += Chara.vy;
DrawGraph( Chara.x, Chara.y, R_jikiimage, TRUE );
DrawFormatString(0,0,GetColor(255,255,255),"%d",Chara.x);
}
//Main.cpp
#include<stdio.h>
#include<stdlib.h>
#include "DxLib.h"
#include "CharaData.h"
int Key[256];
int Color = GetColor( 255, 255, 255 ); //基本(黒)
int GetHitKeyStateAll_2(int GetHitKeyStateAll_InputKey[]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key[i]==1) GetHitKeyStateAll_InputKey[i]++;
else GetHitKeyStateAll_InputKey[i]=0;
}
return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode(TRUE);//ウィンドウモード
// 画面モードの設定
teigi();//■■■■
Load_Graph(); //画像のロード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
//↑メッセージ処理 ↑画面をクリア ↑入力状態を保存 ↑ESCが押されていない
CharaMove(); //自機移動
ScreenFlip();
}
DxLib_End();
return 0;
}
長くなるのでソースは書かなかったのですが、やっぱり書くことにしました。
他の箇所ではexternする。とのことですが、
CharaMove.cpp にある Chara Chara;を extern Chara Chara; にするということですか?
>グローバル変数を使うことは、そのプログラムにおいて必須の要件ですか?
たしかにグローバル変数はなるべく使いたくないのですが、キャラクターの座標や攻撃力などを管理しているので、仕方なく使っています。
グローバル変数を使わずに出来る方法があるなら、ぜひ教えてください!