おはようございます。いつも、お世話になっています。
TKOZです。ネットカフェからの書き込みです。
今、「汽車ポッポ」という、列車のレールを組み立てる
パズルゲームを作っています。
パズルゲームアルゴリズムマニアックスという本を参考に
プログラミングしていたのですが、プログラムが上手く動作しません。
具体的には、汽車がレールの上を上手く走ってくれないんです。
ソースファイルを添付しました。
開発環境は、VisualC++6.0で、WindowsXPです。
どうか、誰か、アドバイスを下さい。よろしくお願いします。
汽車のレールを組み立てるパズルゲームなんですが…
Re:汽車のレールを組み立てるパズルゲームなんですが…
>>具体的には、汽車がレールの上を上手く走ってくれないんです。
もう少し具体的にして欲しかったです。
「上手く走らない」と言っても、
------------------------------------------------------------
【1】初めから汽車が動かない
【2】レールの画像と一致しない方向へすすむ
【3】汽車が、レールの画像の座標から 微妙にズレた場所を走る
【4】次のレールへ移動しようとする際に、汽車がとまる
【5】レールの画像が無い場所を進み始める
【6】汽車の走るスピードが変化したり、意図しないスピードになったりする
------------------------------------------------------------
など、色々と考えられます。
あと、汽車がどう動くかの前に、エラーが出て実行できませんでした。
下記のコードでは、最初 Time = 0、CONNECTED_RAIL_TIME = 1なので
if文が実行されます。(Time++;)
そして、その後DrawFormatStringで、初期化されていないdirを表示しようとするので
エラーが出て止まります。
(cx,cyも初期化されてないです。)
---------------------------------------------------------------------------
int Move()
{
int dir;
int cx,cy;
if (Time<CONNECTED_RAIL_TIME){
Time++;
} else {
cx=CX+CONNECTED_RAIL_VX[Di[/url];
cy=CY_+CONNECTED_RAIL_VY[Di[/url];
if ( cx>=0 && cx<20 && cy>=0 && cy<15)
{
dir=CONNECTED_RAIL_DIR[Get(cx,cy)][Di[/url];
if (dir!=4)
{
CX=cx;
CY_=cy;
Dir=dir;
Time=0;
}
}
}
DrawFormatString(0 ,0 , GetColor(255,0,0) ,
"dir=%d" , dir ) ;
DrawFormatString(0 ,32 , GetColor(255,0,0) ,
"cx=%d:cy=%d" , cx,cy ) ;
DrawFormatString(0 ,64 , GetColor(255,0,0) ,
"Dir=%d" , Dir ) ;
---------------------------------------------------------------------------
Re:汽車のレールを組み立てるパズルゲームなんですが…
>>conioさんへ
>もう少し具体的にして欲しかったです。
分かりました。今後、気をつけます。
あと、指摘された部分を直して、
DrawCar()内の
移動が出来ました。
しかし、滑らかに動かすにはどうすればいいのでしょうか?
>もう少し具体的にして欲しかったです。
分かりました。今後、気をつけます。
あと、指摘された部分を直して、
DrawCar()内の
DrawRectGraph( Car.x*32, Car.y*32, (Car.move_angle/30)*32, 0, 32, 32, SubGraphicHandle, TRUE, FALSE ) ;で、Car.xとCar.yを32倍したら、カクカクですが、レールの上をきちんと
移動が出来ました。
しかし、滑らかに動かすにはどうすればいいのでしょうか?
Re:汽車のレールを組み立てるパズルゲームなんですが…
とりあえず、簡単に作ってみました。
また、#if の横にある数字を0か1にしてマップを切り替えられます。
流れとしてはこんな感じです。
【1】現在、列車の居るレールの情報を調べる。
【2】レールに応じて、動く方向のフラグを立てる。
【3】1ドットずつ、フラグに応じて増減させる。(++x,--x,++y,--yなど)
【4】次のマス(レール)に到着した時に、動く方向のフラグを消す。
【5】1へ戻る
また、#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; } --------------------------------------------------------------------------------------
Re:汽車のレールを組み立てるパズルゲームなんですが…
conioさん、ありがとうございます。
参考になりました。
無事、ゲームは完成しました。
後、もう少し微調整が必要ですが、あとは大丈夫です。
ありがとうございました。
参考になりました。
無事、ゲームは完成しました。
後、もう少し微調整が必要ですが、あとは大丈夫です。
ありがとうございました。