玩家角色(@)的背景颜色与其他瓷砖重叠

时间:2013-04-23 23:22:28

标签: c++ ncurses curses pdcurses

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

提前致谢。

1 个答案:

答案 0 :(得分:0)

好吧,好像我找到了问题的根源。

  

它不一定是curses库,而是Windows的位图字体   控制台。

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