c - C 中 ncurses 库的图形问题
问题描述
前提:我正在用 C 编写一个客户端-服务器游戏。游戏图形完全是在 ncurses.h 库的支持下构建的(具体来说是ncursesw)。
问题:游戏是在 Windows 10 上的虚拟机上的 Linux 环境(Ubuntu - 19.04)中编程的。当我在相同的编程环境(Linux -> Ubuntu - 19.04)中启动游戏时,游戏图形运行良好:
屏幕截图:在虚拟机 Win10 上运行图形 Linux (Ubuntu - 19.04)
但是,在 WLS(Linux 的 Windows 子系统)、Linux(Ubuntu 19.04/19.10不在虚拟机上)等任何其他环境中。图形无法正常工作(奇怪的是,有时图形被正确初始化):
屏幕截图:图形无法正常工作 Linux (Ubuntu - 19.04)
代码: 完整的服务器代码在下面主要的图形功能:
int initInterface(char* blueprint){
char basicComponent[1];
int bytesReaded;
int hudFile;
pthread_t tidUpdateChat;
LpMsg msgChat;
char msg[CHAT_WIDTH];
sleep(1);
/* Verifica la compatibilità dei colori con il terminale */
if(!has_colors()){
endwin();
printf("\a\n\x1b[31m <!> Il tuo terminale non supporta i colori.\n\n\x1b[0m");
return 1;
}
start_color();
/* Inizializzazione della grafica */
if((hudFile = open(blueprint, O_RDONLY)) == -1){
endwin();
printf("\a\n\x1b[31m <!> Errore durante l'inizializzazione dell'interfaccia grafica.\n\n\x1b[0m");
return 1;
}
while((bytesReaded = read(hudFile, basicComponent, 1)) > 0){
if(bytesReaded == -1){
endwin();
printf("\a\n\x1b[31m <!> Errore durante l'inizializzazione dell'interfaccia grafica.\n\n\x1b[0m");
return 1;
}
basicComponent[bytesReaded] = '\0';
basicComponent[0] = initStructures(basicComponent[0]);
if(basicComponent[0] == FIELD_BLUEPRINT){
printw(" ");
} else{
printw("%s", basicComponent);
}
}
close(hudFile);
/* Disabilito la ristampa dei caratteri catturati da getch */
noecho();
/* Rendo il cursore invisibile */
curs_set(0);
/* Definizione dei vari design */
init_color(COLOR_BLACK, 784, 803, 694);
init_color(COLOR_WHITE, 8, 0, 60);
init_pair(DESIGN_THEME, COLOR_BLACK, COLOR_WHITE);
init_pair(DESIGN_RED, COLOR_RED, COLOR_WHITE);
init_pair(DESIGN_CYAN, COLOR_CYAN, COLOR_WHITE);
init_pair(DESIGN_YELLOW, COLOR_YELLOW, COLOR_WHITE);
init_pair(DESIGN_GREEN, COLOR_GREEN, COLOR_WHITE);
init_pair(DESIGN_BLUE, COLOR_BLUE, COLOR_WHITE);
init_pair(DESIGN_GRASS, COLOR_GREEN, COLOR_GREEN);
init_pair(DESIGN_BRICK, COLOR_BLUE, COLOR_WHITE);
init_pair(DESIGN_PACKET, COLOR_RED, COLOR_GREEN);
init_pair(DESIGN_LOCATION, COLOR_BLACK, COLOR_MAGENTA);
init_pair(DESIGN_PLAYER, COLOR_BLUE, COLOR_GREEN);
/* Cambio il colore dello sfondo e del testo */
bkgd(COLOR_PAIR(DESIGN_THEME));
sprintf(msg, "Sono in ascolto sulla porta %d!", listenerPort);
if((msgChat = allocMsg(msg, DESIGN_BLUE, false)) != NULL){
pthread_create(&tidUpdateChat, NULL, updateChat, msgChat);
}
/* Commit della grafica */
refresh();
return 0;
}
一些信息:
- 在 main 中,我初始化了语言环境和 ncurses 窗口。
- 图形是从文件中初始化的,实际上我将从文件中逐个字符地读取。这里的文件:graphics.txt
可能是什么问题呢?会不会是字符编码错误?如果需要更多信息,请询问。谢谢大家。
解决方案
推荐阅读
- ios - 是否有非公共 URL 方案 (App-Prefs:root=LOCATION_SERVICES) 的替代方法来打开 iOS 上的系统设置?
- python - 如何创建一个熊猫数据框,其中列的数据类型将是字典?
- r - 使用聚合的 data.table 多列非等连接性能缓慢
- python - 如何在没有登录表单页面的情况下进行现场授权?
- java - Spring - Hibernate:无法使用 HibernateTemplate 将对象数据保存到表中
- python - AttributeError:“StringField”对象没有属性“内容”
- node.js - 在对 expect().toBe() 应用 toBeA() 方法时,它会给出一个错误,即无法读取 undefined 的属性
- loopbackjs - 环回远程方法不断将 {id} 添加到路由中
- javascript - Ace Editor 用标记突出显示部分行
- atom-editor - Atom:你如何在编辑器中切换书签?