1

私は、C# と XNA で RPG エンジンのチームと協力しています。Windows と Windows Phone 7 をターゲットにすることを計画していますが、カットシーン中の AI インタラクションとプレイヤー アクションの制御で問題が発生しています。ほとんどの場合、すべてが MVC デザイン パターンを使用して抽出されますが、すべてのロジックと動きをコントローラーに抽象化すると、後で問題が発生する可能性があります。したがって、IScriptObject を受け取り、それに応じてマップ モデルのデータを更新するインターフェイス (IScriptEngine) を用意するという考え方です。スクリプトを XML 形式の構文に入れることを考えていました。

<Script Name="MoveNPC_1"> 
    <Action Command="MoveToTile" Target="NPC_1" Value="10,2"/> 
</Script> 

それに応じて IScriptEngine に解析させます。巨大な switch ステートメントでの解析が良い考えであるとは非常に思えませんが、それは私が取り組んできたことです。

switch(Action.Command)
{
    case "MoveToTile":
      { 
         doMovement(Action.Value, Action.Target); 
         break;
      }
}

高校でのプログラミングの経験でさえ、これは悪い考えだと言っていますが、それ以外の方法は考えられません。

編集:これをどうにかしてマップファイルに埋め込みたいと思います。マップ XML ファイルには、複数のタグを含む に指定されたエリアがあります。次に、NPC がマップ上のどこにいるか、使用するリソースとスクリプトを指定するセクションがあります。次に、すべての戦闘が定義されるセクション (ここでも、リソースの定義とそうでないもの) があり、その後、これらのスクリプトが定義されるセクションが存在する可能性があります。WP7 を使用してオンザフライで C# をコンパイルする方法があればいいのにと思います。双方のサポートが得られれば、これは問題になりません。CodeDom とすべての Compiler クラスの機能を共有する WP7 に移植できる Mono ライブラリがあるのでしょうか?

4

5 に答える 5

6

XML スクリプティング!? あえぎ!、それは「将来的に問題を引き起こす可能性がある」ものです!

なぜ C# だけを使用しないのですか? かなり凄いと聞いています。この件については、すでに意見を述べました

自問する必要があります: スクリプトは本当にデータ駆動型である必要がありますか? C# を使用してデータを表現できない理由はありますか?

実行時に解釈する必要は本当にあるのでしょうか? なぜなら、彼らが本当にそうするなら、それは C# でできるからです。

そして、gamedev.stackexchange.com で、ほぼ同じ質問に対する私の別の回答を次に示します。そこに可能な実装の小さな例も入れました。

実行するのに 1 フレーム以上かかるアクション (基本的にはコルーチン) が必要な場合、たとえば、「ここを歩いて、話して、待って、あそこを歩いて」のように、C# でこれを適切に実装することもできます。yeild


編集: XML レベルと C# スクリプトを混在させたい場合は、次の例を参照してください。

<Level>
    <Door position="4,4" name="spookyDoor" />
    <Region position="4,2" name="spookyOpener" />
</Level>

そして C# では:

public void LevelStart()
{
    this.Regions["spookyOpener"].OnPlayerEnter += () =>
    {
        (this.Items["spookyDoor"] as Door).Open();
    };
}
于 2010-08-22T05:46:23.667 に答える
3

XML 構文を使用する代わりに、Luaなどの実際の言語を埋め込むことを検討したい場合があります。実際の XML 構文に基づいて構築されたプログラミング言語があまり見られないのには理由があります。実際のプログラミング タスクでは、これは非常に扱いにくいものです。

于 2010-08-22T05:22:31.567 に答える
0

既存の XML パーサーを使用できます。さまざまな方法 (SAX、StAX) があり、多くの言語で使用できるパーサーがあります。

次に、XPath を使用してドキュメント内のノードを参照できます。

于 2010-08-22T05:17:30.630 に答える
0

また、 http: //www.protohacks.net/xna_debug_terminal にある XNA Debug Terminal というライブラリを検討することもできます。これにより、実行時に任意の c# ステートメントを実行できます。これは基本的に、スクリプト言語の Eval() メソッドのように機能します。xml スクリプト アクションを作成する代わりに、このライブラリを使用してゲームの実行中にユーザーがその場でアクションをスクリプト化できるようにすることはできますか? または、それを使用して独自のアクションをスクリプト化して、それぞれの場合に何が起こるかを確認することもできます。特別なターミナル コマンドの 1 つを使用すると、C# コードを含む文字列を取得してコードを評価できます。したがって、いくつかの事前設定されたアクションを設定し、ユーザーにそれらから選択させることができます。これらのアイデアは、あなたの特定のケースではうまくいかないかもしれませんが、あなた (およびこれを読んでいる他の人) に考えるべきいくつかのオプションを提供したいと思いました.

于 2010-09-11T21:26:42.043 に答える
0

実行時にスクリプトを解釈する必要はありますか? あなたの開発はコンテンツ主導だとおっしゃっていますが、これは良いことです。ただし、XML やスクリプト言語を使用することによる速度と効率の向上を利用するために、必ずしもスクリプトを解釈する必要はありません。

XML データを作成し、コンテンツ パイプラインがそれを .XNB にコンパイルできるようにする、Shawn Hargreaves の例に従っています。スクリプト システムを実装するか、既存のものを統合してそのための ContentPipeline プロジェクトを作成すると、追加または変更されたスクリプトのみをコンパイルできます。ゲーム全体を再コンパイルする場合と比較して、実行間のダウンタイムはほとんどありません。

そして、私は間違いなくXMLには行きません。XNAには自動的にXML用のインポーターがあるかもしれませんが、それを使用しようとすると非常に醜いでしょう. XNUAは XNA 用の lua ライブラリであり、この種の処理には十分に機能するはずでした。

とにかく、デザイナーを .XNB にコンパイルさせることは、Source のようなエンジンでやらなければならないがらくたとそれほど違いはありません。

また、スクリプト化されたイベントについて考えるのに役立つ次の記事を見つけました:
Riverman Media - Object Oriented Programming, the Scripted Event System
Brandon Furtwangler - First Impressions Matter

于 2010-08-24T06:44:15.490 に答える