生物事件
LUA实例应用:生物事件
本课将会学习生物事件的相关知识。首先,通过生物进入和离开区域事件制作魔法阵效果,法杖发射法球后会在击中的地方生成对应的魔法阵,怪物进入魔法阵会获得对应的状态。另外,我们还会学习怪物特效的实现方法,并制作精英怪
视频时间节点:
- 08:51 魔法阵
- 27:46 怪物特效
- 29:53 精英怪
老师介绍:

魔法阵
area_size = 10
area_list = {}
-- 投掷物击中目标时运行
local function Actor_Projectile_Hit(event)
Chat:sendSystemMsg(event.itemid)
-- 普通法球
if(event.itemid == 11586)
then
World:playParticalEffect(event.x,event.y+1,event.z,1325,area_size*2)
local result,areaid = Area:createAreaRect({x=event.x, y=event.y+1, z=event.z}, {x=area_size/2,y=0,z=area_size/2})
if(result == 1001)
then
Chat:sendSystemMsg("创建普通区域失败")
end
area_list[#area_list + 1] = {area=areaid, area_type="普通"}
-- 火焰法球
elseif(event.itemid == 11587)
then
World:playParticalEffect(event.x,event.y+1,event.z,1327,area_size*2)
local result,areaid = Area:createAreaRect({x=event.x, y=event.y+1, z=event.z}, {x=area_size/2,y=0,z=area_size/2})
if(result == 1001)
then
Chat:sendSystemMsg("创建火焰区域失败")
end
area_list[#area_list + 1] = {area=areaid, area_type="火焰"}
-- 雷电法球
elseif(event.itemid == 11588)
then
World:playParticalEffect(event.x,event.y+1,event.z,1331,area_size*2)
local result,areaid = Area:createAreaRect({x=event.x, y=event.y+1, z=event.z}, {x=area_size/2,y=0,z=area_size/2})
if(result == 1001)
then
Chat:sendSystemMsg("创建雷电区域失败")
end
area_list[#area_list + 1] = {area=areaid, area_type="雷电"}
-- 淬毒法球
elseif(event.itemid == 11589)
then
World:playParticalEffect(event.x,event.y+1,event.z,1329,area_size*2)
local result,areaid = Area:createAreaRect({x=event.x, y=event.y+1, z=event.z}, {x=area_size/2,y=0,z=area_size/2})
if(result == 1001)
then
Chat:sendSystemMsg("创建淬毒区域失败")
end
area_list[#area_list + 1] = {area=areaid, area_type="淬毒"}
end
end
-- 生物进入区域时运行
local function Actor_AreaIn(event)
for k,v in pairs(area_list)
do
if(v.area == event.areaid)
then
if(v.area_type == "普通")
then
Actor:addBuff(event.eventobjid, 1000, 3, 0)
elseif(v.area_type == "火焰")
then
Actor:addBuff(event.eventobjid, 200, 2, 0)
elseif(v.area_type == "雷电")
then
Actor:addBuff(event.eventobjid, 230, 1, 0)
elseif(v.area_type == "淬毒")
then
Actor:addBuff(event.eventobjid, 34, 2, 0)
end
end
end
end
-- 生物离开区域时运行
local function Actor_AreaOut(event)
for k,v in pairs(area_list)
do
if(v.area == event.areaid)
then
if(v.area_type == "普通")
then
Actor:removeBuff(event.eventobjid, 1000)
elseif(v.area_type == "火焰")
then
Actor:removeBuff(event.eventobjid, 200)
elseif(v.area_type == "雷电")
then
Actor:removeBuff(event.eventobjid, 230)
elseif(v.area_type == "淬毒")
then
Actor:removeBuff(event.eventobjid, 34)
end
end
end
end
-- 生物攻击命中时运行
local function Actor_AttackHit(event)
local result,x,y,z = Actor:getPosition(event.toobjid)
if(result == 1001)
then
Chat:sendSystemMsg("获取攻击目标坐标失败")
end
World:playParticalEffect(x,y,z,1350,2)
end
-- 注册投掷物击中目标监听器
ScriptSupportEvent:registerEvent([=[Actor.Projectile.Hit]=], Actor_Projectile_Hit)
-- 注册生物进入区域监听器
ScriptSupportEvent:registerEvent([=[Actor.AreaIn]=], Actor_AreaIn)
-- 注册生物离开区域监听器
ScriptSupportEvent:registerEvent([=[Actor.AreaOut]=], Actor_AreaOut)
-- 注册生物攻击命中监听器
ScriptSupportEvent:registerEvent([=[Actor.AttackHit]=], Actor_AttackHit)
