使用這個框架是為了解決以下問題:
1、更高效率開發(fā)
2、更專注于流程控制
我們來說下框架。
框架的意義:
框架的意義在于讓開發(fā)人員減輕重新建立解決復(fù)雜問題方案的負(fù)擔(dān)和精力。便于敏捷開發(fā)出新的需求浑塞,降低開發(fā)時間成本。
腳本的需求:
1政己、復(fù)用性內(nèi)容的通用設(shè)計
2酌壕、腳本流程的通用設(shè)計
3、業(yè)務(wù)邏輯流程的通用設(shè)計
一.我們來寫一個簡單的復(fù)用性內(nèi)容的通用設(shè)計的代碼
其包含模塊:
1歇由、多平臺的基礎(chǔ)庫函數(shù)文件的引用
2卵牍、多分辨率點陣文件的引用
創(chuàng)建文件 Factory_Base.lua 內(nèi)容如下
[mw_shl_code=cpp,true]function _BaseInit(ToolsType)
local ToolsType = ToolsType or "TS";
if ToolsType == "TS" then
require "Base_TS"; --觸動精靈基本函數(shù)封裝庫
elseif ToolsType == "XXXX" then
require "Base_XXXX"; --其他平臺基本函數(shù)封裝庫,這里僅作演示沦泌,各位可以自行命名和添加文件
end
end[/mw_shl_code]
創(chuàng)建文件 Base_TS.lua 內(nèi)容如下
[mw_shl_code=cpp,true]function _getColor()....end
function _log()....end
function _getScreenSize()....end
function ......
該文件封裝觸動提供的所有函數(shù)
如有其他平臺則同上封裝即可.[/mw_shl_code]
創(chuàng)建文件 Factory_PointColor.lua 內(nèi)容如下
[mw_shl_code=cpp,true]function _PointColorInit(ToolsType)
_BaseInit(ToolsType); --需引用基礎(chǔ)函數(shù)庫.
Width,Height = _getScreenSize();
if Width == XXXX and Height == XXXX then
引用指定分辨率下的點陣庫
end
end[/mw_shl_code]
本帖隱藏的內(nèi)容
二糊昙、設(shè)計腳本流程的通用內(nèi)容
1、腳本通用數(shù)據(jù)[針對游戲]
2谢谦、多帳號释牺,多區(qū),多角色的自動管控
默認(rèn)文件 main.lua 添加內(nèi)容如下
[mw_shl_code=cpp,true]GameData =
{
["帳號"]= --這里放置多帳號配置
{
["列表"]={},
["序號"]=1,
},
["服務(wù)器"]={ --這里放置多區(qū)配置
["列表"]={},
["序號"]=1,
},
["角色"]={
["數(shù)量"]=nil, --這里在拿到UI設(shè)置之后,將該數(shù)據(jù)替換成用戶選擇角色數(shù)量
["序號"]=0, --角色序號默認(rèn)為0,方便切換函數(shù)控制
},
["流程"]={
["任務(wù)流程"]=false,
["其他流程"]=false, --在這里添加其他流程..如所有任務(wù)完成后做什么做什么..比如買藥,比如掛機
["換角色流程"]=false, --當(dāng)所有流程跑完,切換到
},
["任務(wù)"]={
["列表"]=nil, --這里將用戶選項替換在這里..格式為: 主線,支線,師門,跑馬? 等任務(wù)..
["循環(huán)卡點"]=false,
["序號"]=1,
["數(shù)據(jù)"]={
["主線"]={
["點陣"]= t_TaskPoint["主線"], --對應(yīng)在點陣文件內(nèi)容.內(nèi)容如下
t_TaskPoint =
{
["主線"] =
{
["主點陣"]={點陣},
["主卡點點陣"]={點陣},
["主完成點陣"]={點陣},
["主引導(dǎo)點陣"]={點陣},
["次點陣"]={點陣},
["次完成點陣"]={點陣},
["次卡點點陣"]={點陣},
["次引導(dǎo)點陣"]={點陣},
},
--每個任務(wù)都對應(yīng)主線一樣設(shè)置回挽,如任務(wù)會在多個面板出現(xiàn),則添加次1點陣没咙,次2點陣 即可..
}
["前置任務(wù)"]=t_rontTask[taskArr[var]], --前置任務(wù)的意義在于起號過程中避免無意義的任務(wù)匹配,例如征途的20級以前不會有種植養(yǎng)殖千劈,25 級之前不會有王城運鏢祭刚,則王城運鏢的前置任務(wù)是種植養(yǎng)殖,當(dāng)匹配王城運鏢任務(wù)時墙牌,判斷其前置任務(wù)[種植養(yǎng)殖]未完成,則直接跳過王城運鏢匹配..
["主點陣識別狀態(tài)"]=nil,
["次點陣識別狀態(tài)"]=nil,
["任務(wù)完成狀態(tài)"]=false,
["死亡次數(shù)"]=0,
["限制死亡次數(shù)"]=0,
["飛鞋次數(shù)"]=0,
["限制飛鞋次數(shù)"]=0,
},
},
},
}
--在本函數(shù)中涡驮,將所有任務(wù)的數(shù)據(jù)全部重置 , 方便切換角色的時候重置數(shù)據(jù)
function _TaskInit()
任務(wù).循環(huán)卡點 = false;
任務(wù).主線.死亡次數(shù) = false;
任務(wù).主線.飛鞋次數(shù) = false;
任務(wù).主線.任務(wù)完成狀態(tài) = false;
--其他任務(wù)設(shè)置
任務(wù).其他任務(wù).數(shù)據(jù) = false;
end
--通過本函數(shù)來控制 角色 服務(wù)器 帳號 的切換
--備注 本函數(shù)在完成所有流程后切換到游戲的登錄界面時運行
function _InitServerAccountRoleIndex()
--進入設(shè)定帳號,服務(wù)器,角色 流程!
--當(dāng)前角色序號:GameData.角色.序號
--當(dāng)前服務(wù)器序號:GameData.服務(wù)器.序號
--當(dāng)前帳號序號:GameData.帳號.序號
GameData.角色.序號 = GameData.角色.序號 + 1;
--在這里將其他流程先打死. 切換到換角色流程
GameData.流程.任務(wù)流程 = false;
GameData.流程.其他流程 = false;
GameData.流程.換角色流程 = true;
--先判斷當(dāng)前角色序號是否超過用戶設(shè)定數(shù)量,如果超過數(shù)量則更換區(qū)喜滨,如未超過數(shù)量則更換角色
if GameData.角色.序號 > tonumber( GameData.角色.數(shù)量 ) then
--判斷當(dāng)前帳號所需要跑的區(qū)是否已經(jīng)跑完..如果跑完了, 則更換帳號, 如果沒跑完 則換區(qū)
if GameData.服務(wù)器.序號 >= #GameData.服務(wù)器.列表 then
--判斷當(dāng)前帳號是否已經(jīng)跑到列表中最后一個帳號捉捅,如果是的話則所有帳號均已完成.,否則則切換到下一個帳號
if GameData.帳號.序號 >= #GameData.帳號.列表 then
dialog("所有帳號任務(wù)已完成鸿市!", 10);
pressHomeKey(0); --按下 Home 鍵
pressHomeKey(1); --抬起 Home 鍵
else
--進入設(shè)定帳號流程! 當(dāng)前帳號:GameData.帳號.序號
GameData.帳號.序號 = GameData.帳號.序號 + 1;
GameData.角色.序號 = 1;
GameData.服務(wù)器.序號 = 1;
end
else
--進入設(shè)定服務(wù)器流程! 當(dāng)前服務(wù)器:GameData.服務(wù)器.序號
GameData.服務(wù)器.序號 = GameData.服務(wù)器.序號 + 1;
GameData.角色.序號 = 1;
end
end
end
--切換任務(wù)流程
function _GetDailyTask()
--當(dāng)前任務(wù):GameData.任務(wù).列表[GameData.任務(wù).序號] 切換任務(wù)
GameData.任務(wù).序號 = GameData.任務(wù).序號 + 1;
if #GameData.任務(wù).列表 <= 1 then
_LogLua("無可選任務(wù),設(shè)定任務(wù)流程結(jié)束!");
GameData.流程.任務(wù) = false;
return;
end
if GameData.任務(wù).序號 > #GameData.任務(wù).列表 then
if GameData.任務(wù).循環(huán)卡點 == true then
_LogLua("循環(huán)任務(wù)完成,設(shè)定任務(wù)流程結(jié)束!");
GameData.流程.任務(wù) = false;
return;
else
GameData.任務(wù).循環(huán)卡點 = true;
GameData.任務(wù).序號 = 1;
end
end
::檢測任務(wù)::
for var = GameData.任務(wù).序號 , #GameData.任務(wù).列表 do
local taskItem = GameData.任務(wù).數(shù)據(jù)[GameData.任務(wù).列表[var]];
if taskItem.任務(wù)狀態(tài) == false then
local tempQZTask = taskItem.前置任務(wù);
if tempQZTask ~= nil and #tempQZTask > 0 then
local tampQZTaskResult = true;
for vat = 1,#tempQZTask do
if _CheckTableValue(GameData.任務(wù).列表,tempQZTask[vat]) == nil or taskItem.任務(wù)狀態(tài) == false then
tampQZTaskResult = false
end
end
if tampQZTaskResult then
GameData.任務(wù).序號 = var;
_LogLua("檢測到:"..GameData.任務(wù).列表[GameData.任務(wù).序號].." 任務(wù)前置任務(wù)已完成,切換至該任務(wù)!");
return;
end
else
GameData.任務(wù).序號 = var;
_LogLua("檢測到:"..GameData.任務(wù).列表[GameData.任務(wù).序號].." 任務(wù)未完成,切換該任務(wù)!");
return;
end
end
end
if GameData.任務(wù).循環(huán)卡點 == true then
_LogLua("循環(huán)任務(wù)完成,設(shè)定任務(wù)流程結(jié)束!");
GameData.流程.任務(wù) = false;
else
_LogLua("無任務(wù)可做,重新適配一環(huán)任務(wù)菜單!");
GameData.任務(wù).循環(huán)卡點 = true;
GameData.任務(wù).序號 = 1;
goto 檢測任務(wù);
end
end
--主任務(wù)流程
--備注: _FindUIByTable _FindUIScopeByTable 均為找色函數(shù) 理解英文意思即可!
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
--當(dāng)進度條锯梁,或者自動戰(zhàn)斗即碗、自動尋路中這些點陣被匹配到時阻塞任務(wù)流程
if _FindUIByTable(t_Task.阻塞任務(wù)) then--FindUIByTable為找色函數(shù)
mSleep(5*1000);
return;
end
if _FindUIByTable(t_Task.隊伍面板) then
_Click(t_Task.切換任務(wù)面板);
end
if _FindUIByTable(t_Task.任務(wù)面板) then
local currTaskName = GameData.任務(wù).列表[GameData.任務(wù).序號];
local currTaskDZ = t_Task[currTaskName];
GameData.任務(wù).數(shù)據(jù)[currTaskName].主面板識別 = false;
GameData.任務(wù).數(shù)據(jù)[currTaskName].次面板識別 = false;
if currTaskDZ.主卡點 ~= nil and _FindUIScopeByTable(currTaskDZ.主卡點,currTaskDZ.主面板范圍) then
_LogLua(currTaskName.." 卡點"); --_LogLua為日志函數(shù)..這里就不貼內(nèi)容了
_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.." 執(zhí)行");
return;
End
--引導(dǎo)的判斷在其該任務(wù)的其他識別之后 其原因大家自己領(lǐng)悟
if currTaskDZ.主引導(dǎo) ~= nil and _FindUIScopeByTableAndClick(currTaskDZ.主引導(dǎo),currTaskDZ.主面板范圍) then
_LogLua(currTaskName.." 引導(dǎo)");
return;
end
end
--在這里添加次面板或者次1面板焰情、次2面板的識別狀態(tài)陌凳,同時在下面添加對應(yīng)的狀態(tài)判斷
if GameData.任務(wù).數(shù)據(jù)[currTaskName].主面板識別 == false and GameData.任務(wù).數(shù)據(jù)[currTaskName].次面板識別 == false then
_GetDailyTask(); --調(diào)用切換任務(wù)函數(shù)
end
end[/mw_shl_code]
寫到這里基本尾聲了,還有一些小細(xì)節(jié)大家自己寫即可内舟,大部分的游戲都可以通用這個流程合敦,直接復(fù)制即可!,