腳本的出現至少給游戲開發帶來了兩個好處:數據存儲的靈活性和邏輯處理的可配置性。“粘合劑”很準確地描述了腳本的作用,一大堆組件接口通過腳本組織形成了具有一定邏輯的應用。
一、作為配置文件
與一般的配置文件不同,由于腳本具有可執行性,所以當腳本作為配置文件時,我們通常并不會主動去讀取配置項,而是讓腳本自己來執行配置。例如,以Lua為例來配置分辨率、屏幕效果、音效。
-- configure.lua
GameOpt =
{
Resolution = { x = 1024 , y = 768 } ,
PostEffect = { bloom = true , shadow = true , dof = false } ,
Sound = { audio = true , music = false} ,
}
Game:SetResolution(GameOpt.Resolution.x , GameOpt.Resolution.y)
Game:EnableBloom(PostEffect.bloom)
…
Game:EnableMusic(Sound.music)
當腳本系統執行該配置文件后,便完成了所有配置。
二、界面邏輯控制
WOW使用XML+Lua架構實現游戲界面系統,此方法靈活強大但也非常危險,必須小心處理導出給腳本使用的接口。
<!--StatsFrame.xml-->
<Script file="StatsFrame.lua"/>
<Frame name="StatsFrame" setAllPoints="true" frameStrata="DIALOG" hidden="true" parent="UIParent">
<Layers>
<Layer level="ARTWORK">
<FontString name="StatsFrameText" inherits="NumberFontNormal" justifyH="RIGHT" justifyV="BOTTOM">
<Anchors>
<Anchor point="BOTTOMRIGHT">
<Offset>
<AbsDimension x="-16" y="192"/>
</Offset>
</Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>
<Scripts>
<OnLoad>
StatsFrame_OnLoad();
</OnLoad>
<OnUpdate>
StatsFrame_OnUpdate(arg1);
</OnUpdate>
</Scripts>
</Frame>
</Ui>
-- StatsFrame.lua
STATSFRAME_UPDATE_TIME = 0.5;
function ToggleStats()
if ( StatsFrame:IsShown() ) then
StatsFrame:Hide();
else
StatsFrame:Show();
end
end
function StatsFrame_OnLoad()
this.updateTime = 0;
end
function StatsFrame_OnUpdate(elapsed)
local updateTime = this.updateTime - elapsed;
if ( updateTime <= 0 ) then
updateTime = STATSFRAME_UPDATE_TIME;
StatsFrameText:SetText(GetDebugStats());
end
this.updateTime = updateTime;
end
三、游戲邏輯控制
如何讓戰斗表現更豐富、如何讓場景更智能?只要導出足夠的接口給腳本使用,他就能實現那些曾經讓你頭疼的需求。
-- 當xxx Boss進入視野時,改變天氣為下雪,并播放戰斗音效
function BossEnterView(id)
if(xxx == id) then
Game:ChangeWeather(SNOW)
Game:PlayBattleMusic(id)
end
end
C++中調用腳本的代碼片段:
/// load script when enter map
...
char szBuff[MAX_BUFF_SIZE];
snprintf(szBuff , MAX_BUFF_SIZE , "BossEnterView(%d)" , bossid);
/// execute function in script
ScriptSys.ExecuteString(szBuff);