方块管理(二)
LUA实例应用:方块管理(二)
本课将会继续学习方块管理接口的相关知识。首先,我们会学习设置方块属性的接口,利用这个接口,我们可以设置某种类型的方块不能被破坏。我们还会编写自动放置电路方块的脚本,利用开关的自动控制机制,制作一个脚本电梯
视频时间节点:
- 方块属性设置:08:47
- 方块应用:10:58
- 开关自动控制:22:33
老师介绍:
脚本电梯
now_floor = 1
--用漂浮文字不断显示楼层
local function Game_RunTime(event)
if (event.second % 1 == 0)
then
local result, x, y, z = Actor:getPosition(0)
local result = Graphics:makeflotageText("#R第"..tostring(math.floor((y - 6) / 7 + 1)).."层", 100, 1)
local result = Graphics:createflotageTextByPos(x, y, z, result)
end
end
-- 玩家发送聊天消息时运行
local function Player_NewInputContent(event)
local _, _, end_floor = string.find(event.content, "我要去(%d+)楼")
end_floor = tonumber(end_floor)
--现在的楼层等于要去的楼层
if(now_floor == end_floor)
then
Chat:sendSystemMsg("你已经在"..tostring(end_floor).."楼")
--现在的楼层小于要去的楼层
elseif(now_floor < end_floor)
then
--清除电梯和楼层的连接
Block:destroyBlock(-40,now_floor*7,203,false)
Block:destroyBlock(-41,now_floor*7,203,false)
Block:destroyBlock(-42,now_floor*7,203,false)
--电梯低于目的地时,持续上升
while(now_floor < end_floor)
do
--柱子
for y = now_floor*7+1, now_floor*7+6
do
Block:destroyBlock(-39,y,201,false)
Block:placeBlock(1123, -39, y, 201,0)
end
--标记器负极
Block:destroyBlock(-39,now_floor*7+7,201,false)
Block:placeBlock(1004, -39, now_floor*7+7, 201,0)
--滑动方块
Block:destroyBlock(-38,now_floor*7+7,201,false)
Block:placeBlock(1008, -38, now_floor*7+7, 201,0)
--开关
Block:destroyBlock(-37,now_floor*7+7,201,false)
Block:placeBlock(724, -37, now_floor*7+7, 201,0)
Block:setBlockSwitchStatus({x=-37,y=now_floor*7+7,z=201},true)
--等待电梯停稳
local is_run = true
while(is_run)
do
local result,id=Block:getBlockID(-41,now_floor*7+7,201)
if(result == 1001)
then
Chat:sendSystemMsg("获取方块id失败")
end
if(id == 1123)
then
is_run = false
end
threadpool:wait(0.1)
end
threadpool:wait(0.8)
--清除开关
Block:destroyBlock(-37,now_floor*7+7,201,false)
--清除滑动方块
Block:destroyBlock(-38,now_floor*7+7,201,false)
--层数加一
now_floor = now_floor + 1
--清除柱子和标记器负极
for y = now_floor*7+1, now_floor*7+7
do
Block:destroyBlock(-39,y,201,false)
end
end
--放置连接处
Block:placeBlock(1123, -40,now_floor*7,203,0)
Block:placeBlock(1123, -41,now_floor*7,203,0)
Block:placeBlock(1123, -42,now_floor*7,203,0)
--现在的楼层大于要去的楼层
elseif(now_floor > end_floor)
then
Block:destroyBlock(-40,now_floor*7,203,false)
Block:destroyBlock(-41,now_floor*7,203,false)
Block:destroyBlock(-42,now_floor*7,203,false)
while(now_floor > end_floor)
do
for y = now_floor*7-1, now_floor*7-6, -1
do
Block:destroyBlock(-39,y,201,false)
Block:placeBlock(1123, -39, y, 201,0)
end
Block:destroyBlock(-39,now_floor*7-7,201,false)
Block:placeBlock(1004, -39, now_floor*7-7, 201,0)
Block:destroyBlock(-38,now_floor*7-7,201,false)
Block:placeBlock(1008, -38, now_floor*7-7, 201,0)
Block:destroyBlock(-37,now_floor*7-7,201,false)
Block:placeBlock(724, -37, now_floor*7-7, 201,0)
Block:setBlockSwitchStatus({x=-37,y=now_floor*7-7,z=201},true)
local is_run = true
while(is_run)
do
local result,id=Block:getBlockID(-41,now_floor*7-7,201)
if(result == 1001)
then
Chat:sendSystemMsg("获取方块id失败")
end
if(id == 1123)
then
is_run = false
end
threadpool:wait(0.1)
end
threadpool:wait(0.8)
Block:destroyBlock(-37,now_floor*7-7,201,false)
Block:destroyBlock(-38,now_floor*7-7,201,false)
now_floor = now_floor - 1
for y = now_floor*7-1, now_floor*7-7, -1
do
Block:destroyBlock(-39,y,201,false)
end
end
Block:placeBlock(1123, -40,now_floor*7,203,0)
Block:placeBlock(1123, -41,now_floor*7,203,0)
Block:placeBlock(1123, -42,now_floor*7,203,0)
end
end
--注册游戏开始监听器
ScriptSupportEvent:registerEvent([=[Game.Start]=], Game_Start)
--注册游戏时间N秒监听器
ScriptSupportEvent:registerEvent([=[Game.RunTime]=],Game_RunTime)
-- 注册玩家发送聊天消息监听器
ScriptSupportEvent:registerEvent([=[Player.NewInputContent]=], Player_NewInputContent)