ページ 11

ゲームのシーン変更について

Posted: 2015年9月29日(火) 16:42
by となな

コード:

DXライブラリでゲームを作っているのですが、うまくシーンの変更ができません。

(main.cpp)
#include "DxLib.h"
#include "main.h"
#include "Keyboard.h"
#include "GameM.h"


int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int){
	SetMainWindowText("マ〇オ風アクション(仮)"), ChangeWindowMode(TRUE), DxLib_Init(); //ウインドウモードに設定、DXライブラリ初期化処理
	SetDrawScreen(DX_SCREEN_BACK); //描画先を裏画面に設定

	GameM_riset(); //初期化
	
	//whileの中(画面に反映、メッセージ処理,画面クリア)
	while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0)
	{
		if (Keyboard_Get(KEY_INPUT_ESCAPE) > 0) //エスケープキーが押されたらすぐに終了
		{
			DxLib_End();
		}

		GameM_Update();
		
		Keyboard_Update(); //キー入力
	}
	DxLib_End(); // DXライブラリ終了
	return 0;
}

コード:

(main.h)
#ifndef DEF_MAIN_H
#define DEF_MAIN_H

typedef struct sin
{
	int flag; //シーン変更フラグ
}sin;

typedef struct status //ステータス構造体
{
	int x; //x座標
	int y; //y座標
	int attack; //攻撃力
}status;

#endif

コード:

(GameM.cpp)
#include "GameM.h"

void GM_riset()
{
	sin fl;
}


//計算
void GM_Update()
{
	fl.flag = 0; //シーン変更変数

	switch (fl.flag)
	{
	case 0: //メニュー描画
		fl = Menu_Update(fl);
		Menu_Draw(); 
		break;
	case 1: //キャラクターセレクト
		fl = chara_Update(fl);
		chara_Draw();
		break;
	}
}

コード:

(Game.h)

#ifndef DEF_GameM_H
#define DEF_GameM_H
#include "DxLib.h"
#include "Keyboard.h"
#include "main.h"

//初期化
void GameM_riset();

//計算
void GameM_Update();

#endif

GameM.cppのGameM_risetでsin flを宣言しているのですが、Game_Updateでは定義されていない変数とエラーが表示されてしまいます。
mainで初期化もしているのですが、なにが間違っているのでしょうか・・・。
アドバイスをお願いしたいです。よろしくお願いします。

Re: ゲームのシーン変更について

Posted: 2015年9月29日(火) 16:53
by Rittai_3D
GM_riset()内で宣言してある fl はGM_riset()内でのみ使用できます。
それ以外の場所では使用できません。

変数の寿命についての理解を深めましょう。
http://homepage3.nifty.com/mmgames/c_guide/12-01.htmlこの辺りが参考になるかと思います。

Re: ゲームのシーン変更について

Posted: 2015年9月29日(火) 19:26
by となな
3Dさん、返信ありがとうございます。リンク先の関数の寿命を読ませていただきました。
関数内でしか使えないことはわかったのですが、ではどこでflを宣言すればいいのでしょか・・・?

Re: ゲームのシーン変更について

Posted: 2015年9月29日(火) 19:50
by Rittai_3D
GameM.cpp内の必要な部分より前で定義すればよいです。

コード:

// GameM.cpp
static sin fl;

void Init()
{
    /* 初期化 */
}

void Proc()
{
    /* 何か */
}
とすれば Init() でも Proc() でもflが使用できます。

コード:

// GameM.cpp

void Init()
{
    /* 初期化 */
}

static sin fl;

void Proc()
{
    /* 何か */
}
とすれば Init() 内ではflは使用できませんが Proc() では使用できます。

Re: ゲームのシーン変更について

Posted: 2015年9月29日(火) 20:03
by Dixq (管理人)
こちらに作り方を紹介しているのでご覧ください。

http://dixq.net/g/


「ゲームプログラミング設計」と「メニュー画面の作り方」です。

ちなみにシーンはsinではなくSceneです。
ステータス構造体が
int x; //x座標
int y; //y座標
int attack; //攻撃力
を持っている理由がよく分かりません。
また、構造体にflagを持たせると破たんの元なのでお勧めしません。
bool is○○;
と名付けた方が分かりやすいでしょう。

Re: ゲームのシーン変更について

Posted: 2015年9月29日(火) 20:32
by となな
管理人さん、返信ありがとうございます。
sinは自分的にわかりやすいという理由です、すいません。
ステータス構造についてですが、他にキャラクター情報を記述しているファイルがあり、そこで使っています。

http://dixq.net/g/ はほぼ毎日閲覧させてもらっています。
「ゲームプログラミング設計」と「メニュー画面の作り方」も何回も読んでいるのですが、理解できないことが多く、またなにが理解できていなのかもわかっていない状況にあります。

Re: ゲームのシーン変更について

Posted: 2015年9月29日(火) 23:33
by Dixq (管理人)
私が書いた解説を紹介してお読み頂いても
「なにが理解できていないかもわからない」と言われてしまってはどうアドバイスしていいのかわかりません。
とりあえずここが分からないから先に進めないんだという点があると思います。
その最初から紐解いていきましょう。

Re: ゲームのシーン変更について

Posted: 2015年9月29日(火) 23:59
by となな
返信ありがとうございます。
もう少し調べて目的がはっきりしたらまた質問させていただくかもしれません。ありがとうございました。