找回密码
 注册
X系列官方授权正版
搜索
查看: 2362|回复: 4

[原创] [教程]玩转游戏---制定你自己的游戏规则(中级篇)

[复制链接]
发表于 2008-2-15 21:55:07 | 显示全部楼层 |阅读模式
玩转游戏---制定你自己的游戏规则(中级篇)

在初级篇的教程中,我们已经初步了解了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

评分

参与人数 1UCC +20 收起 理由
白衣 + 20 我认为此帖很有意义

查看全部评分

 楼主| 发表于 2008-2-15 21:55:20 | 显示全部楼层
将所有代码做一个汇总,就得到了我们今天的劳动成果:
             .
             .
             .
             .
GameSetupOptions = {
             .
             .
             .
             .
    {   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", }, },
}

             .
             .
             .
             .

RUInject = 0

function OnInit()
             .
             .
             .
    RUInject = GetGameSettingAsNumber("resource_Inject")
    if (RUInject ~= 0) then
        local RUInjectTime = GetGameSettingAsNumber("resource_time")
        Rule_AddInterval("rule_ResourceInjectAtTime", RUInjectTime)
    end
end
             .
             .
             .
function rule_ResourceInjectAtTime()
    local playerId = 0
    local playerCount = Universe_PlayerCount()
    while (playerId < playerCount) do
        if (Player_IsAlive(playerId) == 1) then
            Player_SetRU(playerId, Player_GetRU(playerId) + RUInject)
        end
        playerCount = playerCount + 1
    end
end

到此为止,一个完整的(选项的设置,取值,规则加载,实现规则逻辑)游戏规则逻辑就算完成了~~
最后,再给大家介绍个比较实用的东东.
在初级教程中.我们并没有看到有关游戏规则指定使用的地图目录.
因为"死亡竞赛"是游戏的默认规则,所以一些调用的部分都被包含在引擎之中了.其中就包括了使用地图目录的路径.
当我们不想使用在默认地图目录下的地图作为规则的使用地图时.可以使用以下的规则脚本属性来指定规则使用的地图目录.
(PS:书写位置在选项复合数组前,规则名称和描述之后.)
Directories = {
    Levels = "data:LevelData\\Multiplayer\\DeathMatch\\",
    ProfileLevels = "profiles:Levels\\DeathMatch\\",
}

评分

参与人数 1UCC +20 收起 理由
白衣 + 20 我认为此帖很有意义

查看全部评分

回复

使用道具 举报

发表于 2008-2-21 16:14:18 | 显示全部楼层
呵呵... 楼主从那儿挖来的?

把代码的颜色从黄色改竭色...
回复

使用道具 举报

 楼主| 发表于 2008-2-21 16:38:58 | 显示全部楼层
这是我自己的系列教程
俺是做HW2的mod的
回复

使用道具 举报

发表于 2008-2-21 17:25:31 | 显示全部楼层
多来坐坐,把HW炒热... 我有买原版的,HW2是好游戏,我当初玩的时候很感动的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|DeepTimes.NET 太空游戏站