私は小さなコンソール アドベンチャー ゲームを書いていますが、いくつかの問題に直面しました。
1. 入力がちょっと遅いです。while ループ ( while(getch() == 'w') ) を使用しています。最初にキーを押した後は何も起こりません (キーを 2 回押す必要があります)。方向を切り替えても (キー A/D/S を押します)、最初は反応しません。キーを持っていれば問題なく動作します。これはどのように修正できますか?
2.ゲームをリフレッシュするために使用する関数は次のとおりです(キーが押されたときにゲームシーンをレンダリングします):
void refresh(char map[Y][X])
{
system("cls");
for (int i = 0; i<UP; i++)
{
cout<<endl;
}
for (int i = 0; i<Y; i++)
{
for (int k = 0; k<LEFT; k++)
{
cout<<" ";
}
for (int j = 0; j<X; j++)
{
cout<<map[i][j];
}
cout<<endl;
}
}
この機能を一度使用すると問題ありませんが、キーを複数回押したり押したりすると、ゲームフィールドが点滅し始めます。フィールド全体ではなく、フィールドの一部 (変更が行われた場所/移動が行われた場所) のみを再描画する必要があると考えました。それを行う方法について何かアイデアを提供できますか?
入力のサンプル コード:
while(getch() == 'w')
{
if (map[y-1][x]!= WALL)
{
map[y-1][x] = CHARACTER;
map [y][x] = ' ';
y--;
refresh(map);
Sleep(SPEED); // this is unnecessary, SPEED is 0, I just kept it for tests
}
}
基本的に、メイン関数は次のようになります。
int main()
{
(...) Variables (...)
generateMap(FROM FILE);
refresh(); // First initialization of the field
while (getch() != 'q') // While not quitting
{
while(getch() == 'w')
{
if (THE FIELD ABOVE IS NOT OCCUPIED)
{
setSomeVariables();
refresh(THE GAMEFIELD);
}
}
}
while(getch() == 's')
{
if (THE FIELD BELOW IS NOT OCCUPIED)
{
setSomeVariables();
refresh(THE GAMEFIELD);
}
}
}
while(getch() == 'a')
{
if (THE FIELD ON THE LEFT IS NOT OCCUPIED)
{
setSomeVariables();
refresh(THE GAMEFIELD);
}
}
}
while(getch() == 'd')
{
if (THE FIELD ON THE RIGHT IS NOT OCCUPIED)
{
setSomeVariables();
refresh(THE GAMEFIELD);
}
}
}
return 0;
}