首页 > 解决方案 > (ncurses) - mvwaddch() 是否调用 wrefresh()?

问题描述

我正在开发一个小型游戏项目,出于好奇,我评论了刷新主要WINDOW对象的行。

while(game->state)
    {
      //Move into player
      params->mov = player_1;
      params->x = player_1->pos_x;
      params->y = player_1->pos_y;
      params->game = game;
      //curs_set(FALSE);
      player_1->key_move(params);

      //Move into player
      mvwprintw(p_info,y, x, "TERRAIN: [%c]", player_1->inplace);

      //wrefresh(main_scene);           /* THE LINE I DELETED */
      wrefresh(p_info);
      sleep(TICK);

    }

游戏运行没有问题,玩家以图形方式更新其位置。player_1->key_move(params)最终调用wgetch(),mvwaddch()mvinch(), 没有别的(来自ncurses)。wrefresh(p_info)之后被评论,正如预期的那样,该WINDOW对象从未更新。我想知道该函数是否会wrefresh()在某个时候调用。手册中没有直接说明这一点。

如果是这样,是否有替代方案mvwaddch()不更新WINDOW对象?

标签: refreshncurses

解决方案


根据man wgetch,我引​​用:

如果窗口不是填充,并且自上次调用 wrefresh 以来它已被移动或修改,则将在读取另一个字符之前调用 wrefresh。

因为这是一个游戏,所以在循环内部,更具体地说,在例程调用中player_1->key_move(params)对对象进行了修改WINDOW。这就是程序导致这种行为的原因。

我意识到游戏逻辑取决于来自 的状态WINDOW,因此将来可能会出现几次读/写。所有游戏逻辑都将单独处理。


推荐阅读