大家好,我是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.
2.
当要建立殭尸群,请先宣告 MONSTER:Group(data, count),这样就能使用自己的属性跟方法。
3.
当要获取殭尸群资讯时,请使用MONSTER.Group:GetData(),不要用MONSTER.Group.data,不然会出bug。
4.
因为大家的需求都不同,所以我就挑几个比较常用的函式,从只能使用在殭尸上的函式变为能在殭尸群中使用。
5.
请一定要定义MONSTER.DieLocate(并将死亡方块放在该座标中,藉此达到模拟死亡),不填会出错。
殭尸群使用範例:1.先定义殭尸资讯
2. 宣告两个殭尸群,他们都拥有自己的方法跟属性(图有错误,参数ss跟ww应改成data1, data2)
3.命令他们做动作,例如重生第一批殭尸
大约如此。
重生殭尸步骤解析:1. 将自己的殭尸资讯存在monster.user
2. 殭尸死亡
3. 用victim.user重新生出一模一样的殭尸
这样就能达到重生概念。
心得物件导向程式设计真的有难度,尤其是对我这种初次採用物件写法的萌新来说更加困难,因此如果有更好的写法请欢迎一起讨论,让我们一起创造完美的写法。(这次说明得好烂......)
最后,偷偷的透露一下自己作了满久的地图:碧蓝都市这张图结合了LUA跟用脑袋炸出仅剩的建筑能力,为什幺说透漏而不是预告呢?因为有可能会放弃(X