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;
}

如您所见,这是我在游戏循环中使用的一种非常简单的方法,所以我不知道为什么它不起作用。这些是我测试过的东西:

  • 移除颜色支持:这是游戏正常运行的唯一方法,但我当然想使用颜色。
  • 如果在玩家和地牢都绘制并放置 wclear(windows_[0]); 之后移动 manageInput 在 manageInput() if 内(否则它不起作用)。这种方式似乎窗口被清除,地图重新从头开始绘制。这种方式也可以,但是窗口会闪烁,这并不是很酷。

就这样。我不知道该怎么做才能修复它。如果您需要更多信息,可以在这里找到 git 存储库:https ://github.com/SantiagoSanchez/Ruoeg

提前致谢。

4

1 回答 1

0

Ok, it seems like I have found the source of the problem.

It doesn't have to be with curses library, but bitmap fonts at Windows console.

More details: https://stackoverflow.com/a/9814766/368299

于 2013-04-24T01:19:02.000 回答