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