Недавно я задал вопрос о паре проблем (теперь решенных), которые у меня были с кодом ниже. Сама программа проста, есть персонаж, который перемещается в окне в соответствии с вводом пользователя, захваченным с помощью функции 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