Play - 响应裁判指令¶
在之前的内容中,我们已经介绍了如何书写一个简单的
Play
。在本节中,我们将介绍如何配置Play
来响应裁判指令。
查看当前裁判信息¶
你可以在开启了Core
程序后,在裁判盒界面模拟任意裁判指令,在调试面板上你将看到由Core
程序输出的裁判指令。
面板的左上角显示了当前运行的脚本与状态,在中央的上部分显示了当前的裁判指令,其中第一行是lua层的裁判指令字符串,第二行为c++层收到的裁判指令。接收的流程为,c++层接收到的裁判信息存在内存中,lua层在每次被调用时通过判断是否有新的裁判信息来决定脚本的跳转。如果需要依据裁判信息来进行判断,会根据上述的裁判指令字符串选取脚本并执行。
目前的所有指令为
指令 | 说明 | 编号 | Protobuf |
---|---|---|---|
| 比赛停止 | 0 |
|
| 比赛暂停 | 1 |
|
| 我方暂停 | 12或13 |
|
| 对方间接任意球 | 10或11 |
|
| 我方间接任意球 | 10或11 |
|
| 对方开球 | 4或5 |
|
| 我方开球 | 4或5 |
|
| 对方自动放球 | 16或17 |
|
| 我方自动放球 | 16或17 |
|
| 对方点球 | 6或7 |
|
| 我方点球 | 6或7 |
|
提示
裁判指令到字符串的转换在Core
的VisionModule中完成,可以在VisionModule.cpp
的updateRefereeMsg
函数中查看。 裁判指令的编号以及对应的protobuf消息可以在ssl_referee.proto
中查看。
响应裁判指令¶
在之前Play
的创建时,我们提到了战术包的概念,为了响应裁判指令,我们依然可以在战术包中进行配置。我们在之前创建的my_tactic_2024
文件夹中使用Rocos
的模板文件创建一个PlayConfig.lua
的文件
# in Rocos root directory
mkdir -p Core/my_tactic_2024
cd Core/my_tactic_2024
cp ../tactic/PlayConfig.lua.template ./PlayConfig.lua
打开PlayConfig.lua
文件,将第二段注释中,针对gRefConfig
的部分取消注释。
1--[[
2- `GameHalt` : 比赛停止
3- `GameStop` : 比赛暂停
4- `OurTimeout` : 我方暂停
5- `TheirIndirectKick` : 对方间接任意球
6- `OurIndirectKick` : 我方间接任意球
7- `TheirKickOff` : 对方开球
8- `OurKickOff` : 我方开球
9- `TheirBallPlacement` : 对方自动放球
10- `OurBallPlacement` : 我方自动放球
11- `TheirPenaltyKick` : 对方点球
12- `OurPenaltyKick` : 我方点球
13- `NormalPlay` : 正常比赛
14]]
15
16---[[
17gRefConfig = {
18 GameHalt = "",
19 GameStop = "",
20 OurTimeout = "",
21 TheirIndirectKick = "",
22 OurIndirectKick = "",
23 TheirKickOff = "",
24 OurKickOff = "",
25 TheirBallPlacement = "",
26 OurBallPlacement = "",
27 TheirPenaltyKick = "",
28 OurPenaltyKick = "",
29 NormalPlay = "",
30}
31--]]
你可以对上面的table进行配置,当裁判指令到来时,Core
会根据gRefConfig
的配置来选择对应的Play
进行执行。 对于每一项指令的运行脚本,你可以选择以下任意一种类型:
-- 第一种:String类型,直接使用脚本名称
gRefConfig = {
GameHalt = "Halt_v1",
...
}
-- 第二种:Table类型,框架会在每次选择时随机选择一个脚本
gRefConfig = {
...
OurKickOff = {"KickOff_v1", "KickOff_v2"},
...
}
-- 第三种:Function类型,返回类型为String或Table,框架会在每次选择时调用该函数,例如模拟旧版Rocos的定位球分区
gRefConfig = {
...
OurIndirectKick = function()
if ball.posX() > 0 then
return {"FrontKick_v1","FrontKick_v2"}
else
return "BackKick_v1"
end
end,
...
}
配置的脚本名称可以是Rocos自带或任意战术包的任意Play,至此组成了一个Tactic的完整配置。如果有多个战术包中存在PlayConfig.lua
文件,则可以在Client
中启动Core
之前进行选择,同时记得勾选USE
启用战术包。