视频弹幕管理器的实现方法
直播接口提供的弹幕是通过消息的形式发送过来的, 在我们播放器进行展示的时候, 需要实现弹幕的移动与排布。实现的过程中将弹幕进行抽象,最终抽象出了的三个对象,其层次关系如图:
图1 弹幕管理抽象出的对象层次结构
文本对象: 负责文本的显示、隐藏与移动, 提供是否进入弹道和是否离开弹道的接口, 提供文本移动的TICK接口。
弹道对象:包含多个文本对象, 并对这些文本对象进行管理, 提供添加文本对象、删除文本对象,获得当前显示的文本对象个数, 当前是否可添加文本对象,清空弹道, 更新所有文本对象等接口。
弹幕对象:包含多个弹道对象,并对弹道对象进行管理, 提供依据屏幕大小自动分配弹道个数,隐藏和显示弹道, 弹幕消息队列缓存, 依据消息多少动态调整显示弹道个数, 以及消息选择弹道显示等接口。
三个层次的对象, 每个对象在对应层负责相应的功能, 各司其职, 就能完成整个弹幕显示的工作。
class TextSwimmer(object):
"""
弹幕携带对象, 弹幕泳道的游泳者
"""
def __init__(self, text_widget, msg, start_pos, end_pos):
"""
游泳者的初始化
"""
self.text = msg
self.start_pos = start_pos
self.end_pos = end_pos
self.extern_dis = 30
self.text_content = self.construct_show_text(msg)
self.text_widget = text_widget.clone()
self.text_widget.setAnchorPoint(cc.Vec2(0.0, 0.5))
utils.set_content_rich(self.text_widget, self.text_content)
shadow_color = utils.color_code_2_rgb('000000', 255)
self.text_widget.enableShadow(shadow_color, cc.Size(3, -3), False)
self.text_widget.setVisible(False)
self.text_size = self.text_widget.getContentSize()
self.last_move_time = time.time()
self.interval = 50
self.is_arrive = False
self.start_swim()
def construct_show_text(self, msg):
"""
构建需要显示的信息
"""
nick = '[' + msg.get('nick') + ']'
msg_body = msg.get(&