2

私は C++ で pdcurses を使用してローグのようなゲームを作成していますが、現時点ではすべてうまくいっています。しかし、私は今、解決方法がわからないという問題に直面しています。

理解を深めるために、問題のスクリーンショットを見てみましょう。

http://i.imgur.com/xr9Faj1.png

ご覧のとおり、上の赤い円を拡大すると、プレイヤー キャラクターが敵のトロル (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

前もって感謝します。

4

1 に答える 1

0

わかりました、問題の原因を見つけたようです。

curses ライブラリである必要はありませんが、Windows コンソールのビットマップ フォントです。

詳細: https://stackoverflow.com/a/9814766/368299

于 2013-04-24T01:19:02.000 に答える