DXライブラリで、複数のファイルに分けてコンパイルする場合のファイル間の変数の情報のやり取りについてがよく分かりません。
Posted: 2014年10月10日(金) 14:28
取り敢えずこんな感じで迷いの森 分岐B3のマップと分岐B4のマップを移動する事は出来ました。
main.cpp
↓
迷いの森 分岐B3.cpp
↓
迷いの森 分岐B4.cpp
↓
迷いの森 分岐B3.h
↓ 迷いの森 分岐B4.h
↓
しかし、当然これではこの二つのマップ移動しか出来ず、迷いの森 分岐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文があるのに問題があるのかと思いますが、これはどうすれば良いのでしょうか?
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;
}
↓
#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;
}
↓ 迷いの森 分岐B4.h
↓
しかし、当然これではこの二つのマップ移動しか出来ず、迷いの森 分岐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文があるのに問題があるのかと思いますが、これはどうすれば良いのでしょうか?