Script in Game

6833 ワード

Script in Game
スクリプトの登場は、データストレージの柔軟性と論理処理の構成性という少なくとも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);