您好,欢迎来到气泡游戏网!

气泡游戏网
手机应用中心 热门攻略 轩辕传奇 气泡问问 疾风之刃 枪神纪 天堂2M 救世者之树 上古世纪 黑色沙漠MOBILE 未来战 冒险岛M(楓之谷 M) 传说对决 瓦尔海姆 鬼谷八荒 怪物猎人系列

当前位置:首页 > 攻略库 > CS Online > 正文

《CS Online(反恐精英online)》【心得】【LUA小成果】製作 LUA重生殭尸,殭尸群类别

更新时间:1584370168   |   来源:巴哈姆特

yrgna1234 (misk) #1 2020-03-16 22:49:28
大家好,我是misk。
小弟我最近迷上了物件导向程式,所以自己也想写出一个实用的类别,因此,我利用Game.monster製作一个更方便的class。

game.lua (请务必将class内容複製于game.lua)
MONSTER = {
    DieLocate = {x = 0, y = 0, z = 0},
    -- 建立殭尸
    Create = function(data_)
        local monster = Game.Monster:Create (data_.type, data_.position)

        if monster == nil or data_ == nil then
            return
        end

        monster.health       = data_.health        or 200
        monster.damage       = data_.damage        or 5
        monster.speed        = data_.speed         or 1
        monster.coin         = data_.coin          or 0
        monster.viewDistance = data_.viewDistance  or 15
        monster.armor        = data_.armor         or 0

        if data_.FX ~= nil and data_.color ~= nil then
            monster:SetRenderFX (data_.FX)
            monster:SetRenderColor (data_.color)
        end
        if data_.hold ~= nil then
            monster:Hold(data_.hold)
        end

        monster.user = data_

        return monster
    end,

    Dying = function (self, monster)
        if monster:IsMonster() == false then
            return
        end
        if monster.user.count ~= 0 then
            if monster.user.count > 0 then
                monster.user.count = monster.user.count - 1
            end

            local m = self.Create(monster.user)
            if monster.user.group ~= nil then
                monster.user.group:Add(m)
            end
        end

        monster.user.group:Update()
    end,


    Group = function(self, data, count)

        obj = {
            member = {},
            data = data,
            count = count,
        }
        setmetatable(obj, {__index = self})

        -- 生成殭尸群
        function obj:ReSpawn()
            list = self:GetData()

            for i = 1, self.count do
                local m = self.Create(list)
                m.user.group = self

                table.insert(self.member, m)
            end
        end

        function obj:GetData()
            list = {}

            for i, j in pairs(self.data) do
                list[i] = j
            end

            return list
        end

        -- 杀死殭尸群,不限制有没有重生
        function obj:Clear()
            for i, j in pairs(self.member) do
                j.position  = self.DieLocate
            end
        end

        -- 杀死殭尸群,且强制不重生
        function obj:Delete()
            for i, j in pairs(self.member) do
                j.user.count  = 0
                j.position    = self.DieLocate
            end
        end

        -- 命令殭尸群攻击某玩家
        function obj:AttackPlayer(index)
            for i, j in pairs(self.member) do
                j:AttackPlayer (index)
            end
        end

        -- 命令殭尸群移动
        function obj:MoveTo (position)
            for i, j in pairs(self.member) do
                j:AttackTo (position)
            end
        end

        -- 更新member
        function obj:Update()
            for i, j in pairs(self.member) do
                if j.health <= 0 then
                    table.remove(self.member, i)
                end
            end
        end

        -- 增加名单
        function obj:Add(monster)
            table.insert(self.member, monster)
        end

        return obj
    end,
}

说明
Class MONSTER

Field (属性)
MONSTER.DieLocate-- 定义死亡位置 ( 必填 )
Methods (方法)
MONSTER.Create(data)-- 创建一只殭尸
MONSTER:Dying(monster)-- 当殭尸死亡时
MONSTER.Group(data, count)-- 建立一个殭尸群,继承MONSTER

Class MONSTER.Group
Field(属性)
MONSTER.Group.member     -- 殭尸群成员 (元素都是userdata)
Methods(方法)
MONSTER.Group:Spawn()-- 重生殭尸群
MONSTER.Group:Clear()-- 清除殭尸群,不限制不可再重生
MONSTER.Group:Delete()-- 清除殭尸群,限制不可再重生
MONSTER.Group:AttackPlayer(index)-- 命令殭尸群攻击某玩家
MONSTER.Group:MoveTo(position)-- 命令殭尸群移动到该座标
MONSTER.Group:Update()-- 更新MONSTER.Group.member
MONSTER.Group:Add(monster)-- 加入殭尸到此殭尸群中
MONSTER.Group:GetData()-- 获取当初输入的殭尸资讯

-- 参数範例
data = {
      position = {x = 10, y = 10, z = 0}, -- 殭尸位置
type = Game.MONSTERTYPE.NORMAL3, -- 殭尸种类
damage = 5, -- 伤害
   health = 200, -- 生命值
   speed = 1, -- 速度
   coin = 0, -- 死后金钱
   viewDistance = 10, -- 视野
   armor = 0, -- 护甲
   hold = false, -- 是否站着
  FX = Game.RENDERFX.GLOWSHELL, -- 特效
  color = {r = 255, g = 255, b = 0}, -- 特效颜色
   count = -1, -- 重生次数,填-1就是无限重生,不重生填0,想重生10次就填10
}
count (int)
index (int)
position (table)
monster (game.monster)

这边有太多东西了,无法一一介绍,因此我挑几个重点讲:
1.
请将 MONSTER:Dying(monster) 放入 Game.Rule:OnKilled (victim, killer)这样才能实现重生殭尸。

2.
当要建立殭尸群,请先宣告 MONSTER:Group(data, count),这样就能使用自己的属性跟方法。

3.
当要获取殭尸群资讯时,请使用MONSTER.Group:GetData(),不要用MONSTER.Group.data,不然会出bug。

4.
因为大家的需求都不同,所以我就挑几个比较常用的函式,从只能使用在殭尸上的函式变为能在殭尸群中使用。

5.
请一定要定义MONSTER.DieLocate(并将死亡方块放在该座标中,藉此达到模拟死亡),不填会出错。

殭尸群使用範例:
1.先定义殭尸资讯
2. 宣告两个殭尸群,他们都拥有自己的方法跟属性(图有错误,参数ss跟ww应改成data1, data2)
3.命令他们做动作,例如重生第一批殭尸
group1:ReSpawn()

大约如此。



重生殭尸步骤解析:
1. 将自己的殭尸资讯存在monster.user
2. 殭尸死亡
3. 用victim.user重新生出一模一样的殭尸
这样就能达到重生概念。


心得
物件导向程式设计真的有难度,尤其是对我这种初次採用物件写法的萌新来说更加困难,因此如果有更好的写法请欢迎一起讨论,让我们一起创造完美的写法。(这次说明得好烂......)

最后,偷偷的透露一下自己作了满久的地图:碧蓝都市
这张图结合了LUA跟用脑袋炸出仅剩的建筑能力,为什幺说透漏而不是预告呢?因为有可能会放弃(X

看较旧的 7 则留言

misk: 03-17 09:40

[a5936021:凋零] 觉得有帮助就好了~

乂大比去乂: 03-26 02:11

原来是lua小老师

精彩推荐

Wonderful recommendation

更多

关于我们 | 商务合作 | 广告服务 | 法律声明 | 内容导航 | 游戏帮助 | 问题反溃

本站所有软件,来自于互联网或网友上传,版权属原著所有,如有需要请购买正版。如有侵权,敬请来信联系我们,我们立刻删除。

抵制不良游戏 拒绝盗版游戏 注意自我保护 谨防受骗上当 适度游戏益脑 沉迷游戏伤身 合理安排时间 享受健康生活

Copyright 2019-2025 by 鲁ICP备2024066534号-1 成都市互联网举报中心