【问题标题】:Background colour of player character (@) overlapping other tiles玩家角色 (@) 的背景颜色与其他图块重叠
【发布时间】:2013-04-23 23:22:28
【问题描述】:

我正在使用 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;
}

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

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

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

提前致谢。

【问题讨论】:

    标签: c++ ncurses curses pdcurses


    【解决方案1】:

    好的,看来我找到了问题的根源。

    不一定要使用 curses 库,而是 Windows 上的位图字体 控制台。

    更多详情:https://stackoverflow.com/a/9814766/368299

    【讨论】:

      猜你喜欢
      • 2020-05-02
      • 2015-04-11
      • 1970-01-01
      • 1970-01-01
      • 2011-04-29
      • 2017-03-03
      • 1970-01-01
      • 2022-01-20
      • 2021-04-22
      相关资源
      最近更新 更多