使用这个框架是为了解决以下问题:
1、更高效率开发
2、更专注于流程控制
我们来说下框架。
框架的意义:
框架的意义在于让开发人员减轻重新建立解决复杂问题方案的负担和精力。便于敏捷开发出新的需求,降低开发时间成本。
脚本的需求:
1、复用性内容的通用设计
2、脚本流程的通用设计
3、业务逻辑流程的通用设计
一.我们来写一个简单的复用性内容的通用设计的代码
其包含模块:
1、多平台的基础库函数文件的引用
2、多分辨率点阵文件的引用
创建文件 Factory_Base.lua 内容如下
[mw_shl_code=cpp,true]function _BaseInit(ToolsType)
local ToolsType = ToolsType or "TS";
if ToolsType == "TS" then
require "Base_TS"; --触动精灵基本函数封装库
elseif ToolsType == "XXXX" then
require "Base_XXXX"; --其他平台基本函数封装库,这里仅作演示,各位可以自行命名和添加文件
end
end[/mw_shl_code]
创建文件 Base_TS.lua 内容如下
[mw_shl_code=cpp,true]function _getColor()....end
function _log()....end
function _getScreenSize()....end
function ......
该文件封装触动提供的所有函数
如有其他平台则同上封装即可.[/mw_shl_code]
创建文件 Factory_PointColor.lua 内容如下
[mw_shl_code=cpp,true]function _PointColorInit(ToolsType)
_BaseInit(ToolsType); --需引用基础函数库.
Width,Height = _getScreenSize();
if Width == XXXX and Height == XXXX then
引用指定分辨率下的点阵库
end
end[/mw_shl_code]
本帖隐藏的内容
二、设计脚本流程的通用内容
1、脚本通用数据[针对游戏]
2、多帐号,多区,多角色的自动管控
默认文件 main.lua 添加内容如下
[mw_shl_code=cpp,true]GameData =
{
["帐号"]= --这里放置多帐号配置
{
["列表"]={},
["序号"]=1,
},
["服务器"]={ --这里放置多区配置
["列表"]={},
["序号"]=1,
},
["角色"]={
["数量"]=nil, --这里在拿到UI设置之后,将该数据替换成用户选择角色数量
["序号"]=0, --角色序号默认为0,方便切换函数控制
},
["流程"]={
["任务流程"]=false,
["其他流程"]=false, --在这里添加其他流程..如所有任务完成后做什么做什么..比如买药,比如挂机
["换角色流程"]=false, --当所有流程跑完,切换到
},
["任务"]={
["列表"]=nil, --这里将用户选项替换在这里..格式为: 主线,支线,师门,跑马 等任务..
["循环卡点"]=false,
["序号"]=1,
["数据"]={
["主线"]={
["点阵"]= t_TaskPoint["主线"], --对应在点阵文件内容.内容如下
t_TaskPoint =
{
["主线"] =
{
["主点阵"]={点阵},
["主卡点点阵"]={点阵},
["主完成点阵"]={点阵},
["主引导点阵"]={点阵},
["次点阵"]={点阵},
["次完成点阵"]={点阵},
["次卡点点阵"]={点阵},
["次引导点阵"]={点阵},
},
--每个任务都对应主线一样设置,如任务会在多个面板出现,则添加次1点阵,次2点阵 即可..
}
["前置任务"]=t_rontTask[taskArr[var]], --前置任务的意义在于起号过程中避免无意义的任务匹配,例如征途的20级以前不会有种植养殖,25 级之前不会有王城运镖,则王城运镖的前置任务是种植养殖,当匹配王城运镖任务时,判断其前置任务[种植养殖]未完成,则直接跳过王城运镖匹配..
["主点阵识别状态"]=nil,
["次点阵识别状态"]=nil,
["任务完成状态"]=false,
["死亡次数"]=0,
["限制死亡次数"]=0,
["飞鞋次数"]=0,
["限制飞鞋次数"]=0,
},
},
},
}
--在本函数中,将所有任务的数据全部重置 , 方便切换角色的时候重置数据
function _TaskInit()
任务.循环卡点 = false;
任务.主线.死亡次数 = false;
任务.主线.飞鞋次数 = false;
任务.主线.任务完成状态 = false;
--其他任务设置
任务.其他任务.数据 = false;
end
--通过本函数来控制 角色 服务器 帐号 的切换
--备注 本函数在完成所有流程后切换到游戏的登录界面时运行
function _InitServerAccountRoleIndex()
--进入设定帐号,服务器,角色 流程!
--当前角色序号:GameData.角色.序号
--当前服务器序号:GameData.服务器.序号
--当前帐号序号:GameData.帐号.序号
GameData.角色.序号 = GameData.角色.序号 + 1;
--在这里将其他流程先打死. 切换到换角色流程
GameData.流程.任务流程 = false;
GameData.流程.其他流程 = false;
GameData.流程.换角色流程 = true;
--先判断当前角色序号是否超过用户设定数量,如果超过数量则更换区,如未超过数量则更换角色
if GameData.角色.序号 > tonumber( GameData.角色.数量 ) then
--判断当前帐号所需要跑的区是否已经跑完..如果跑完了, 则更换帐号, 如果没跑完 则换区
if GameData.服务器.序号 >= #GameData.服务器.列表 then
--判断当前帐号是否已经跑到列表中最后一个帐号,如果是的话则所有帐号均已完成.,否则则切换到下一个帐号
if GameData.帐号.序号 >= #GameData.帐号.列表 then
dialog("所有帐号任务已完成!", 10);
pressHomeKey(0); --按下 Home 键
pressHomeKey(1); --抬起 Home 键
else
--进入设定帐号流程! 当前帐号:GameData.帐号.序号
GameData.帐号.序号 = GameData.帐号.序号 + 1;
GameData.角色.序号 = 1;
GameData.服务器.序号 = 1;
end
else
--进入设定服务器流程! 当前服务器:GameData.服务器.序号
GameData.服务器.序号 = GameData.服务器.序号 + 1;
GameData.角色.序号 = 1;
end
end
end
--切换任务流程
function _GetDailyTask()
--当前任务:GameData.任务.列表[GameData.任务.序号] 切换任务
GameData.任务.序号 = GameData.任务.序号 + 1;
if #GameData.任务.列表 <= 1 then
_LogLua("无可选任务,设定任务流程结束!");
GameData.流程.任务 = false;
return;
end
if GameData.任务.序号 > #GameData.任务.列表 then
if GameData.任务.循环卡点 == true then
_LogLua("循环任务完成,设定任务流程结束!");
GameData.流程.任务 = false;
return;
else
GameData.任务.循环卡点 = true;
GameData.任务.序号 = 1;
end
end
::检测任务::
for var = GameData.任务.序号 , #GameData.任务.列表 do
local taskItem = GameData.任务.数据[GameData.任务.列表[var]];
if taskItem.任务状态 == false then
local tempQZTask = taskItem.前置任务;
if tempQZTask ~= nil and #tempQZTask > 0 then
local tampQZTaskResult = true;
for vat = 1,#tempQZTask do
if _CheckTableValue(GameData.任务.列表,tempQZTask[vat]) == nil or taskItem.任务状态 == false then
tampQZTaskResult = false
end
end
if tampQZTaskResult then
GameData.任务.序号 = var;
_LogLua("检测到:"..GameData.任务.列表[GameData.任务.序号].." 任务前置任务已完成,切换至该任务!");
return;
end
else
GameData.任务.序号 = var;
_LogLua("检测到:"..GameData.任务.列表[GameData.任务.序号].." 任务未完成,切换该任务!");
return;
end
end
end
if GameData.任务.循环卡点 == true then
_LogLua("循环任务完成,设定任务流程结束!");
GameData.流程.任务 = false;
else
_LogLua("无任务可做,重新适配一环任务菜单!");
GameData.任务.循环卡点 = true;
GameData.任务.序号 = 1;
goto 检测任务;
end
end
--主任务流程
--备注: _FindUIByTable _FindUIScopeByTable 均为找色函数 理解英文意思即可!
function _TaskFlow()
--避免频繁点击模块 begin
TaskTimeCurr = socket.gettime();
if TaskTimeLast == nil then
TaskTimeLast = TaskTimeCurr;
else
if (TaskTimeCurr - TaskTimeLast)*1000 > 3*1000 then
TaskTimeLast = TaskTimeCurr;
else
return;
end
end
--避免频繁点击模块 end
--当进度条,或者自动战斗、自动寻路中这些点阵被匹配到时阻塞任务流程
if _FindUIByTable(t_Task.阻塞任务) then--FindUIByTable为找色函数
mSleep(5*1000);
return;
end
if _FindUIByTable(t_Task.队伍面板) then
_Click(t_Task.切换任务面板);
end
if _FindUIByTable(t_Task.任务面板) then
local currTaskName = GameData.任务.列表[GameData.任务.序号];
local currTaskDZ = t_Task[currTaskName];
GameData.任务.数据[currTaskName].主面板识别 = false;
GameData.任务.数据[currTaskName].次面板识别 = false;
if currTaskDZ.主卡点 ~= nil and _FindUIScopeByTable(currTaskDZ.主卡点,currTaskDZ.主面板范围) then
_LogLua(currTaskName.." 卡点"); --_LogLua为日志函数..这里就不贴内容了
_GetDailyTask();
return;
end
if currTaskDZ.主完成 ~= nil and _FindUIScopeByTableAndClick(currTaskDZ.主完成,currTaskDZ.主面板范围) then
_LogLua(currTaskName.." 完成");
return;
end
if currTaskDZ.主面板 ~= nil and _FindUIScopeByTableAndClick(currTaskDZ.主面板,currTaskDZ.主面板范围) then
_LogLua(currTaskName.." 执行");
return;
End
--引导的判断在其该任务的其他识别之后 其原因大家自己领悟
if currTaskDZ.主引导 ~= nil and _FindUIScopeByTableAndClick(currTaskDZ.主引导,currTaskDZ.主面板范围) then
_LogLua(currTaskName.." 引导");
return;
end
end
--在这里添加次面板或者次1面板、次2面板的识别状态,同时在下面添加对应的状态判断
if GameData.任务.数据[currTaskName].主面板识别 == false and GameData.任务.数据[currTaskName].次面板识别 == false then
_GetDailyTask(); --调用切换任务函数
end
end[/mw_shl_code]
写到这里基本尾声了,还有一些小细节大家自己写即可,大部分的游戏都可以通用这个流程,直接复制即可!,