大家好,我是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