首页 > 解决方案 > C 中 ncurses 库的图形问题

问题描述

前提:我正在用 C 编写一个客户端-服务器游戏。游戏图形完全是在 ncurses.h 库的支持下构建的(具体来说是ncursesw)。

问题:游戏是在 Windows 10 上的虚拟机上的 Linux 环境(Ubuntu - 19.04)中编程的。当我在相同的编程环境(Linux -> Ubuntu - 19.04)中启动游戏时,游戏图形运行良好:

屏幕截图:在虚拟机 Win10 上运行图形 Linux (Ubuntu - 19.04)

屏幕截图:在虚拟机 Win10 上运行图形 Linux (Ubuntu - 19.04)

但是,在 WLS(Linux 的 Windows 子系统)、Linux(Ubuntu 19.04/19.10不在虚拟机上)等任何其他环境中。图形无法正常工作(奇怪的是,有时图形被正确初始化)

屏幕截图:图形无法正常工作 Linux (Ubuntu - 19.04)

屏幕截图:图形无法正常工作 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;
}

一些信息:

可能是什么问题呢?会不会是字符编码错误?如果需要更多信息,请询问。谢谢大家。

标签: clinuxncurses

解决方案


推荐阅读