ページ 11

DXライブラリで、複数のファイルに分けてコンパイルする場合のファイル間の変数の情報のやり取りについてがよく分かりません。

Posted: 2014年10月10日(金) 14:28
by メロンくん
取り敢えずこんな感じで迷いの森 分岐B3のマップと分岐B4のマップを移動する事は出来ました。

main.cpp

コード:

#include "DxLib.h"
#include "迷いの森 分岐B3.h"
#include "迷いの森 分岐B4.h"

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
						 LPSTR lpCmdLine, int nCmdShow )
{
	SetGraphMode( 800 , 600 , 32 ) ;
	if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理
		int function_status=0;
		while( 1 ){
				switch(function_status){
						case 0:
                                function_status = Mori_B_3(63,28,1);
                                break;
                        case 1:
				function_status = Mori_B_3(32,31,0);

                                break;

                        case 2:
                                function_status = Mori_B_4(19,1,2);

								break;
                        default:
                                DxLib_End() ;
                                return 0;
                                break;
                }


		
        }

        DxLib_End();
        return 0;
}

迷いの森 分岐B3.cpp

コード:

#include "DxLib.h"
static char Key[256];
static int image[8],idouryou=4,hokoujoutai=1;
static int ch_img;
static int ch_muki;

#define MAP_SIZE	40			// マップチップ一つのドットサイズ
#define MAP_WIDTH	65			// マップの幅
#define MAP_HEIGHT	33			// マップの縦長さ

// マップのデータ
int 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,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,1,1,1,1,1,1,1,1,1,1,1,1,0 },
{ 1,0,0,0,0,1,1,0,0,0,1,0,0,0,1,1,0,1,1,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 },
{ 1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,1,0,1,0,0,1,0,0,0,1,1,1,1,1,0,1,1,1,0,1,0,0,0,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,0,1,0 },
{ 1,0,1,1,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,1,0,0,1,0,0,0,1,1,1,0,0,1,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0 },
{ 1,0,1,1,1,0,1,1,1,0,1,0,0,1,1,1,1,1,1,1,0,1,1,0,1,0,0,0,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,0,1,0,1,0 },
{ 1,0,1,1,0,0,1,1,1,0,0,0,1,0,1,1,1,1,1,1,0,0,1,0,0,1,1,1,0,0,0,1,1,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,1,1,0,0,1,1,0,1,1,1,0,1,0,1,0,1,0 },
{ 1,0,1,0,0,1,1,1,1,0,1,0,0,0,1,1,0,0,0,1,1,0,1,1,1,1,1,0,0,1,1,1,1,0,1,0,0,1,0,0,0,1,0,0,1,1,1,0,0,0,0,1,1,1,1,1,0,1,0,1,0,1,0,1,0 },
{ 1,0,1,0,1,1,1,1,0,0,1,1,1,0,1,1,0,1,0,1,0,0,1,1,0,0,0,0,1,1,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,1,1,0,1,1,0,0,1,1,1,0,0,0,1,0,1,0,1,0 },
{ 1,0,1,0,0,0,1,1,0,1,1,1,1,1,1,0,0,1,0,0,0,1,1,1,0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0 },
{ 1,0,1,0,1,0,1,1,0,0,0,1,1,1,0,0,1,0,0,1,0,0,1,1,0,1,1,0,0,0,1,0,1,1,1,0,1,1,0,0,1,1,1,0,1,1,0,1,0,0,0,1,1,1,0,1,0,0,1,1,1,1,0,1,0 },
{ 1,0,1,0,1,0,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,1,0,0,1,0,1,0,0,0,0,0,1,1,1,0,0,1,0,0,0,1,0,1,0,1,1,1,1,1,0,0,1,0,0,0,0,1,0,1,0 },
{ 1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,0,1,1,0,1,1,0,0,1,1,1,0,0,0,0,1,1,0,0,0,1,0,1,0,1,0,0,0,0,1,1,1,0,0,1,1,1,0,1,0,1,0 },
{ 1,0,1,0,1,0,1,0,0,1,1,1,1,1,0,0,0,0,0,1,0,0,1,0,0,1,0,0,1,1,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,1,0,0,1,1,0,1,0,1,0 },
{ 1,0,1,0,1,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,1,0,0,1,0,0,1,0,1,1,1,0,0,0,1,1,0,0,1,0,0,0,0,1,1,1,1,0,0,1,1,0,1,0,0,0,1,0,1,1,0,1,0,1,0 },
{ 1,0,1,0,1,1,0,1,1,0,0,0,1,1,1,1,0,0,1,0,1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,0,1,1,0,0,0,1,0,0,1,0,0,0,1,1,1,0,1,1,0,1,0,1,0 },
{ 1,0,1,0,1,1,0,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,0,1,1,1,1,0,0,0,1,1,1,1,1,1,1,0,1,0,1,0,0,0,0,1,0,0,1,0,0,1,1,1,1,0,1,0,1,1,1,1,0,1,0 },
{ 1,0,1,1,1,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,1,0,0,1,1,1,0,0,0,0,1,1,1,0,1,0 },
{ 1,0,1,1,1,0,1,0,0,0,1,1,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,1,1,1,1,1,0,0,0,1,1,1,0,0,1,1,1,1,0,0,0,1,0,0,1,0,0,0,1,1,1,1,0,0,0,1,0,1,0 },
{ 1,0,1,0,0,0,1,1,1,0,0,1,1,1,1,1,0,0,0,0,0,0,1,1,0,1,1,1,1,0,0,0,1,1,1,1,1,1,1,0,1,0,0,0,0,1,0,0,1,0,1,1,1,1,1,1,1,0,0,1,0,1,0,1,0 },
{ 1,0,1,0,1,0,1,1,1,1,0,0,0,1,1,1,0,1,1,1,1,0,0,0,0,1,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,0,0,0,0,1,1,0,0,0,1,1,0,1,0,1,0 },
{ 1,0,1,0,1,0,0,0,0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,1,0,1,0,1,0 },
{ 1,0,1,0,1,1,1,1,1,0,0,1,1,0,0,0,0,1,0,0,1,1,1,0,1,1,0,1,1,1,1,1,1,1,0,0,0,1,1,1,1,0,0,1,0,0,0,1,0,0,1,1,0,1,1,1,1,0,1,0,0,1,0,1,0 },
{ 1,0,1,0,1,1,0,0,0,1,0,0,0,1,1,1,1,1,1,0,0,0,0,0,1,1,0,0,0,0,1,1,1,1,1,1,0,1,1,1,1,0,1,0,0,1,0,0,1,0,1,1,0,0,0,0,1,0,0,0,1,1,0,1,0 },
{ 1,0,1,0,1,1,0,1,0,0,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,0,0,1,1,1,1,0,1,1,1,1,1,0,1,0,0,0,1,1,1,0,1,1,1,1,1,1,0,1,0 },
{ 1,0,1,0,1,1,0,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,0,1,1,1,0,0,1,1,1,1,0,0,1,0,1,1,1,0,1,0,0,1,1,0,1,1,1,0,0,0,1,1,0,0,0,1,0 },
{ 1,0,1,0,0,0,1,0,0,1,0,0,1,1,1,1,1,1,1,1,0,0,0,0,1,0,1,1,0,0,1,1,1,0,1,1,1,1,0,0,0,0,0,1,1,0,0,1,0,1,0,0,0,1,1,1,1,0,1,1,0,1,1,1,0 },
{ 1,0,1,0,1,0,0,1,0,1,1,0,0,0,0,0,0,1,1,1,0,1,1,1,1,0,1,1,1,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,1,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,1,1,1,0 },
{ 1,0,1,0,1,1,0,0,0,1,1,1,1,1,1,1,0,0,0,1,0,1,1,1,1,0,0,0,0,1,1,0,0,0,1,1,1,1,0,0,1,1,1,0,0,1,0,0,0,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,0 },
{ 1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,0,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0 },
{ 1,0,1,1,1,1,0,0,0,1,0,0,0,1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,0,1,1,0,1,0,1,1,0,1,1,0,0,0,1,0,0,0,1,1,1,1,1,1,1,1,0,1,0 },
{ 1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,1,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,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,1,1,1,1,1,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
};

static int map;

// プレイヤーの位置
static int PlayerX , PlayerY ;

// 移動しているかどうかのフラグ( 0:停止中  1:移動中 )
static int Move ;

// 各方向に移動する量
static int MoveX, MoveY ;

// 移動し始めてから何フレーム経過したかを保持する変数
static int MoveCounter ;

static int ScrollX, ScrollY ;




int Mori_B_3(int shoki_X,int shoki_Y,int MUKI)
{
	// 描画先画面を裏画面にする
	SetDrawScreen( DX_SCREEN_BACK ) ;
	LoadDivGraph( "画像/キャラ.png" , 8 , 2 , 4 , 40 , 41 , image ) ;
	map = LoadGraph( "map/迷いの森 分岐B-3.png" );

	// プレイヤーの初期位置をセット 
	PlayerX = shoki_X ;
	PlayerY = shoki_Y ;
	ch_muki = MUKI ;


	// 最初は停止中(0)にしておく
	Move = 0 ;

	// ループ
	 while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE])
	{

		if( Move == 0)
		{

			// キー入力に応じてプレイヤーの座標を移動
			if( Key[ KEY_INPUT_LEFT ]  == 1)
			{
				Move = 1 ;
				MoveX = -1 ;
				MoveY = 0 ;
                ch_muki=1; 
			}
			if( Key[ KEY_INPUT_RIGHT]  == 1)
			{
				Move = 1 ;
				MoveX = 1 ;
				MoveY = 0 ;
                ch_muki=3;
			}
			if( Key[ KEY_INPUT_UP   ]==1 )
			{
				Move = 1 ;
				MoveX = 0 ;
				MoveY = -1 ;
				ch_muki=0;
			}
			if( Key[ KEY_INPUT_DOWN ]  == 1)
			{
				Move = 1 ;
				MoveX = 0 ;
				MoveY = 1 ;
                ch_muki=2; 
			}

			if( Move == 1 )
			{
				
				if( MapData[ PlayerY + MoveY ][ PlayerX + MoveX ] >= 1 )// 進入不可能なマップだった場合は移動できない
				{
					Move = 0 ;
				}
				else
				{
					MoveCounter = 0 ;
				}
			}
			// 停止中は画面のスクロールは行わない
			ScrollX = 0 ;
			ScrollY = 0 ;
		}

		// 移動中の場合は移動処理を行う
		if( Move == 1 )
		{
			MoveCounter =MoveCounter+idouryou ;

			// 移動処理が終了したら停止中にする
			if( MoveCounter == MAP_SIZE )
			{
				Move = 0 ;

				// プレイヤーの位置を変更する
				PlayerX += MoveX ;
				PlayerY += MoveY ;

				// 停止中は画面のスクロールは行わない
				ScrollX = 0 ;
				ScrollY = 0 ;
			}
			else
			{
				// 経過時間からスクロール量を算出する
				ScrollX = -( MoveX * MoveCounter ) ;
				ScrollY = -( MoveY * MoveCounter ) ;
			}
		}
;

if(MoveCounter==40 || MoveCounter<=19 )hokoujoutai=0;
else hokoujoutai=1;
		ch_img=image[hokoujoutai + ch_muki*2];
		DrawGraph( (380-MAP_SIZE * PlayerX)+ScrollX  , (280-MAP_SIZE * PlayerY)+ScrollY , map , TRUE ) ;

		DrawGraph( 380 , 280 , ch_img , TRUE ) ;//キャラを描画

	if(PlayerX==32 && PlayerY==32)break;
	// 裏画面の内容を表画面に映す
	ScreenFlip() ;
	}
return 2;
}
迷いの森 分岐B4.cpp

コード:

#include "DxLib.h"
static char Key[256];
static int image[8],idouryou=4,hokoujoutai=1 ;
static int ch_img;
static int ch_muki;

#define MAP_SIZE	40			// マップチップ一つのドットサイズ
#define MAP_WIDTH	26			// マップの幅
#define MAP_HEIGHT	51			// マップの縦長さ

// マップのデータ
int MapData[MAP_HEIGHT][MAP_WIDTH] = {
{ 0,0,0,0,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,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1 },
{ 0,1,0,0,0,1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1 },
{ 0,1,0,1,0,1,0,0,0,0,0,0,1,1,0,1,0,1,1,0,1,0,1,1,0,1 },
{ 0,1,0,1,0,1,0,1,1,1,0,1,0,0,0,1,0,0,1,0,1,0,1,0,0,1 },
{ 0,1,0,1,0,0,0,1,0,0,0,1,1,1,1,1,1,0,1,0,1,0,1,0,1,1 },
{ 0,1,0,1,1,1,1,1,0,1,0,0,0,0,0,0,1,0,1,0,1,0,1,0,0,1 },
{ 0,1,0,1,1,0,1,1,0,0,0,1,1,1,1,0,1,0,1,0,1,0,1,1,0,1 },
{ 0,1,0,1,0,0,0,1,0,1,1,0,0,0,0,0,1,0,1,0,1,0,1,1,0,1 },
{ 0,1,0,0,0,1,0,1,0,1,1,0,1,1,0,0,1,0,1,0,1,0,1,1,0,1 },
{ 0,1,1,1,0,1,0,1,0,0,1,1,0,0,0,1,1,0,1,0,0,0,1,1,0,1 },
{ 0,1,0,0,0,1,0,1,1,0,1,0,0,1,0,0,0,0,0,1,0,0,1,1,0,1 },
{ 0,1,0,0,1,1,0,1,0,0,1,0,1,1,1,1,1,0,0,1,1,1,0,1,0,1 },
{ 0,1,0,1,1,1,0,1,0,1,1,0,1,1,0,0,0,0,1,1,0,0,0,0,0,1 },
{ 0,1,0,1,0,0,0,1,0,0,1,0,1,1,1,1,1,1,1,1,0,1,1,1,1,1 },
{ 0,1,1,1,0,1,1,1,1,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,1 },
{ 0,1,1,1,0,1,1,0,0,0,1,0,1,0,1,1,1,0,0,1,0,1,1,1,0,1 },
{ 0,1,1,1,0,1,1,1,1,0,1,0,1,0,1,0,1,0,0,1,0,1,1,1,0,1 },
{ 0,1,0,1,0,1,0,0,1,1,0,0,1,0,1,0,1,1,0,0,0,1,0,1,0,1 },
{ 0,1,0,0,0,1,1,0,1,1,0,1,0,0,1,0,0,1,1,1,1,1,0,1,0,1 },
{ 0,1,0,1,1,1,0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,1 },
{ 0,1,0,0,0,1,0,1,1,0,1,1,0,1,0,1,1,1,1,1,1,1,1,1,0,1 },
{ 0,1,1,1,0,1,0,1,1,0,0,1,0,0,0,1,1,1,1,1,1,1,1,1,0,1 },
{ 0,1,0,0,0,0,0,1,1,1,0,1,1,1,1,1,1,0,0,0,0,0,1,1,0,1 },
{ 0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1 },
{ 0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1 },
{ 0,1,0,1,0,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1 },
{ 0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1 },
{ 0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
{ 0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1 },
{ 0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,1,0,0,0,1,0,1 },
{ 0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,0,1,0,1,0,0,0,1 },
{ 0,1,0,0,0,0,0,0,1,0,0,0,1,0,1,1,0,1,0,0,0,1,1,1,1,1 },
{ 0,1,0,1,1,0,1,0,0,0,1,0,1,0,1,1,0,1,0,1,0,1,0,0,0,1 },
{ 0,1,0,1,1,0,0,1,1,1,1,0,1,0,1,1,0,1,0,0,1,0,0,1,0,1 },
{ 0,1,0,1,1,1,0,0,0,0,1,0,0,0,1,1,0,0,1,0,0,0,1,1,0,1 },
{ 0,1,0,1,1,0,1,1,1,0,1,1,1,1,1,1,1,0,0,1,1,1,1,1,0,1 },
{ 0,1,1,0,0,0,0,0,0,0,0,0,1,1,0,1,1,1,0,1,1,1,1,1,0,1 },
{ 0,1,0,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,1,0,1 },
{ 0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,0,1,1,1,1,1,0,1,0,1 },
{ 0,1,0,0,1,1,1,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,1 },
{ 0,1,1,0,0,0,1,0,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1 },
{ 0,1,0,1,1,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,1,1,1,1,1,1 },
{ 0,1,0,0,0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,1 },
{ 0,1,0,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1 },
{ 0,1,0,0,0,0,1,0,0,0,1,0,1,0,1,1,1,1,1,1,1,0,1,0,1,1 },
{ 0,1,1,1,1,0,1,0,1,1,1,0,1,0,0,0,1,0,0,0,1,0,1,0,0,1 },
{ 0,1,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,0,1,0,0,0,1,1,0,1 },
{ 0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1 },
{ 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
{ 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 },
};

static int map;
// プレイヤーの位置
static int PlayerX , PlayerY ;

// 移動しているかどうかのフラグ( 0:停止中  1:移動中 )
static int Move ;

// 各方向に移動する量
static int MoveX, MoveY ;

// 移動し始めてから何フレーム経過したかを保持する変数
static int MoveCounter ;

static int ScrollX, ScrollY ;


int Mori_B_4(int shoki_X,int shoki_Y,int MUKI)
{

	// 描画先画面を裏画面にする
	SetDrawScreen( DX_SCREEN_BACK ) ;
	LoadDivGraph( "画像/キャラ.png" , 8 , 2 , 4 , 40 , 41 , image ) ;
	map = LoadGraph( "map/迷いの森 分岐B-4.png" );

	// プレイヤーの初期位置をセット 
	PlayerX = shoki_X ;
	PlayerY = shoki_Y ;
	ch_muki = MUKI ;

	// 最初は停止中(0)にしておく
	Move = 0 ;

	// ループ
	 while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE])
	{

		SetDrawBlendMode( DX_BLENDMODE_NOBLEND,  0 );


		if( Move == 0)
		{



			// キー入力に応じてプレイヤーの座標を移動
			if( Key[ KEY_INPUT_LEFT ]  == 1)
			{
				Move = 1 ;
				MoveX = -1 ;
				MoveY = 0 ;
                ch_muki=1; 
			}
			if( Key[ KEY_INPUT_RIGHT]  == 1)
			{
				Move = 1 ;
				MoveX = 1 ;
				MoveY = 0 ;
                ch_muki=3;
			}
			if( Key[ KEY_INPUT_UP   ]==1 )
			{
				Move = 1 ;
				MoveX = 0 ;
				MoveY = -1 ;
				ch_muki=0;
			}
			if( Key[ KEY_INPUT_DOWN ]  == 1)
			{
				Move = 1 ;
				MoveX = 0 ;
				MoveY = 1 ;
                ch_muki=2; 
			}


			if( Move == 1 )
			{
				
				if( MapData[ PlayerY + MoveY ][ PlayerX + MoveX ] >= 1 )// 進入不可能なマップだった場合は移動できない
				{
					Move = 0 ;
				}
				else
				{
					MoveCounter = 0 ;
				}
			}
			// 停止中は画面のスクロールは行わない
			ScrollX = 0 ;
			ScrollY = 0 ;
		}

		// 移動中の場合は移動処理を行う
		if( Move == 1 )
		{
			MoveCounter =MoveCounter+idouryou ;

			// 移動処理が終了したら停止中にする
			if( MoveCounter == MAP_SIZE )
			{
				Move = 0 ;


				// プレイヤーの位置を変更する
				PlayerX += MoveX ;
				PlayerY += MoveY ;

				// 停止中は画面のスクロールは行わない
				ScrollX = 0 ;
				ScrollY = 0 ;
			}
			else
			{
				// 経過時間からスクロール量を算出する
				ScrollX = -( MoveX * MoveCounter ) ;
				ScrollY = -( MoveY * MoveCounter ) ;
			}
		}
;

if(MoveCounter==40 || MoveCounter<=19 )hokoujoutai=0;
else hokoujoutai=1;
		ch_img=image[hokoujoutai + ch_muki*2];
		DrawGraph( (380-MAP_SIZE * PlayerX)+ScrollX  , (280-MAP_SIZE * PlayerY)+ScrollY , map , TRUE ) ;

		DrawGraph( 380 , 280 , ch_img , TRUE ) ;//キャラを描画

	if(PlayerX==19 && PlayerY==0)break;
		// 裏画面の内容を表画面に映す
		ScreenFlip() ;
	}
return 1;
}
迷いの森 分岐B3.h

コード:

int Mori_B_3(int shoki_X,int shoki_Y,int MUKI);
迷いの森 分岐B4.h

コード:

int Mori_B_4(int shoki_X,int shoki_Y,int MUKI);


しかし、当然これではこの二つのマップ移動しか出来ず、迷いの森 分岐B2のマップや分岐B5のマップを作っても繋げる事が出来ません。
main.cppのファイルのcase 1:でMori_B_3(63,28,1);に引数としてPlayerXとPlayerYの座標とch_mukiの初期状態を渡していますが、これはまだ作っていない迷いの森 分岐B2のマップから移動した時の状態で
迷いの森 分岐B4から迷いの森 分岐B3のマップに移動した時はcase 2:のMori_B_3(32,31,0);という引数になります。
しかしこれをmain.cppのファイルで、case 1:とcase 2:で別々に書くのは不自然だし、書く量が莫大になってしまいます。
マップ上からメニューボタンを押してステータス画面に移行したり、移動中に敵と遭遇して戦闘画面に移行したりもこの後で作りたいと思っていますが、
例えばその後に元のマップに戻る時などにも、ステータス画面に移行する前や戦闘前のPlayerXとPlayerYの座標とch_mukiの値で再開するにしても、その情報のやり取りの方法が分かりません。
返り値をmain.cppに渡してやるにしても複数の返り値なんて渡せないと思うし、それが出来たとしてもこの後データ量が増えれば、複雑にゴチャゴチャし過ぎてわけがわからなくなりそうです。
この辺りの考え方を教えて欲しいです。

それともう一つ質問ですが、このプログラムだとESCキーを押した時にマップの初期位置に向きはそのままで戻るというだけで、ウインドウを閉じて終了するという事をさせられないです。
main.cppとマップの関数両方にwhile文があるのに問題があるのかと思いますが、これはどうすれば良いのでしょうか?

Re: DXライブラリで、複数のファイルに分けてコンパイルする場合のファイル間の変数の情報のやり取りについてがよく分かり

Posted: 2014年10月10日(金) 16:09
by usao
なんというか…
Mori_B_3() と Mori_B_4() の中身は ほとんど同じコードが長々と書いてあるわけですが,
この点をどうお考えなのでしょうか?
森2や森5が増えたら,同じように重複した内容のコードを用意する予定なのですか?

まずはそこらへんの重複が無くなるようにしてみてはいかがでしょう?


たとえば…

「マップが1個しかなくて(=マップ間移動が無い)
 マップのデータ MapData[][] が main.cpp 内に定義されていて,main.cpp だけで,マップ内を動き回れる状態」
のプログラムができているとします.

ここに新たに「マップ間の移動」という要素を加えるとしたら,

コード:

if( 別のマップに移動するための条件を満たした )
{
  ・配列MapData[][]の中身を,移動先マップの内容に書き換える.
 ・プレイヤ座標を,移動先マップでのスタート位置(?)座標に書き換える
}
といったことを行えば良いのではないでしょうか.

追記:上記説明をコードっぽく書くとこんな.

コード:

//マップの最大サイズ.(全てのマップはこのサイズを超えない)
#define MAP_MAX_W   5
#define MAP_MAX_H   4
//「現在の」マップ データ
int MapData[MAP_MAX_H][MAP_MAX_W];
//現在のプレイヤの座標
int PlayerX, PlayerY;
//現在のマップ番号
int MapIndex;

//マップ1の(x,y)に移動
void MoveToMap1( int x, int y )
{
    const int M[MAP_MAX_H][MAP_MAX_W] = 
    {
        {1,1,1,1,1},
        {1,0,1,0,1},
        {1,0,0,0,1},
        {1,1,1,1,1}
    };
    
    int x,y;
    for( y=0; y<MAP_MAX_H; y++ )
    {
        for( x=0; x<MAP_MAX_W; x++ )
        {   MapData[y][x] = M[y][x];    }
    }
    
    PlayerX = x;
    PlayerY = y;
    MapIndex = 1;
}

//マップ2の(x,y)に移動
void MoveToMap2( int x, int y )
{
    ↑と同じ感じに
    ...
}

//メイン
int WINAPI WinMain( 略 )
{
    ...
    //初期状態を用意:MAP1の(1,1)から開始
    MoveToMap1( 1,1 );
    
    while(1)
    {
        メッセージ処理
        
        移動処理
        キー入力で移動しようとする際にMapData[][]の移動先位置の値を調べて移動できるか判定してどうのこうのとか
        
        表示処理
        
        //マップ毎に特別な処理
        switch( MapIndex )
        {
        case 1:
            if( PlayerX==3 && PlayerY==1 )  //マップ1で(3,1)に到達したら
            {   MoveToMap2(3,2);    }   //Map2の(3,2)に移動
            break;
        case 2:
            ...
            break;
        };
    }
    ...
}

Re: DXライブラリで、複数のファイルに分けてコンパイルする場合のファイル間の変数の情報のやり取りについてがよく分かり

Posted: 2014年10月10日(金) 16:48
by softya(ソフト屋)
私のRPG開発講座です。
「マイ 日記 • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/blog.php?u=114&sd=a&c=2
全体的にはまだ難しいと思うので部分的にでも参考になればと思います。

1.プログラムは徹底的に共通化する(似たコードは極力書かない)。
2.データは外部ファイルに分ける。

講座自体はデータの外部分けなど不十分で課題として残してあります。
似たコードは極力書かない理由は、似たコードがたくさんあると面倒くさい・バグ修正や機能拡張が困難・バグの呼び込みです。

Re: DXライブラリで、複数のファイルに分けてコンパイルする場合のファイル間の変数の情報のやり取りについてがよく分かり

Posted: 2014年10月13日(月) 10:21
by メロンくん
返信遅くなってすみません。
理解力無くて中々理解が出来ず苦戦しています。
でもusaoさんとsoftya(ソフト屋)さんのご回答のおかげで
多分基礎的な部分は少し理解できたと思います。
プログラムの共通化とか外部ファイルに分けるとかが、全然意味分かってませんでした。
softya(ソフト屋)さんのRPG開発講座、参考にさせていただいています。
しかしまだまだ自分のレベルでは難しいです。
また分からない部分が出てきたら質問させてください。
ありがとうございました。