播放系统
简述:
记录游戏场景中的命令,保存为文件;播放时加载文件并解析,生成命令流,由游戏进行播放;
小结:
花的时间主要在于 游戏命令的封装;播放文件的保存与加载播放;
每次执行命令后 游戏逻辑的运算结果需一致;
目前仅有重放,待拓展的有撤销(提供一个“相反”的命令) 和 重做 等,即维护一个命令的列表,从而控制游戏的流程;
代码应用:
--该条命令记录了将player对象移动至某点 每次生成命令都会写入文件
--MakeMove方法中 使用 WriteCommand() 将该命令写入到了 command.lua 文件中
--生成命令后 调用即可 command()
local command = MakeMove(self.player, cc.p(600, 700))
实现
-命令记录
--记录至commands.lua 文件 使用自定义Entry函数读取
local flie = nil
local str =
[[
Entry{
command = "%s",
target = "%s",
params = "%s",
time = %s,
}
]]
local function WriteCommand(target, command, params)
if MainScene.isplay then return end
flie = flie or io.open("G:/gamePro/game7/frameworks/src/app/scenes/commands.lua", "w")
target = target:getName()
if params then
params = params and params.getName and params:getName() or string.format("{x = %s, y = %s}", params.x, params.y)
end
flie:write(string.format(str, command, target, params, global_timer:GetLoseTime()))
end
-- 场景指令集
-- @命令模式 重放, 撤销, 重做
-- 游戏命令的封装,需要设计好对象的方法,保持足够的独立性,另一方面也便于测试;每个命令保存了需要操作的对象,以及所需的数据,最后是时间戳;
function MakeStand(target)
WriteCommand(target, "MakeStand")
return function () target:toStand() end
end
function MakeFire(target, enemy)
WriteCommand(target, "MakeFire", enemy)
return function () target:toAttck(enemy) end
end
function MakeMove(target, sign)
WriteCommand(target, "MakeMove", sign)
return function () target:toMove(sign) end
end
播放函数:
-- 播放系统
--播放命令
function MainScene:PlayCommands()
if not MainScene.isplay then return end
self.commands_ = {}
function Entry(t)
local func = _G[t.command](self[t.target], self[t.params] and self[t.params] or loadstring("return " .. t.params)())
table.insert(self.commands_, {func, t.time})
end
dofile("G:/gamePro/game7/frameworks/src/app/scenes/commands.lua")
for i,v in ipairs(self.commands_) do
global_timer:AddDelayRunTimer(v[1], v[2])
end
--播放完成后 继续记录操作
global_timer:AddDelayRunTimer(function ()
MainScene.isplay = false
end, self.commands_[#self.commands_][2] + 0.1)
end
最后是命令流文件commands.lua:
Entry{
command = "MakeFire",
target = "player",
params = "enemy",
time = 0.8,
}
Entry{
command = "MakeMove",
target = "player_sloider_1",
params = "{x = 430, y = 800}",
time = 0.8,
}
Entry{
command = "MakeFire",
target = "player",
params = "enemy",
time = 3.1,
}
Entry{
command = "MakeMove",
target = "player_sloider_2",
params = "{x = 430, y = 800}",
time = 3.1,
}
Entry{
command = "MakeFire",
target = "player",
params = "enemy",
time = 5,
}
Entry{
command = "MakeMove",
target = "player_sloider_3",
params = "{x = 430, y = 800}",
time = 5,
}
Entry{
command = "MakeFire",
target = "player",
params = "enemy",
time = 6.6,
}
Entry{
command = "MakeMove",
target = "player_sloider_4",
params = "{x = 430, y = 800}",
time = 6.6,
}
Entry{
command = "MakeFire",
target = "player",
params = "enemy",
time = 8.2,
}
Entry{
command = "MakeMove",
target = "player_sloider_5",
params = "{x = 430, y = 800}",
time = 8.2,
}
Entry{
command = "MakeFire",
target = "player",
params = "enemy",
time = 9.7,
}
Entry{
command = "MakeMove",
target = "player_sloider_6",
params = "{x = 430, y = 800}",
time = 9.7,
}
Entry{
command = "MakeFire",
target = "player",
params = "enemy",
time = 11.8,
}