SDL中文论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz

浮动标签(floating label)

查看数: 6063 | 评论数: 4 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2020-9-3 18:23

正文摘要:

游戏中使用浮动标签的几个例子 1:在地图上标注字符,像调试时用的格子坐标。 2:鼠标落在窗口控件、状态报告上,出现工具提示。 3:鼠标落在地图上单位,左下角/右下角显示单位信息。 4:攻击时显示的失血值,攻击 ...

回复

admin 发表于 2020-9-3 18:25:37

显示攻击性文字

unit_frame::redraw
  |--game_display::float_label
admin 发表于 2020-9-3 18:23:49

程序

为组织所有浮动标签,程序使用了两个全局变量。
  1. std::map<int, floating_label> labels;
复制代码
labels存储所有浮动标签,在这里浮动标答没有层的概念,创建一个就加入一个,删除一个就擦除一个。int部分就是浮动标签id。
  1. std::stack<std::set<int> > label_contexts;
复制代码
label_contexts是浮动标签分层组织变量。由它可看出浮动标签被分层组织。因为是先进后出,在第一分法上采用栈,对于同一层的则“公平”存储,采有std::set。set中的int就是某个id,可以以它为关键字从labels中搜出某个floating_label。

显示/擦除标签函数
  1. void draw_floating_labels(surface screen)
复制代码
绘制当前层所有浮动标签到screen图面。screen图面可能是frame buffer,可能是前景图面,display::draw时是frame buffer。
  1. void undraw_floating_labels(surface screen)
复制代码
从screen图面擦除当前层所有浮动标签。screen图面可能是frame buffer,可能是前景图面,display::draw时是frame buffer。

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和主图面,这时是直接把标签画向主图面的?)
admin 发表于 2020-9-3 18:23:26

游戏运行时浮动标签层变换情况

启动界面
show_title头一次建立层,但在该函数退出后,该层消失。游戏回复到没有层。

dialog_manager类从font::floating_label_context派生,一旦构造dialog_manager对象则相当于建立了一浮动标签层。(常见对话框的显示函数都会构造dialog_manager对象)

play_controller有一个成员变量:labels_manager_,这个变量类型是font::floating_label_context,一旦play_controller被构造,相当于建立了一浮动标签层。前面虽建立过浮动标签层,但用完即被删。play_controller作为一个较长久对象,它可以认为是游戏主程序时最底的浮动标签层。

Archiver|手机版|小黑屋|丽谷软件|libsdl.cn

GMT+8, 2025-5-2 04:13 , Processed in 0.044839 second(s), 24 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表