Недавно я начал использовать PDcurses для Windows. Я написал простую программу, которая создает окно и перемещает символ в соответствии с вводом пользователя, вверх для «w», вниз для «s» и так далее.
Происходят 2 странные вещи:
- Всякий раз, когда я перемещаю персонажа вниз, удерживая s, он исчезает, не позволяя пользователю видеть движение.
- Всякий раз, когда я перемещаю персонажа в сторону, он оставляет след (вроде) синего цвета, если он идет вправо, и красного, если он идет влево.
Прикрепляю коротенькую гифку, в которой можно увидеть первую проблему и скриншот для второй (так как качество записи не хватило, чтобы увидеть след).
Вот код С++. Он рисует в начале цикла, ищет входные данные в середине и обновляет экран в конце. Я установил getch()
, чтобы не прерывать выполнение с помощью nodelay()
.
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);
wprintw(stage,"%c",'@');
c=getch();
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);
Sleep(16);
wclear(stage);
}
Sleep
? Или рисовать персонажа перед рисованием коробки? Или изменить порядок, чтобы вы получили персонажа, перерисовали экран, обновились, а затем заснули? - person 1201ProgramAlarm   schedule 07.02.2021napms()
(встроено в curses, разрешает фоновую обработку) вместоSleep()
(зависит от Windows, останавливает поток). 3. Рассмотрите возможность стирания и перерисовки только символа, а не всего окна. 4. Тем не менее, следы звучат как артефакт терминала, а не то, что вы сможете исправить на уровне проклятий. - person William McBrine   schedule 08.02.2021