# 聊天弹幕

聊天弹幕 聊天的时候 往屏幕上飘过一条弹幕消息

内置 japi 解锁了 魔兽 frame 控件锁定在屏幕内的限制, 可以随意移出屏幕外。

演示如下:


local jass = require 'jass.common'
local slk = require 'jass.slk'

--弹幕在屏幕的时间
local time = 10


local function barrage(handle, text, art)
    local start = {
        x = 1920,
        y = math.random(0, 1080), --魔兽随机数 切记不要异步调用
    }


    --创建ui控件
    local panel = class.panel:builder 
    {
        x = start.x,
        y = start.y,
        w = 32,
        h = 32,
        normal_image = art, --图标

        text = {
            type = 'text',
            x = 38,
            w = 200,
            text = jass.GetPlayerName(handle) .. ': '.. text, --文本
            align = 'left',
            font_size = 18,
        }
    }


    local speed = 1920 / time / 60
    --渲染帧计时器  1秒60帧 16毫秒的间隔 
    game.tick.loop(16, function (t)
        start.x = start.x - speed
        --刷新位置
        panel:set_position(start.x, start.y)

        --超出屏幕一段距离后 计时器跟ui一起删除。
        if start.x + 300 < 0 then 
            t:remove()
            panel:destroy()
        end 
    end)
end


local group = jass.CreateGroup()

--获取单位图标
local function get_art(unit)
    if unit == nil or unit == 0 then 
        return ''
    end 
    local data = slk.unit[jass.GetUnitTypeId(unit)]
    if data == nil then 
        return ''
    end
    return data.art
end 

--玩家聊天的时候 选取单位组 拿到他的英雄图标 之后发送弹幕
ac.game:event '玩家-聊天' (function (_, player, str)

    jass.GroupClear(group)
    jass.GroupEnumUnitsOfPlayer(group, player.handle, nil)

    local unit = FirstOfGroup(group)
    
    --发送弹幕
    barrage(player.handle, str, get_art(unit))

end)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78