渐开线实现

渐开线在游戏脚本中多用于找怪或者农场类游戏中收割,下面给出两种不同的渐开线在触动精灵中的实现方法:

方形渐开线

init(1)

mSleep(1000)

local x = 1010 --起始坐标x

local y = 698 --起始坐标y

local v = 30 --两点间距离

touchDown(x, y)

mSleep(100)

for var = 1,20 do

j = 0

k = v

for _i = 1,2 do

for i = 1,10 do

x = x + j

y = y + k

touchMove(x, y)

mSleep(20)

end

j = v

k = 0

end

v = v * (-1.05)

end

touchUp(x, y)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

init(1)

mSleep(1000)

localx=1010--起始坐标x

localy=698--起始坐标y

localv=30--两点间距离

touchDown(x,y)

mSleep(100)

forvar=1,20do

j=0

k=v

for_i=1,2do

fori=1,10do

x=x+j

y=y+k

touchMove(x,y)

mSleep(20)

end

j=v

k=0

end

v=v *(-1.05)

end

touchUp(x,y)

圆形渐开线

init(1)

mSleep(1000)

local x0 = 1010 --起始坐标x

local y0 = 698 --起始坐标y

local rr = 20 --设置递增半径

local l = 10 --设置点间距

local p = 0 --初始化角度

local r = 30 --设置首圈半径

local rn = 10 --设置圈数

touchDown(x0, y0)

mSleep(100)

for var = 1,rn do

while p < math.pi * 2 do

x = x0 + r * math.cos(p)

y = y0 - r * math.sin(p)

touchMove(x, y)

mSleep(10)

p = p + l/r

end

p = 0

r = r + rr

end

touchUp(x0, y0)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

init(1)

mSleep(1000)

localx0=1010--起始坐标x

localy0=698--起始坐标y

localrr=20--设置递增半径

locall=10--设置点间距

localp=0--初始化角度

localr=30--设置首圈半径

localrn=10--设置圈数

touchDown(x0,y0)

mSleep(100)

forvar=1,rndo

whilep

x=x0+r *math.cos(p)

y=y0-r *math.sin(p)

touchMove(x,y)

mSleep(10)

p=p+l/r

end

p=0

r=r+rr

end

touchUp(x0,y0)

多点模糊比色

在实际游戏脚本制作中,很多界面单靠1个点不容易进行准确的判断,这里封装一个配合TABLE使用的多点模糊比色函数来实现精确判断:

function multiColor(array,s)

s = math.floor(0xff*(100-s)*0.01)

keepScreen(true)

for var = 1, #array do

local lr,lg,lb = getColorRGB(array[var][1],array[var][2])

local r = math.floor(array[var][3]/0x10000)

local g = math.floor(array[var][3]%0x10000/0x100)

local b = math.floor(array[var][3]%0x100)

if math.abs(lr-r) > s or math.abs(lg-g) > s or math.abs(lb-b) > s then

keepScreen(false)

return false

end

end

keepScreen(false)

return true

end

--用法

g_t_Table = {

{ 1962, 52, 0xefdccf},

{ 2150, 50, 0xefd8d0},

{ 1964, 76, 0xe9d1c5},

{ 2152, 74, 0xefdcd1},

{ 2122, 62, 0xf1ddd1},

{ 2146, 1080, 0x893824},

{ 1840, 1082, 0x593724},

}

if multiColor(g_t_Table,90) then

touchDown(100,100)

mSleep(50)

touchUp(100,100)

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

functionmultiColor(array,s)

s=math.floor(0xff*(100-s)*0.01)

keepScreen(true)

forvar=1,#array do

locallr,lg,lb=getColorRGB(array[var][1],array[var][2])

localr=math.floor(array[var][3]/0x10000)

localg=math.floor(array[var][3]%0x10000/0x100)

localb=math.floor(array[var][3]%0x100)

ifmath.abs(lr-r)>sormath.abs(lg-g)>sormath.abs(lb-b)>sthen

keepScreen(false)

returnfalse

end

end

keepScreen(false)

returntrue

end

--用法

g_t_Table={

{1962,52,0xefdccf},

{2150,50,0xefd8d0},

{1964,76,0xe9d1c5},

{2152,74,0xefdcd1},

{2122,62,0xf1ddd1},

{2146,1080,0x893824},

{1840,1082,0x593724},

}

ifmultiColor(g_t_Table,90)then

touchDown(100,100)

mSleep(50)

touchUp(100,100)

end

参数 s 为模糊度,范围 0 - 100,一般使用90即可。

实例中的TABLE格式可使用触动精灵抓色器生成。

随机字符串

产生随机种子

由于lua中的随机函数产生的随机数是伪随机,我们需要设置一个随机种子来解决此问题

--改进方法

math.randomseed(tostring(os.time()):reverse():sub(1, 6)) -- 随机种子

dialog(math.random())

--进阶方法,需加载扩展库中的socket模块

local ts = require("ts")

local function get_seed()

local t = string.format("%f", socket.gettime())

local st = string.sub(t, string.find(t, "%.") + 1, -1)

return tonumber(string.reverse(st))

end

math.randomseed(get_seed())

for var = 1,5 do

dialog(math.random())

end

1

2

3

4

5

6

7

8

9

10

11

12

13

14

--改进方法

math.randomseed(tostring(os.time()):reverse():sub(1,6))--随机种子

dialog(math.random())

--进阶方法,需加载扩展库中的socket模块

localts=require("ts")

localfunctionget_seed()

localt=string.format("%f",socket.gettime())

localst=string.sub(t,string.find(t,"%.")+1,-1)

returntonumber(string.reverse(st))

end

math.randomseed(get_seed())

forvar=1,5do

dialog(math.random())

end

自定义字符串随机

function randomStr(str, num)

local ret =''

for i = 1, num do

local rchr = math.random(1, string.len(str))

ret = ret .. string.sub(str, rchr, rchr)

end

return ret

end

--用法

math.randomseed(tonumber(tostring(os.time()):reverse():sub(1,6))) --设置随机种子

for var = 1,5 do

s = randomStr("abcdefghijklmnopqrstuvwxyz", 6) --生成6位随机字母

nLog(s)

end

1

2

3

4

5

6

7

8

9

10

11

12

13

14

functionrandomStr(str,num)

localret=''

fori=1,numdo

localrchr=math.random(1,string.len(str))

ret=ret..string.sub(str,rchr,rchr)

end

returnret

end

--用法

math.randomseed(tonumber(tostring(os.time()):reverse():sub(1,6)))--设置随机种子

forvar=1,5do

s=randomStr("abcdefghijklmnopqrstuvwxyz",6)--生成6位随机字母

nLog(s)

end

随机大小写字母

function rndLetter(num)

local ret = ""

pcall(function()

for var = 1,num do

if math.random()>0.5 then

ret = ret..string.char(math.random(65,90))

else

ret = ret..string.char(math.random(97,122))

end

end

end)

return ret

end

--用法

math.randomseed(tonumber(tostring(os.time()):reverse():sub(1,6))) --设置随机种子

for var = 1,5 do

nLog(rndLetter(10)) --生成一个10位随机大小写字母的字符串

end

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

functionrndLetter(num)

localret=""

pcall(function()

forvar=1,numdo

ifmath.random()>0.5then

ret=ret..string.char(math.random(65,90))

else

ret=ret..string.char(math.random(97,122))

end

end

end)

returnret

end

--用法

math.randomseed(tonumber(tostring(os.time()):reverse():sub(1,6)))--设置随机种子

forvar=1,5do

nLog(rndLetter(10))--生成一个10位随机大小写字母的字符串

end

日期与时间

获取今天是星期几

local today = tonumber(os.date("%w",os.time()))

if today == 0 or today == 6 then --如果是周日或者周六

dialog(today, 0)

end

1

2

3

4

localtoday=tonumber(os.date("%w",os.time()))

iftoday==0ortoday==6then--如果是周日或者周六

dialog(today,0)

end

获取当前日期及时间

local nowTime = os.date("*t",os.time()) --返回一个table

dialog(nowTime.year, 0) --年

dialog(nowTime.month, 0) --月

dialog(nowTime.day, 0) --日

dialog(nowTime.hour, 0) --小时

dialog(nowTime.min, 0) --分钟

dialog(nowTime.sec, 0) --秒钟

dialog(nowTime.yday, 0) --显示当前为一年中的第几天

--时间戳格式化当前时间

local nowTime = os.date("%Y-%m-%d %H:%M:%S", os.time())

dialog(nowTime,0)

1

2

3

4

5

6

7

8

9

10

11

localnowTime=os.date("*t",os.time())--返回一个table

dialog(nowTime.year,0)--年

dialog(nowTime.month,0)--月

dialog(nowTime.day,0)--日

dialog(nowTime.hour,0)--小时

dialog(nowTime.min,0)--分钟

dialog(nowTime.sec,0)--秒钟

dialog(nowTime.yday,0)--显示当前为一年中的第几天

--时间戳格式化当前时间

localnowTime=os.date("%Y-%m-%d %H:%M:%S",os.time())

dialog(nowTime,0)

UI

一个包含所有控件的默认样式UI实例

local ts = require("ts")--写 showUI 前必须插入这一句

local json = ts.json--写 showUI 前必须插入这一句

w,h = getScreenSize();

MyTable = {

["style"] = "default",

["width"] = w,

["height"] = h,

["config"] = "save_01.dat",

["timer"] = 99,

["orient"] = 0,--需引擎版本 iOS v2.2.5以上版本支持,Android 暂不支持

["pagetype"] = "multi",--需引擎版本 iOS v2.2.5,Android v2.1.5 以上版本支持

["title"] = "触动精灵脚本配置",--需引擎版本 iOS v2.2.5,Android v1.2.4 以上版本支持

["cancelname"] = "取消",

["okname"] = "开始",

pages =

{

{

{

["type"] = "Label",

["text"] = "第一页设置",

["size"] = 25,

["align"] = "center",

["color"] = "0,0,0",

},

{

["type"] = "RadioGroup",

["list"] = "选项1,选项2,选项3,选项4,选项5,选项6,选项7",

["select"] = "1",

},

},{

{

["type"] = "Label",

["text"] = "第二页设置",

["size"] = 25,

["align"] = "center",

["color"] = "0,0,0",

},

{

["type"] = "Edit",

["prompt"] = "请输入一个字母",

["text"] = "默认值",

["kbtype"] = "ascii",

},

{

["type"] = "Edit",

["prompt"] = "请输入一个数字",

["text"] = "默认值",

["kbtype"] = "number",

},

},{

{

["type"] = "Label",

["text"] = "第三页设置",

["size"] = 25,

["align"] = "center",

["color"] = "0,0,0",

},

{

["type"] = "CheckBoxGroup",

["list"] = "选项1,选项2,选项3,选项4,选项5,选项6,选项7",

["select"] = "3@5",

},

{

["type"] = "ComboBox",

["list"] = "选项1,选项2,选项3",

["select"] = "1",

["data"] = "子选项1,子选项2,子选项3,子选项4#子选项5,子选项6,子选项7#子选项8,子选项9",

["source"] = "test"

},

{

["type"] = "ComboBox",

["select"] = "1",

["dataSource"] = "test"

},

}

}

}

local MyJsonString = json.encode(MyTable);

retTable = {showUI(MyJsonString)};

for var = 1,#retTable do

nLog(retTable[var]) --输出每一个返回值

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

79

80

81

82

localts=require("ts")--写showUI前必须插入这一句

localjson=ts.json--写showUI前必须插入这一句

w,h=getScreenSize();

MyTable={

["style"]="default",

["width"]=w,

["height"]=h,

["config"]="save_01.dat",

["timer"]=99,

["orient"]=0,--需引擎版本iOSv2.2.5以上版本支持,Android暂不支持

["pagetype"]="multi",--需引擎版本iOSv2.2.5,Androidv2.1.5以上版本支持

["title"]="触动精灵脚本配置",--需引擎版本iOSv2.2.5,Androidv1.2.4以上版本支持

["cancelname"]="取消",

["okname"]="开始",

pages=

{

{

{

["type"]="Label",

["text"]="第一页设置",

["size"]=25,

["align"]="center",

["color"]="0,0,0",

},

{

["type"]="RadioGroup",

["list"]="选项1,选项2,选项3,选项4,选项5,选项6,选项7",

["select"]="1",

},

},{

{

["type"]="Label",

["text"]="第二页设置",

["size"]=25,

["align"]="center",

["color"]="0,0,0",

},

{

["type"]="Edit",

["prompt"]="请输入一个字母",

["text"]="默认值",

["kbtype"]="ascii",

},

{

["type"]="Edit",

["prompt"]="请输入一个数字",

["text"]="默认值",

["kbtype"]="number",

},

},{

{

["type"]="Label",

["text"]="第三页设置",

["size"]=25,

["align"]="center",

["color"]="0,0,0",

},

{

["type"]="CheckBoxGroup",

["list"]="选项1,选项2,选项3,选项4,选项5,选项6,选项7",

["select"]="3@5",

},

{

["type"]="ComboBox",

["list"]="选项1,选项2,选项3",

["select"]="1",

["data"]="子选项1,子选项2,子选项3,子选项4#子选项5,子选项6,子选项7#子选项8,子选项9",

["source"]="test"

},

{

["type"]="ComboBox",

["select"]="1",

["dataSource"]="test"

},

}

}

}

localMyJsonString=json.encode(MyTable);

retTable={showUI(MyJsonString)};

forvar=1,#retTable do

nLog(retTable[var])--输出每一个返回值

end

以上实例中使用了两个 ComboBox 控件,并在两个 ComboBox 控件之间建立了数据关联,此控件属性需引擎版本 iOS v2.1.8,Android v1.1.0 以上支持。

以上实例中的 title 属性需引擎版本 iOS v2.2.5,Android v1.2.4 以上版本支持。

以上实例中的 pagetype 属性需引擎版本 iOS v2.2.5,Android v2.1.5 以上版本支持。

以上实例中的 orient 属性需引擎版本 iOS v2.2.5以上版本支持,Android 暂不支持。

以上实例中最后对于 showUI 的调用将返回一个table。

企业版

注入中控器简单的发账号示例

--[[

简单的发账号示例

script/account.txt内保存账号密码

--]]

local ok,account = telib:controller_injection(

[[

local f = io.open("script/account.txt", "r")

if f then

local account_tab = {}

local account = f:read()

while account do

table.insert(account_tab,account)

account = f:read()

end

f:close()

if #account_tab > 0 then

local f = io.open("script/account.txt", "w")

if f then

for i = 2,#account_tab do

f:write(account_tab[i].."\n")

end

f:close()

end

return account_tab[1]

else

return false

end

end

return false

]]

)

assert(ok,account)

if account then

nLog("获取账号:"..account)

toast("获取账号:"..account)

else

nLog("获取账号失败")

toast("获取账号失败")

end

mSleep(1000)

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

--[[

简单的发账号示例

script/account.txt内保存账号密码

--]]

localok,account=telib:controller_injection(

[[

localf=io.open("script/account.txt","r")

iffthen

localaccount_tab={}

localaccount=f:read()

whileaccountdo

table.insert(account_tab,account)

account=f:read()

end

f:close()

if#account_tab > 0 then

localf=io.open("script/account.txt","w")

iffthen

fori=2,#account_tab do

f:write(account_tab[i].."\n")

end

f:close()

end

returnaccount_tab[1]

else

returnfalse

end

end

returnfalse

]]

)

assert(ok,account)

ifaccountthen

nLog("获取账号:"..account)

toast("获取账号:"..account)

else

nLog("获取账号失败")

toast("获取账号失败")

end

mSleep(1000)

封装中控器读写函数

function writeEEFile(str,path,mode) --写入文件内容,路径,类型,默认路径企业版目录scriptData/playLog.text下,自定义路径请把\改为/。默认类型追加,覆盖第三个参数写"wb"

mode = mode or "a"

local telib = require("ts_enterprise_lib")

assert(telib,"无法引入企业专用库")

if path==nil then

local ok,msg = telib:controller_injection(

[[

require("lfs").mkdir("scriptData")

local f = io.open("scriptData/playLog.text","a")

if f then

f:write("]]..str..[[\r\n")

f:close()

end

]]

)

else

local ok,msg = telib:controller_injection(

[[

local f = io.open("]]..path..[[","]]..mode..[[")

if f then

f:write("]]..str..[[\r\n")

f:close()

end

]]

)

end

end

function findEEFile(path,tsType) --读取文件内容,读取方式(string或table)

path = path or "scriptData/playLog.text"

tsType = tsType or "string"

local telib = require("ts_enterprise_lib")

assert(telib,"无法引入企业专用库")

local ok,account

if tsType=="table" then

ok,account = telib:controller_injection(

[[

local f = io.open("]]..path..[[", "r")

if f then

local account_tab = {}

local account = f:read()

while account do

table.insert(account_tab,account)

account = f:read()

end

f:close()

return account_tab

end

return false

]]

)

else

ok,account = telib:controller_injection(

[[

local f = io.open("]]..path..[[", "r")

if f then

local account = f:read("*all")

f:close()

return account

end

return false

]]

)

end

return account

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

functionwriteEEFile(str,path,mode)--写入文件内容,路径,类型,默认路径企业版目录scriptData/playLog.text下,自定义路径请把\改为/。默认类型追加,覆盖第三个参数写"wb"

mode=modeor"a"

localtelib=require("ts_enterprise_lib")

assert(telib,"无法引入企业专用库")

ifpath==nilthen

localok,msg=telib:controller_injection(

[[

require("lfs").mkdir("scriptData")

localf=io.open("scriptData/playLog.text","a")

iffthen

f:write("]]..str..[[\r\n")

f:close()

end

]]

)

else

localok,msg=telib:controller_injection(

[[

localf=io.open("]]..path..[[","]]..mode..[[")

iffthen

f:write("]]..str..[[\r\n")

f:close()

end

]]

)

end

end

functionfindEEFile(path,tsType)--读取文件内容,读取方式(string或table)

path=pathor"scriptData/playLog.text"

tsType=tsTypeor"string"

localtelib=require("ts_enterprise_lib")

assert(telib,"无法引入企业专用库")

localok,account

iftsType=="table"then

ok,account=telib:controller_injection(

[[

localf=io.open("]]..path..[[","r")

iffthen

localaccount_tab={}

localaccount=f:read()

whileaccountdo

table.insert(account_tab,account)

account=f:read()

end

f:close()

returnaccount_tab

end

returnfalse

]]

)

else

ok,account=telib:controller_injection(

[[

localf=io.open("]]..path..[[","r")

iffthen

localaccount=f:read("*all")

f:close()

returnaccount

end

returnfalse

]]

)

end

returnaccount

end

android脚本精灵开发,触动精灵脚本开发示例代码相关推荐

  1. android avd 使用方法,触动精灵 Android 模拟器使用手册

    触动精灵 Android 模拟器使用手册 目录 模拟器推荐触动精灵安卓版现已支持多个主流模拟器(可在官网主页或安卓反馈群文件中下载) 目前适配比较好的模拟器是雷电模拟器.夜神模拟器.猩猩模拟器.MuM ...

  2. 怎样上android官方下载,【图文教程】如何安装 iOS/Android(安卓)触动精灵?

    iOS 注意事项 必须越狱. iOS12 及其以上系统只能安装专业版 arm64 版本客户端并且购买专业版授权,专业版授权和标准版授权不通用. iPhone 7 10 系统设备由于越狱问题无法使用触动 ...

  3. android自带下拉阻尼动画,Android实现简单的下拉阻尼效应示例代码

    OS的下拉上拉都会出现一个很玄的动态效果.在Android中,虽然可以实现类似的效果,但有点不同的是,如果调用overScrollBy来实现类似的阻尼效应的话,最顶部会出现一片亮的区域,让人感觉不是很 ...

  4. 触动精灵和按键精灵哪个好,如何用按键精灵ios触动精灵及脚本写自动答题脚本...

    答:都差不多,无非是键鼠图色功能,这些软件都具备!其它差异就看你对他们熟悉程序而选择了~~ 比如我经常用按键精灵 首选肯定是安卓按键! 答:不能! 答:只有越狱才有,越狱之后在Cydia搜索autot ...

  5. 触动精灵:触动精灵脚本编辑器

    1.编辑器的安装和使用 http://v.youku.com/v_show/id_XMTgwNzY3NzAwNA==.html https://www.zybuluo.com/miniknife/no ...

  6. 触动精灵 python,[触动精灵]零基础小白学触动5-8

    零基础小白学触动 - 05 - 触动常用函数 点击 滑动 原理 其实都可以分解成按下=> 等待一定时间或者移动动作=>  松开 ?如何实现精确滑动  https://zimaoxy.com ...

  7. [导入]Asp.net 2.0 自定义控件开发[实现自动计算功能(AutoComputeControl)][示例代码下载]...

    Asp.net 2.0 自定义控件开发[实现自动计算功能(AutoComputeControl)][重点推荐控件][示例代码下载] 文章来源:http://blog.csdn.net/chengkin ...

  8. Android中悬浮窗口的实现原理和示例代码

    用了我一个周末的时间,个中愤懑就不说了,就这个问题,我翻遍全球网络没有一篇像样的资料,现在将实现原理简单叙述如下:调用WindowManager,并设置WindowManager.LayoutPara ...

  9. 触动精灵 python_触动精灵远程Log模块

    一.功能 lua log方法能够自动发现同一网段下面的log服务器 lua log方法能够主动将log发给服务器 lua 客户端进程重启服务端不存在影响 二.实现 服务器使用python编写: 启动一 ...

  10. EasyNVR网页Chrome无插件播放摄像机视频功能二次开发之云台控制接口示例代码

    随着多媒体技术和网络通信技术的迅速发展,视频监控技术在电力系统.电信行业.工业监控.工地.城市交通.水利系统.社区安防等领域得到越来越广泛的应用.摄像头直播视频监控通过网络直接连接,可达到的世界任何角 ...

最新文章

  1. Xamarin.FormsShell基础教程(8)Shell的模版构成
  2. 网络营销——网络营销浅析网站不发文还能维持稳定排名吗?
  3. 神经网络-预测财产损失
  4. 算法解读--递归(二)
  5. JavaScript中使Promise模式进行异步编程
  6. 用DataGrip生成导出整个库数据的方法
  7. flink 本地_Flink 01 | 十分钟搭建第一个Flink应用和本地集群
  8. 为什么要搭建数据平台
  9. 使用Python PyQt5实现一个简单的图像识别软件
  10. 数字电路基础知识(二)
  11. 【观察】Hitachi Vantara:高端存储再“升级”,数字化转型再“升维”
  12. [模拟]JZOJ 2499 东风谷早苗
  13. Mac -- 插入移动硬盘后没有显示
  14. RAM 与 ROM, CPU 与 GPU ,显卡与显存 区别以及关系等
  15. 浅浅总结一下HTML吧
  16. IT类实习/工作习惯心得
  17. V4L2视频采集与H264编码2—v4l2采集YUV数据
  18. 全球云服务商对比:阿里云,太贵了
  19. python 文件批量转换格式_使用python批量化音乐文件格式转换的实例
  20. 好分数阅卷3.0_好分数app下载-好分数网查成绩安卓版app v3.6.4.1-清风安卓软件网...

热门文章

  1. CQI的解释(完整版)
  2. 《千与千寻》细节解读
  3. iOS系列UI篇——UIDatePicker和UIPickerView
  4. mysql 标识列是什么,mysql中标识列是什么意思有什么用
  5. Java @Min(0)的意义
  6. 微生活完成3200万元A轮融资,助企业快速搭建移动互联CRM
  7. unbalanced enable irq
  8. [转]2009年河南省高考零分作文:兔子,你就是一个傻B
  9. 使用 JW Player 播放RTMP 流
  10. 20210725:FLAC刻录音乐CD教程02-ape刻盘