游戏框架探索-重放系统

播放系统

简述:
记录游戏场景中的命令,保存为文件;播放时加载文件并解析,生成命令流,由游戏进行播放;
小结:
花的时间主要在于 游戏命令的封装;播放文件的保存与加载播放;
每次执行命令后 游戏逻辑的运算结果需一致;
目前仅有重放,待拓展的有撤销(提供一个“相反”的命令) 和 重做 等,即维护一个命令的列表,从而控制游戏的流程;
代码应用:

--该条命令记录了将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,
    }

猜你喜欢

转载自blog.csdn.net/u013320664/article/details/80680736
今日推荐