おはようございます。いつも、お世話になっています。
TKOZです。ネットカフェからの書き込みです。
今、「汽車ポッポ」という、列車のレールを組み立てる
パズルゲームを作っています。
パズルゲームアルゴリズムマニアックスという本を参考に
プログラミングしていたのですが、プログラムが上手く動作しません。
具体的には、汽車がレールの上を上手く走ってくれないんです。
ソースファイルを添付しました。
開発環境は、VisualC++6.0で、WindowsXPです。
どうか、誰か、アドバイスを下さい。よろしくお願いします。
汽車のレールを組み立てるパズルゲームなんですが…
-
conio
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 ) ;
----------------------------------------------------------------------------
KEYONN_
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倍したら、カクカクですが、レールの上をきちんと移動が出来ました。
しかし、滑らかに動かすにはどうすればいいのでしょうか?
-
conio
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;
}
---------------------------------------------------------------------------------------
KEYONN_
Re:汽車のレールを組み立てるパズルゲームなんですが…
conioさん、ありがとうございます。
参考になりました。
無事、ゲームは完成しました。
後、もう少し微調整が必要ですが、あとは大丈夫です。
ありがとうございました。
参考になりました。
無事、ゲームは完成しました。
後、もう少し微調整が必要ですが、あとは大丈夫です。
ありがとうございました。