泰坦帝国

 找回密码
 加入帝国

QQ登录

只需一步,快速开始

查看: 1181|回复: 2

[教程文章] [游戏规则]玩转游戏---制定你自己的游戏规则(初级篇)

[复制链接]
发表于 2009-8-16 20:32:58 | 显示全部楼层 |阅读模式
[游戏规则]玩转游戏---制定你自己的游戏规则(初级篇)

HW2的运行建立在引擎的基础上,通过调用模型和特效等来实现视觉的表现,而在这声鲜目绚之下.有N多不同类型的脚本在协调工作.
HW2的脚本分为许多种.我们要在这讲的是:游戏规则脚本
每当我们开始一场激烈的对战.每当我们重反那峥嵘的岁月.我们的游戏规则脚本.一直不停的为我们服务着~~~~

恩~废话就不多讲了......我们使用原版的"死亡竞赛"进行初级的讲解.
首先,我们需要了解"游戏规则脚本"(以下简称"规则脚本")到底在干什么.当我们开是一场简单的对战的时候.奇迹便应酝而生了.
进入"人机对战".此时,规则脚本已经被部分加载了,首先可以看到的就是游戏规则的名称

GameRulesName = "$3203"
Description = "$3230"

脚本文件最初的这两行,说明了游戏规则的显示名称(GameRulesName)和规则的帮助文本(Description).

接着是一些选项,这些选项都是由一个复合数组生成的:

GameSetupOptions =
{
    {
        name = "resources",
        locName = "$3240",
        tooltip = "$3239",
        default = 1,
        visible = 1,
        choices = { "$3241", "0.5", "$3242", "1.0", "$3243", "2.0", }, },
    {
        name = "unitcaps",
        locName = "$3214",
        tooltip = "$3234",
        default = 1,
        visible = 1,
        choices = { "$3215", "Small", "$3216", "Normal", "$3217", "Large", }, },
                            .
                            .
                            .
                            .
                            .
                            .
}

现在,让我们来仔细的观察一下这个数组~~
我们可以看到,每个元素都由name,locName,tooltip,default,visible,choices这几个属性组成
name属性,标识了当前元素在游戏中的可调用名称(和下一篇中级教程有着莫大的关系!!)
locName属性,显示的文本了...没啥好说的.
tooltip属性,帮助文本,鼠标悬停时在左下显示的帮助信息.
default属性,默认选中的项目,和下面的choices元素有关.注意!默认选中第一个的话是0.按照C语言的习惯.
visible属性,是否可见......我想没人会把这个设为0吧..........
choices元素,啊~~这里嵌套了一个数组,
首先我们看到了choices数组是这么一串东东:{ "$3215", "Small", "$3216", "Normal", "$3217", "Large", }
第一个属性是首个选项的显示文本,第二个属性是相对应的标识名称(调用名),以此类推......
当然,也可以有N个选项~(将在下一篇中级教程中介绍)
同时...choices数组中的属性值一定要按格式成对出现,切记切记......

这时...我们会看到一串奇怪的东东......
dofilepath("data:scripts/scar/restrict.lua")这是个外部文件引用.目标文件是个初始化信息文件.有兴趣的朋友可以去看看.此文件不在本教程论述之内.无视了~~

到这里为止,规则脚本在游戏还没真正开始前被加载的部分就结束了.
接着,让我们开始一场对战吧~~("开始游戏"我点~~)

等待进度条蠕动的时候可别闲着,我们的规则脚本可正在运行ing~~
让我们的目光跳过Events列表
直接瞄向OnInit函数

function OnInit()
    MPRestrict()
    Rule_Add("MainRule")
end

咳咳...你说啥?这单词啥意思?......是人都知道此君叫"初始化"......
这个函数的作用就是初始化我们的游戏规则,让游戏真正运行的时候规则也能够伴随左右.
"死亡竞赛"的OnInit函数很简单,只有2个东东:

1.调用函数MPRestrict()...(我上瞄下瞄左瞄右瞄...就是没瞄到有叫MPRestrict()的东东...)
  别瞄了...这个函数在刚才dofilepath引用的目标文件里......

2.Rule_Add("MainRule")!!这才是今天我们的主角~~
  Rule_Add()函数~就是传说中的"添加一个规则".这个函数一经运行.其中添加的规则就将会不段往复往复再往复的执行.
  为了怕大家在游戏时出现意外,我们还会请这个规则往复往复再往复的执行,但是!首先,我们有请这个函数的二大爷的三舅妈的外甥的邻居的小姑父上台来为大家说明这个函数被发现的过程......
(作者...已埋在一堆烂桃子和烂香蕉中......)
  同时,由于Rule_Add()函数有一定的弊端,所以不建议大家使用他(啊~~本内容不在初级教程论述范围内~~跳过跳过~)

通过上面Rule_Add()的调用,规则MainRule就被加载了(规则同样是函数,当被正常调用时只执行一次,当被视做规则被加载时,就会按照规则的运行模式不断运行).

MainRule从字面上看就是主规则.玩家的生杀大权就掌握在MainRule函数的手上(其中的语法就不多阐述了).MainRule执行的内容主要分三部

分.

1.
    local playerIndex = 0
    local playerCount = Universe_PlayerCount()
    while  playerIndex<playerCount do
        if  Player_IsAlive(playerIndex)==1 then
            if  Player_HasShipWithBuildQueue(playerIndex)==0 then
                Player_Kill(playerIndex)
            end
        end
        playerIndex = (playerIndex + 1)
    end

2.
    local numAlive = 0
    local numEnemies = 0
    local gameOver = 1
    playerIndex = 0
    while  playerIndex<playerCount do
        if  Player_IsAlive(playerIndex)==1 then
            local otherPlayerIndex = 0
            while  otherPlayerIndex<playerCount do
                if  AreAllied(playerIndex, otherPlayerIndex)==0 then
                    if  Player_IsAlive(otherPlayerIndex)==1 then
                        gameOver = 0
                    else
                        numEnemies = (numEnemies + 1)
                    end
                end
                otherPlayerIndex = (otherPlayerIndex + 1)
            end
            numAlive = (numAlive + 1)
        end
        playerIndex = (playerIndex + 1)
    end
    if  numEnemies==0 and numAlive>0 then
        gameOver = 0
    end

3.
    if  gameOver==1 then
        Rule_Add("waitForEnd")
        Event_Start("endGame")
        Rule_Remove("MainRule")
    end

第一部分是做最基础的判定,检测玩家是否还拥有生产类船只,丧失所有生产类船只的玩家就会被直接剔除,第二部分是累计并判断现存玩家数量和敌对玩家数量
第三部分判断游戏是否结束,其中Rule_Add("waitForEnd"),在游戏结束时添加规则waitForEnd.然后调用Event_Start("endGame")执行事件,

事件endGame在上面的事件列表中定义.最后移除规则MainRule.
而此时waitForEnd规则还在执行,等待事件执行完毕,通过调用游戏内置函数setGameOver()结束游戏,最后移除规则waitForEnd.

整个对战过程结束~~
你是否也战胜了对手呢~~~

deathmatch.lua

3.17 KB, 下载次数: 38

发表于 2010-8-12 17:40:51 | 显示全部楼层
恩,,,领教了
发表于 2012-1-14 19:58:27 | 显示全部楼层
强,很强大,不过要怎么改呀?
您需要登录后才可以回帖 登录 | 加入帝国

本版积分规则

Archiver|手机版|小黑屋|泰坦帝国  

GMT+8, 2019-3-26 06:38 , Processed in 0.087530 second(s), 11 queries , Gzip On, Redis On.

Powered by Discuz! X3.2 Designed by 999test

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表