- UID
- 9701
- UCC
-
- 声望
-
- 好评
-
- 贡献
-
- 最后登录
- 1970-1-1
|
玩转游戏---制定你自己的游戏规则(中级篇)
在初级篇的教程中,我们已经初步了解了HW2游戏规则脚本的基本结构和运行机制.
现在,我们就要开始完成第一个完整逻辑的游戏规则了.
我们使用FX MOD的"<<家园>>模式"中的资金注入的原理来讲解.
首先,我们需要两个下拉选项.来选择注入资金的数量和间隔时间.
造型如下:
选项1
注入资金 关闭
低(1000)
中(5000)
高(10000)
极高(50000)
选项2
间隔时间 短(30s)
中(1m)
长(5m)
极长(30m)
设计好造型后,我们就可以开始书写相关的脚本代码了.
找到生成选项的复合数组,选择选项放置的位置(随个人喜好),然后开始编辑选项.
还记得我们在初级教程中介绍的选项的基本属性吧.我们按照标准格式完成代码.
{
name = "resource_Inject",
--选项的调用名,我们将在下面的代码中根据这个调用名得到所选择项目的值.必须是唯一标识,千万别和其他选项起重复了!
locName = "注入资金",
--显示文本,这里就不把文本关联到文字包中了.省事......
tooltip = "在游戏特定时间注入资金的数量",
--帮助文本,同上.
default = 0,
--我们让下拉选项默认选中第一个选项"关闭".
visible = 1,
--设置为可见...不可见我们写这个选项干什么...-_-
choices = {
"关闭", "0",
"低(1000)", "1000",
"中(5000)", "5000",
"高(10000)", "10000",
"极高(50000)", "50000", }, --选项列表,书写规则请查看初级教程.
},
{
name = "resource_time",
locName = "间隔时间",
tooltip = "注入资金的间隔时间",
default = 3,
visible = 1,
choices = { "短(30s)", "30", "中(1m)", "60", "长(5m)", "300", "极长(30m)" , "1800" ,}, },
(PS:注意放的位置啊...可别放到复合数组的外面了......)
到此为止,所有表面的工作就完成了.此时我们进入游戏后就能看到并选择这两个选项了.
但是...很明显,即使我们选中了选项,进入游戏也不会有任何变化.
所以,我们就要实现选项和规则逻辑相关联的代码.
还记得我们在初级教程中讲到的OnInit()函数吧.这个函数在初始化游戏时调用.所有初始化的工作都在这里完成.
同样,我们也要在初始化的时候得到先前选项所选中的项目.我们使用HW2内置函数GetGameSettingAsNumber(<sName>)来取得先前选项的选择.
不过在做这步之前,我们还要预先分析.所取到的值是只在初始化时使用一次,还是需要供给规则函数在运行中不断的访问.
显然,注入资金的数量需要供给规则函数在运行时访问.而间隔时间只需要在初始化时设置规则运行的间隔时间.
所以我们需要一个当前规则脚本的全局变量和一个OnInit()函数的局部变量.
我们在OnInit()函数的上方,Events列表(事件列表)的下方定义我们所需的全局变量:
RUInject = 0 --定义同时初始化为0,因为LUA是弱数据类型,建议在申明变量的同时给变量赋值以确定数据类型.
现在我们就可以开始取得选项选择的值了
代码如下:
RUInject = GetGameSettingAsNumber("resource_Inject") --给刚才申明的变量赋值.
local RUTime = GetGameSettingAsNumber("resource_time") --申明局部变量并取选项的选择值赋值.
这样我们就把两个选项所选中的项目的值得到并赋给了变量.(注意!得到的值是下拉列表项参数对的第二个参数的值!详情请参看初级教程.)
(好~素材都齐全了~~我们要开始烧菜了~~~先把牛肉洗净......作者......被飞来的菜刀砍倒在地......-_-)
现在开始,才真正开始实现我们的规则逻辑.依然是在OnInit()函数中编写.紧接着刚才的取值.
首先,需要判断注入资金的值,因为我们在设计时设置了选项"关闭",这就意味着如果选择了"关闭",那就不需要执行注入规则了.
(啊~太好了~大家都选"关闭"吧~我们的中级教程也可以到此结束了~~...作者...又一次被砍倒......-_-)
if (RUInject ~= 0) then
代码块_1
end
这样就判断了资金注入的选项,排除了"取消"选项,选择"取消"时就什么都不干了.
(PS:如果还想节省些运行时资源的消耗的话,还可以将局部变量在if...end判断中申明并赋值.)
当选择了非"取消"选项时,就执行代码块_1.
现在让我们回想下初级教程的内容.任何规则都是函数,然后通过内置函数Rule_Add(<ruleName>)将函数加载为规则.
但是在这里,Rule_Add(<ruleName>)函数显然不能满足我们的需要.
我们使用另外一个HW2内置函数Rule_AddInterval(<sRuleName>, <iSeconds>)来加载规则.
此函数加载名为<sRuleName>的函数为规则,并设置规则每<iSeconds>秒执行一次.
(PS:还记得在初级教程中所说不建议大家使用Rule_Add(<ruleName>)函数加载规则吧,据不精确测试,Rule_Add(<ruleName>)函数所加载的规则每秒至少执行10次...基本属于浪费资源...-_-...所以在非必要时尽量不要使用Rule_Add(<ruleName>)函数来加载规则!)
现在,我们来实现代码块_1部分.
首先假设资金注入的规则函数名为:"rule_ResourceInjectAtTime"
加载规则:
Rule_AddInterval("rule_ResourceInjectAtTime", RUTime)
这样,规则就按照我们设想的方式加载了.
规则被顺利加载后,我们就需要实现规则的逻辑了.
在OnInit()函数之下找个位置(建议在脚本的最后).定义我们需要的规则函数:
function rule_ResourceInjectAtTime() --这个函数是规则,所以无法设定参数.我们将参数列表至空.
代码块_2
end
函数也被正确定义了,开始实现规则逻辑代码块_2.
我们的逻辑很简单,就是依次增加所有玩家的RU.
代码如下:
local playerId = 0
--循环记数器,从第一个玩家开始(第一个玩家的编号为0).
local playerCount = Universe_PlayerCount()
--使用HW2内置函数Universe_PlayerCount()得到玩家总数.
while (playerId < playerCount) do
if (Player_IsAlive(playerId) == 1) then
--使用HW2内置函数Player_IsAlive(<iId>)判断当前玩家是否还存在(被KO的玩家就不需要给钱了...).
Player_SetRU(playerId, Player_GetRU(playerId) + RUInject)
--使用HW2内置函数Player_GetRU(<iId>),Player_SetRU(<iId>, <iResources>)来进行我们邪恶的洗钱活动...-_-
end
playerCount = playerCount + 1
end |
评分
-
查看全部评分
|