【心得】【LUA小成果】制作 LUA重生僵尸,僵尸群类别

大家好,我是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. 声明两个僵尸群,他们都拥有自己的方法跟属性
3.命令他们做动作,例如重生第一批僵尸
group1:ReSpawn()

大约如此。

重生僵尸步骤解析:

1. 将自己的僵尸信息存在monster.user
2. 僵尸死亡
3. 用victim.user重新生出一模一样的僵尸
这样就能达到重生概念。

心得

面向对象编程真的有难度,尤其是对我这种初次采用对象写法的萌新来说更加困难,因此如果有更好的写法请欢迎一起讨论,让我们一起创造完美的写法。(这次说明得好烂……)

最后,偷偷的透露一下自己作了满久的地图:碧蓝都市

这张图结合了LUA跟用脑袋炸出仅剩的建筑能力,为什么说透漏而不是预告呢?因为有可能会放弃(X
本文来自网络,不代表3楼猫立场,转载请注明出处:https://www.3loumao.org/169.html
返回顶部