とりあえず、簡単に作ってみました。
また、#if の横にある数字を0か1にしてマップを切り替えられます。
流れとしてはこんな感じです。
【1】現在、列車の居るレールの情報を調べる。
【2】レールに応じて、動く方向のフラグを立てる。
【3】1ドットずつ、フラグに応じて増減させる。(++x,--x,++y,--yなど)
【4】次のマス(レール)に到着した時に、動く方向のフラグを消す。
【5】1へ戻る
--------------------------------------------------------------------------------------
#include "DxLib.h"
int Key[256];
int GetHitKeyStateAll_2(int KeyStateBuf[/url]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key==1) KeyStateBuf++;
else KeyStateBuf=0;
}
return 0;
}
#if 0
int Map[5][6] = { {1,1,1,1,1,4},
{1,1,1,1,4,4},
{3,1,1,0,4,4},
{3,3,2,2,2,4},
{3,2,2,2,2,2}, };
#else
int Map[5][6] = { {4,1,1,1,1,4},
{4,3,2,4,2,2},
{4,1,3,4,1,1},
{4,3,2,4,3,2},
{1,1,3,1,1,3}, };
#endif
enum MoveID{
MOVE_NONE,
MOVE_RIGHT,
MOVE_LEFT,
MOVE_UP,
MOVE_DOWN,
MOVE_MAX
};
typedef struct{
MoveID mflag;
char* c;
}Cell;
const Cell cell[MOVE_MAX] = { {MOVE_NONE,"×"},
{MOVE_RIGHT,"→"},
{MOVE_LEFT,"←"},
{MOVE_UP,"↑"},
{MOVE_DOWN,"↓"}
};
typedef struct{
int x;
int y;
int Exist;
MoveID mflag;
}Train;
Train train = {0,0,1,MOVE_NONE};
int BaseX = 100;
int BaseY = 100;
void MoveTrain(void)
{
if(train.mflag == MOVE_NONE){
if(train.x >= 0 && train.y >= 0 && train.y/20 < (sizeof(Map)/sizeof(Map[0])) && train.x/20 < (sizeof(Map[0])/sizeof(Map[0][0]))){
switch(cell[Map[train.y/20][train.x/20]].mflag)
{
case MOVE_RIGHT:train.mflag = MOVE_RIGHT;break;
case MOVE_LEFT: train.mflag = MOVE_LEFT;break;
case MOVE_UP: train.mflag = MOVE_UP;break;
case MOVE_DOWN: train.mflag = MOVE_DOWN;break;
default:break;
}
}else{
train.Exist = 0;
}
}
if(train.mflag != MOVE_NONE){
switch(train.mflag)
{
case MOVE_RIGHT:++train.x;break;
case MOVE_LEFT: --train.x;break;
case MOVE_UP: --train.y;break;
case MOVE_DOWN: ++train.y;break;
}
if((train.x % 20 == 0) && (train.y % 20 == 0))
train.mflag = MOVE_NONE;
}
}
void DrawMap(void)
{
int White = GetColor( 255, 255, 255 );
for(int i = 0, count = sizeof(Map) / sizeof(Map[0]); i < count; i++){
for(int j = 0, count2 = sizeof(Map[0]) / sizeof(Map[0][0]); j < count2; j++)
{
if(Map[j] == 0)
DrawString(BaseX + j*20, BaseY + i*20, cell[Map[j]].c, White);
else
DrawString(BaseX + j*20, BaseY + i*20, cell[Map[j]].c, White);
}
}
}
void DrawTrain(void)
{
int Yellow = GetColor( 255, 255, 0 );
int Red = GetColor( 255, 0, 0 );
if(train.Exist == 0)
DrawString( BaseX + train.x - 35, BaseY + train.y - 20, "\脱線!!/", Red);
DrawString( BaseX + train.x, BaseY + train.y, "●", Yellow);
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE );
if(DxLib_Init() == -1 ) return -1;
SetDrawScreen( DX_SCREEN_BACK );
while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0 ){
MoveTrain();
DrawMap();
DrawTrain();
ScreenFlip();
}
DxLib_End();
return 0;
}
--------------------------------------------------------------------------------------