1

私はしばらくの間取り組んできたゲームを持っています。コアは C++ ですが、スクリプトと Attacks/StatusEffects/Items などには Python を使用しています。

私は、必要な動作を得るために eval を使用する必要があるコーナーに自分自身をコード化しました。それがどのように発生しているかは次のとおりです。

次のように、攻撃を特定するために使用する xml ドキュメントがあります。

<Attack name="Megiddo Flare" mp="144" accuracy="1.5" targetting="EnemyParty">
    <Flags>
        <IgnoreElements/>
        <Unreflectable/>
        <ConstantDamage/>
        <LockedTargetting/>
    </Flags>
    <Components>
        <ElementalWeightComponent>
            <Element name="Fire" weight="0.5"/> 
        </ElementalWeightComponent>
        <ConstantDamageCalculatorComponent damage="9995" index="DamageCalculatorComponent"/>    
    </Components>
</Attack>

このファイルを Python で解析し、攻撃をビルドします。各攻撃は、さまざまな動作を実装するための任意の数のコンポーネントで構成されます。この攻撃の場合、DamageCalculatorComponent を実装して、Python に ConstantDamage バリアントを使用するように指示します。これらすべてのコンポーネントをスクリプト ファイルに実装します。これは、私が頻繁に使用するコンポーネント タイプに適しています。その特定のコンポーネント バリアントを使用する唯一の攻撃になる攻撃がいくつかあります。コンポーネントをスクリプト ファイルに追加するのではなく、xml ファイルで Component クラスを指定できるようにしたいと考えました。

たとえば、ファイナルファンタジーの古典的なホワイトウィンド攻撃を実装する場合(攻撃者のHPの量だけチームのHPを回復します)

<Attack name="White Wind" mp="41" targetting="AnyParty">
    <Flags>
        <LockedTargetting/>
    </Flags>
    <Components>
        <CustomComponent index="DamageCalculatorComponent">
            <![CDATA[
                class WhiteWindDamageComponent(DamageCalculatorComponent):
                    def __init__(self, Owner):
                        DamageCalculatorComponent.__init__(self, Owner)

                    def CalculateDamage(self, Action, Mechanics):
                        Dmg = 0
                        character = Action.GetUsers().GetFirst()
                        SM = character.GetComponent("StatManagerComponent")
                        if (SM != None):
                            Dmg = -SM.GetCurrentHP()
                        return Dmg
                return WhiteWindDamageComponent(Owner)
            ]]>     
        </CustomComponent>
    </Components>
</Attack>

これを行うためのより良い方法があるのではないかと思っていましたか?私が確認できる他の唯一の方法は、考えられるすべてのコンポーネント バリアント定義を Python ファイルに入れ、コンポーネント クリエーターを展開して追加のバリアントをチェックすることです。使い捨てのコンポーネントには少し無駄に思えます。型を動的に生成するためのより良い/安全な代替手段、またはおそらく私が見ていない別の解決策はありますか?

前もって感謝します

4

1 に答える 1

2

インライン Python が悪い理由

  • あなたのソース コード ファイルは Python ソース コード エディターでは理解できず、構文の強調表示を見逃すことになります

  • ソース コードの lint と検証に使用できる pylint などの他のすべてのツールも失敗します。

要素内<CustomComponent index="DamageCalculatorComponent">

... パラメータを追加script:

<CustomComponent index="DamageCalculatorComponent" script="damager.py">

damager.py次に、ファイル システムのどこかにファイルを追加します。

ここで説明されているようにロードします: Python 3 の execfile に代わるものは何ですか?

メインのゲーム エンジン コードで、ロードされたシステム モジュールから次のようなクラスを構築します。

 damager_class = sys.modules["mymodulename"].my_factory_function()

すべての Python モジュールは、何らかの合意されたクラス名/エントリ ポイント関数を共有する必要があります。

本当にプラグイン可能なアーキテクチャが必要な場合は、Python の卵とsetup.pyエントリ ポイントを使用してください

于 2012-04-27T22:33:02.267 に答える