Цвет фона персонажа игрока (@), перекрывающий другие плитки

Я делаю извращенную игру, используя pdcurses в C++, и сейчас все идет хорошо. Но сейчас я сталкиваюсь с проблемой, которую не знаю, как решить.

Давайте посмотрим на скриншот проблемы для лучшего понимания:

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

Заранее спасибо.

1 ответ

Решение

Хорошо, похоже, что я нашел источник проблемы.

Это не обязательно должно быть с библиотекой curses, а растровыми шрифтами на консоли Windows.

Более подробная информация: /questions/33032965/simvolyi-perekryivayutsya-kogda-oni-izmenili-tsvet-i-napechatanyi-zadom-napered/33032971#33032971

Другие вопросы по тегам