Script in Game
6833 ワード
Script in Game
スクリプトの登場は、データストレージの柔軟性と論理処理の構成性という少なくとも2つのメリットをゲーム開発にもたらした.「接着剤」は、スクリプトの役割を正確に記述し、多数のコンポーネントインタフェースがスクリプト組織を介して一定の論理的応用を形成する.
一、構成ファイルとして
一般的なプロファイルとは異なり、スクリプトには実行性があるため、スクリプトがプロファイルとして使用される場合、プロファイル・アイテムをアクティブに読み込むのではなく、スクリプト自身がプロファイルを実行するようにします.例えば、Luaを例に解像度、スクリーン効果、音響効果を構成する.
スクリプト・システムがプロファイルを実行すると、すべての構成が完了します.
二、インタフェースロジック制御
WOWはXML+Luaアーキテクチャを用いてゲームインタフェースシステムを実現しているが,この方法は柔軟で強力であるが非常に危険であり,スクリプトにエクスポートされて使用されるインタフェースの処理に注意しなければならない.
三、ゲームロジック制御
戦闘表現をより豊かにし、シーンをよりスマートにするにはどうすればいいですか?スクリプトに十分なインタフェースをエクスポートして使用すれば、彼はあなたを悩ませたニーズを実現することができます.
C++で呼び出されたスクリプトのコードクリップ:
スクリプトの登場は、データストレージの柔軟性と論理処理の構成性という少なくとも2つのメリットをゲーム開発にもたらした.「接着剤」は、スクリプトの役割を正確に記述し、多数のコンポーネントインタフェースがスクリプト組織を介して一定の論理的応用を形成する.
一、構成ファイルとして
一般的なプロファイルとは異なり、スクリプトには実行性があるため、スクリプトがプロファイルとして使用される場合、プロファイル・アイテムをアクティブに読み込むのではなく、スクリプト自身がプロファイルを実行するようにします.例えば、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);