私は C++ で pdcurses を使用してローグのようなゲームを作成していますが、現時点ではすべてうまくいっています。しかし、私は今、解決方法がわからないという問題に直面しています。
理解を深めるために、問題のスクリーンショットを見てみましょう。
ご覧のとおり、上の赤い円を拡大すると、プレイヤー キャラクターが敵のトロル (t) の左側に 2 ピクセルほど重なっていることがわかります。問題は、プレイヤーが別の位置に移動すると、敵のトロールがその 2 ピクセルを永久に失ってしまうことです。これは、プレイヤーが左側にいるときにだけ起こることではなく、永続的なものです。
もう一方の円では、プレイヤーは回廊を右から左に移動し、回廊タイル (#) も左側のピクセルを失いました。
ここで、すべてのグラフィックスを更新します。
dungeon_.generate();
while(state_ == State::Running)
{
if(manageInput(windows_[0]) != -1)
{
// Update here monsters behavior
}
dungeon_.draw(windows_[0]);
player_->draw(windows_[0]);
refreshWindows(windows_);
}
これはrefreshWindows(std::vector windows)メソッドです。
void Game::refreshWindows(std::vector<WINDOW *> windows)
{
for(auto w : windows)
{
Curses::wbox(w, 0, 0);
Curses::refresh(w);
}
}
プレイヤーとダンジョンの両方の描画方法でこれが行われますが、ダンジョンもマップ内のタイルごとに異なる場合があります。
void Player::draw(WINDOW *win)
{
Curses::mvwaddch(win, location_.y, location_.x,
static_cast<char>(type_) |
COLOR_PAIR(static_cast<int>(GameObject::Color::White_Green)));
}
int manageInput (WINDOW *win)は次のようになります。
int Game::manageInput(WINDOW *win)
{
int key = Curses::wgetch(win);
if(key != -1)
{
// Player movement
if(key == static_cast<int>(Curses::Key::Up))
{
player_->moveNorth(dungeon_.map());
}
[...]
}
return key;
}
ご覧のとおり、これは私がゲーム ループで使用している非常に単純なアプローチなので、なぜ機能しないのかわかりません。これらは私がテストしたものです:
- 色のサポートを削除する: これがゲームが正しく動作する唯一の方法ですが、もちろん色を使用したいと考えています。
- プレイヤーとダンジョンの両方が描画された後に manageInput を移動し、wclear(windows_[0]); を配置します。manageInput() if の内部 (それ以外の場合は機能しません)。この方法では、ウィンドウがクリアされ、マップが最初から再描画されるように見えます。この方法も機能しますが、ウィンドウがフリックし、あまりクールではありません。
それだけです。私はそれを修正するために何をすべきかわかりません。さらに情報が必要な場合は、こちらの git リポジトリを参照してください: https://github.com/SantiagoSanchez/Ruoeg
前もって感謝します。