【心得】【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?variant=zh-tw
返回頂部