Артефакты окна Ncurses

Недавно я задал вопрос о паре проблем (теперь решенных), которые у меня были с кодом ниже. Сама программа проста, есть персонаж, который перемещается в окне в соответствии с вводом пользователя, захваченным с помощью функции wgetch() внутри игрового цикла.
Продолжая кодирование, я обнаружил новую проблему:
окно, которое я создаю (которое я назвал stage), должно быть таким же большим, как экран (stdscr), иначе движение персонажа будет оставлять следы, воссоздающие проблемы, упомянутые здесь Проблемы с curses C++. Поэтому, если я выполню функцию createstage(), устанавливающую размер окна меньше экрана (именно так оно и должно работать), будут эти графические артефакты.
Есть ли способ исправить это без необходимости рисовать/реализовывать? ящик/окно самостоятельно или работаю только с stdscr?

#include "curses.h"
#include <windows.h>

void disableselection(){
  HANDLE hInput;
  DWORD prev_mode;
  hInput = GetStdHandle(STD_INPUT_HANDLE);
  GetConsoleMode(hInput, &prev_mode);
  SetConsoleMode(hInput, prev_mode & ENABLE_EXTENDED_FLAGS);
}

void disableresizing(){
  HWND consoleWindow = GetConsoleWindow();
  SetWindowLong(consoleWindow, GWL_STYLE, GetWindowLong(consoleWindow, GWL_STYLE) &   ~WS_MAXIMIZEBOX & ~WS_SIZEBOX);
 }

 void initialize(){
  initscr();
  curs_set(0);
  disableselection();
  disableresizing();
  noecho();
 }

 WINDOW* createstage(int starty=0, int startx=0, int height=LINES, int width=COLS){
  WINDOW* win=newwin(height-starty,width-startx,starty,startx);
  nodelay(win,TRUE);
  refresh();
  return win;
}

void end(WINDOW* stage){
  clear();
  refresh();
  nodelay(stdscr,FALSE);
  printw("press something to exit");
  getch();
  endwin();
}

int main(){
  initialize();
  WINDOW* stage= createstage();
  int ywindow,xwindow,heightwindow,widthwindow;
  getbegyx(stage,ywindow,xwindow);
  getmaxyx(stage,heightwindow,widthwindow);
  heightwindow--;
  widthwindow--;
  int x = xwindow+1, y = ywindow+1;
  char c = '@';
  while(TRUE){
      box(stage,0,0);
      wmove(stage,y,x);
      waddch(stage,'@');
      c=wgetch(stage);
      if(c=='w' && y-1>ywindow){
        y--;
      }
      if (c=='s' && y+1<heightwindow){
        y++;
      }
      if(c=='d' && x+1<widthwindow){
        x++;
      }
      if(c=='a' && x-1>xwindow){
        x--;
      }
      wrefresh(stage);
      napms(16);
      wclear(stage);

  }
  end(stage);
}

Использование C++ и PDCurses3.8 в Windows


person Fiabio    schedule 08.02.2021    source источник