第六章第三节Lua脚本demo

Posted iLoboke

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第六章第三节Lua脚本demo相关的知识,希望对你有一定的参考价值。




Lua脚本的demo解析及调试问题


>>拿球射门战术实例代码解析

第一步:拿球(“GetBall”)

1)助攻任务:让中场足球机器人去拿球,小球可以是场上任意位置

Receiver   = task.GetBall("Receiver","Receiver")

--Receiver为中场角色名

--GetBall("Receiver","Receiver")为指定“Receiver”角色朝向球门拿球,

--GetBall   函数说明详见6.1.7(本章不附说明)


2射手任务:前锋去接球点,接球点的位置是按照场上球的位置做相应逻辑获得的

Kicker   = task.GoRecePos("Kicker")

--Kicker为中场角色名

--GoRecePos为指定“Kicker”角色去接球点

--GoRecePos   函数说明详见6.1.9(本章不附说明)

   

 3跳转条件:当接球者离球的距离小于30mm时,状态跳转到第二步”PassBall”

if CBall2RoleDist("Receiver") <   30 then

         return   "PassBall"

End

--CBall2RoleDist(“Receiver”)函数返回“Receiver”到球的距离

--CBall2RoleDist 函数说明详见6.2.1.4(本章不附说明)


>>第二步:传球(“PassBall”)

1)助攻任务:让中场足球机器人传球给前锋

Receiver   = task.PassBall("Receiver","Kicker")

--Receiver为传球角色名

--Kicker为接球角色名

--PassBll   函数说明详见6.1.12(本章不附说明)

   

2)射手任务:前锋去接球点,接球点的位置是按照场上球的位置做相应逻辑获得的

Kicker   = task.GoRecePos("Kicker")

--Kicker为中场角色名

--GoRecePos为指定“Kicker”角色去接球点

--GoRecePos   函数说明详见6.1.9(本章不附说明)

    

3)跳转条件:当传球者将球踢出,状态跳转到第三步”Shoot”

                   if   CIsBallKick("Receiver") then

                            return   "Shoot"

                   end

--CIsBallKick(“Receiver”)函数返回”Receiver”是否将球踢出的判断

--CIsBallKick函数说明详见6.2.1.10(本章不附说明)

   

>>第三步:射门(”Shoot”)


1)助攻任务:中场球员进入防守任务

Receiver   = task.RefDef("Receiver")

--Receiver为防守角色名

--RefDef函数说明详见6.1.16(本章不附说明)

   

 2)射手任务:前锋射门

Kicker   = task.Shoot("Kicker")

--Kicker为射门角色名

--Shoot   函数说明详见6.1.15(本章不附说明)

   

 3)跳转条件:当射门者将球踢出,状态结束

         if   CIsBallKick("Kicker") then

                   return   "finish"

         End

--CIsBallKick(“Kicker”)函数返回”Kicker”是否将球踢出的判断

--CIsBallKick函数说明详见6.2.1.10(本章不附说明)


拿球射门战术实例完整代码


示例战术脚本名为Ref_passAndShoot.lua

gPlayTable.CreatePlay{

firstState = "GetBall",   --起始状态拿球“GetBall”

--“GetBall”拿球状态

["GetBall"] = {   

         switch =   function()

                   if   CBall2RoleDist("Receiver") < 30 then --判断“Receiver”离球距离是否小于30

                            return   "PassBall"

                   end

         end,

         Kicker   = task.GoRecePos("Kicker"), --“Kicker”前锋跑到接球点

         Receiver =   task.GetBall("Receiver","Receiver"), --“Receiver”中场去拿球

         Goalie   = task.Goalie() --“Goalie”守门员守门

},

--“PassBall”传球状态

["PassBall"] = {

         switch =   function()

                   if   CIsBallKick("Receiver") then --判断“Receiver”中场是否踢球

                            return   "Shoot"

                   end

         end,

         Kicker   = task.GoRecePos("Kicker"),

         Receiver =   task.PassBall("Receiver","Kicker"), --“Receiver”中场传球

         Goalie   = task.Goalie()

},

--“Shoot”射门状态

["Shoot"] = {

         switch =   function()

                   if   CIsBallKick("Kicker") then --判断“Kicker”前锋是否踢球

                            return   "finish"

                   end

         end,

         Kicker =   task.Shoot("Kicker"), --“Kicker”前锋射门

         Receiver =   task.RefDef("Receiver"), --“Receiver”中场防守

         Goalie =   task.Goalie()

},

 

name = "Ref_passAndShoot"  --脚本名称

}


Lua的调试操作比较简单,在《机器人控制软件》中第4章节,我们有了解到如何使用SOM3.x软件的“测试模式”执行单个lua脚本程序。执行操作中,我们需要注意的是,选择正确的脚本类型。如果是“Ref_BackKick.lua”,就选择“后场任意球”战术类型。在模拟调试过程中,可以将对方球员拖入到场地实现效果。

建议在lua脚本调试中,先模拟后实地。修改调整lua脚本程序,直到满足设计需求后,再转为正式脚本。


以上是关于第六章第三节Lua脚本demo的主要内容,如果未能解决你的问题,请参考以下文章

软件构造第六章第三节 面向可维护的构造技术

第六章第二节Lua脚本框架

第六章第一节Lua编程基础

第六章第八节Lua及C++函数

《新下级学》第六章第三第四节

《新下级学》第六章第三第四节