ページ 11

関数をファイルとして分ける

Posted: 2015年9月21日(月) 09:32
by kaku
dxライブラリとvisualstudio2015でゲームを作っているものです

コード:

#include "DxLib.h"

#include "keycondition.h"
#include "function.h"

enum Sequence {
SEQUENCE_TITLE,
SEQUENCE_GAME
};

const char gStageData[] = "\
  #####\n\
 .    #\n\
# o o #\n\
#o  # #\n\
# p # #\n\
#.###. \n\
### ###";

const int gStageWidth = 7;
const int gStageHeight = 7;

int Handle[gStageWidth*gStageHeight];

int gHandle[8];
int Key[256];

Sequence gSequence = SEQUENCE_TITLE;


void game(Object* state);
void title();

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {

	ChangeWindowMode(true);
	DxLib_Init();
	SetDrawScreen(DX_SCREEN_BACK);


	Object* state = new Object[gStageWidth*gStageHeight];

	initialize(state, gStageWidth, gStageHeight, gStageData);

	gHandle[0] = LoadGraph("material/objspace.png");
	gHandle[1] = LoadGraph("material/objwall.png");
	gHandle[2] = LoadGraph("material/objgoal.png");
	gHandle[3] = LoadGraph("material/objblock.png");
	gHandle[4] = LoadGraph("material/objblockongoal.png");
	gHandle[5] = LoadGraph("material/objman.png");
	gHandle[6] = LoadGraph("material/objmanongoal.png");
	gHandle[7] = LoadGraph("material/title.png");

	while (true) {

		switch (gSequence) {

		case SEQUENCE_TITLE:title(); break;
		case SEQUENCE_GAME:game(state); break;
		}

	}

	return 0;

}

void title() {

	DrawGraph(0, 0, gHandle[7], true);
	ScreenFlip();

	while (gpUpdateKey(Key) == 0) {

		ProcessMessage();

		if (Key[KEY_INPUT_S] >= 1) {
			gSequence = SEQUENCE_GAME;
			return;
		}

	}

}

void game(Object* state) {

	while (true) {

		ProcessMessage();

		draw(state, gStageWidth, gStageHeight, Handle, gHandle);

		if (checkClear(state, gStageWidth, gStageHeight))
			break;

		update(state, gStageWidth, gStageHeight, Key);

		Sleep(150);

	}

	delete[] state;
	state = '\0';

	DxLib_End();
}
上記のコードの中でtitle関数とgame関数を別のC++ファイルとして独立させようとしました。
一部の関数はdxlib.hをインクルードすることで使えるのですがgSequenceやgHandle[7]はmain.cppで定義されているので
使えません。このようなときはどうすればいいのでしょうか?

Re: 関数をファイルとして分ける

Posted: 2015年9月21日(月) 09:45
by box
kaku さんが書きました: 上記のコードの中でtitle関数とgame関数を別のC++ファイルとして独立させようとしました。
一部の関数はdxlib.hをインクルードすることで使えるのですがgSequenceやgHandle[7]はmain.cppで定義されているので
使えません。このようなときはどうすればいいのでしょうか?
title関数やgame関数のための*.cppファイルに

コード:

extern Sequence gSequence;
extern int gHandle[8];
と書けばよいと思います。externの意味は
実体をどっか別のファイル(今回はmain.cpp)で定義した変数(関数の場合もあるかも)をここで使うのでよろしく!
というくらいのものです。

Re: 関数をファイルとして分ける

Posted: 2015年9月21日(月) 12:34
by kaku
返信ありがとうございます。
externについて学べてよかったです。
externを用いたコードについてもう一つ質問なんですけど、

▼main.cpp(一部)

コード:

#include "DxLib.h"

#include "keycondition.h"
#include "function.h"

enum Sequence {
SEQUENCE_TITLE,
SEQUENCE_GAME
};

const char gStageData[] = "\
  #####\n\
 .    #\n\
# o o #\n\
#o  # #\n\
# p # #\n\
#.###. \n\
### ###";

const int gStageWidth = 7;
const int gStageHeight = 7;
▼game.cpp(一部)

コード:

extern int gStageWidth;
extern int gStageHeight;
extern int Handle[gStageWidth*gStageHeight];
extern int gHandle[8];
extern int Key[256];
このようなコードを書いたところgame.cppの3行目(gStageWidth*gStageHeight)のところで式には定数値が必要ですとでて
うまく実行できませんでした。どうすればいいでしょうか?