unit_frame::redraw |--game_display::float_label |
为组织所有浮动标签,程序使用了两个全局变量。
显示/擦除标签函数
floating_label_context floating_label_context类用于构造/拆除符动标签层。构造函数对应构造层,析构函数对应拆除层。 floating_label_context析构函数不仅仅只构造层。在构造层新前层会把最顶旧层的所有符动标标绘向前景图面。 floating_label_context析构函数不仅仅拆除层,在拆除层前会删除该层所有浮动标签,拆除后把新顶层的所有符动标签从前景图面擦除。 FAQ A:标签显示后无法擦除 Q:可通造成的一个原因,draw_floating_labels被连续调用了两次。 举个例子,程序一进入时就让显示一个标签A,程序接下显示战役目标对话框,由此标签A没法消除。对于这个无法消除原因是: 1)显示标签A时,display::flip(),成对调用了draw_floating_labels和undraw_floating_labels。也就是在flip退出前,图面frame buffer中是没有标签的; 2)显示战役对话框。要调用于twindow::draw(),这函数要调用draw_floating_labels但不调用undraw_floating_labels,这使得frame buffer出现了标签; 3)display::draw被调用,它会调用display::flip(),这flip()调用draw_floating_labels,结果它把有标签的当前背景,它画在是在那背影上继续画(看到就是半透明的变成不透明),而undraw_floating_labels时,它恢复背景,而这背景已是有twindow::draw()画过标签的背景。 ??当在“菜单”--“战役目标”,这时弹出战役目标对话框后,是可以擦除标签,奇怪!(按下“菜单”是会新增一浮动标签层,但一选中“战役目标”该层被拆掉”,这里不是层的问题。难道是frame buffer和主图面,这时是直接把标签画向主图面的?) |
启动界面 show_title头一次建立层,但在该函数退出后,该层消失。游戏回复到没有层。 dialog_manager类从font::floating_label_context派生,一旦构造dialog_manager对象则相当于建立了一浮动标签层。(常见对话框的显示函数都会构造dialog_manager对象) play_controller有一个成员变量:labels_manager_,这个变量类型是font::floating_label_context,一旦play_controller被构造,相当于建立了一浮动标签层。前面虽建立过浮动标签层,但用完即被删。play_controller作为一个较长久对象,它可以认为是游戏主程序时最底的浮动标签层。 |