2012-02-23 22 views
0

最近、私はC#で.Netの2dゲームエンジンの例を研究しています。私の主な問題は、ゲームロジックをゲーム内にどのように含めるべきかを理解できないことです。現在私はRenderSoundInputおよびCoreのようなサブシステムを実行しているクラスのセットであるベースエンジンを持っています。ユーザーがリソースを追加したり、レベルを作成したり、スクリプトやその他のものを書くのに役立つエディタがあります。ゲームエンジンにゲームロジックを統合する方法

ReflectionCSharpCodeProviderを私のエディタから書いたコードをコンパイルするためのアイデアを思いついたので、私は自分の製品の実行ファイルも手に入れることができます。この方法は非常にうまくいきますが、実際にこれを行うためのソリューションとアーキテクチャは何かを知りたいと思います。

ありがとうございました。

+1

ゲームの種類にあまりにも多くを依存 - そのうちのいくつかは、メインループに含めることができますが、ロケット弾がフルにルール・エンジンが必要な場合があり... –

+0

は、2Dのプラットフォーム上で、それを想定。ところで、私はイベントに何の問題もありません。メインループは、例えば、「ステップ」イベントまたは各フレームを実行することができる。何の問題もありません。 – MahanGM

+0

あなたは 'C# 'でゲームロジックを指定しますか? – Tigran

答えて

0

実際にエンジンをどのように設計したかによって異なります。レンダリング、サウンド、入力などのさまざまなことを担当する単なるライブラリではありません。それらを結合した作品が必要です。主な2つのアプローチは、シーングラフまたはコンポーネントモデルです。これをすべて組み合わせるモジュールです。入力を取得してエンティティまたはコンポーネントに渡し、いくつかのスクリプトを実行し、いくつかの変換を適用し、変換されたエンティティをレンダリングパイプラインに送信します。この流れではのスクリプトを実行しますは統合したいものです。それを行うには多くの方法があります。これらのスクリプトがあなたのエディタから来た場合、それを行う最良の方法です。エンティティテンプレート、エンティティインスタンス、トリガ、UI要素、入力デバイスに関連付けられます。エンジンはエンティティに関する特定のものを知ってはいけません。それらのテンプレートはエディタで定義し、エディタを使用して再び世界に配置する必要があります。

編集:もう少し詳細。

アプリケーションの部分を完全にスキップして、ゲーム固有のすべてのものがエディタでスクリプト化されていると仮定します。次にエンジンにメインループが必要で、シーンを更新して描画する必要があります。シンプルなスタートはUpdateです。あなたのループで待たずにできるだけ早くシーンを描きます。

あなたはコンポーネントモデルを持っていると仮定します...各コンポーネントにはアップデートがあり、そのアップデートはあなたがスクリプト化したコードです。コンポーネントがエンジンからアクセスできるインタフェースをいくつか作成する必要があります。たとえば、描画コンポーネントのテンプレートにはプロパティモデルがあり、その更新でエンジン上でDrawModelが呼び出され、そのモデルが渡されます。他のゲームパッドのコンポーネントの中には、そのボタンが押されたか解放されたかを問い合わせるための更新が必要です。エンティティ内の他のコンポーネントを見つけて、物理コンポーネントの位置や速度を変更できるようにする必要もあります。

基本エンティティの基本コンポーネントの作成を開始し、スクリプトからアクセスできないものを把握する必要があります。そして、それをあなたのスクリプティング層に公開する必要があります。しかし、すべての単一の機能を公開する前に2回考えてください。 APIが単純であればいいほどいいです。

編集:あなたは、私はそれがあまりにもそれを行うことができます賭けのJavaScriptの.NET実装を持っている場合、どのように、実行時にスクリプトをコンパイルする

IronPythonのは、コンパイルせずにコードを評価することができます。ここであなたのスクリプトをコンパイルするC#の方法です...あなたのエディタがC#であれば、エディタで別々のアセンブリをコンパイルすることをお勧めします。

private Assembly Compile(string fileName) 
    { 
     CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp"); 

     CompilerParameters cp = new CompilerParameters(); 
     cp.GenerateExecutable = false; 
     cp.GenerateInMemory = true; 
     cp.TreatWarningsAsErrors = false; 
     CompilerResults cr = provider.CompileAssemblyFromFile(cp, fileName); 

     return cr.CompiledAssembly; 
    } 
+0

あなたはそうです。実際に私はエンジンの流れを知っていますが、私はエンジンのこの部分をどのように実装すべきかわかりません。あなたのスピーチでさえ、私は方法を理解できません! – MahanGM

+0

答えの編集を確認してください。 – Aleks

+0

ありがとうございます。私は実際にこれを私のエンジンで実際にやっています。私が前に言ったように、スクリプトを実行する時間や場所に問題はないのですが、スクリプトを私のエンジンに与えて、「ねえ、走ってください!」と言わなければなりません。 IronPythonとJavaScriptラッパーのようなものを試しましたが、スクリプトを実行するたびにコードをコンパイルする必要があります。これは、最初はコンパイルされていないアプリケーションのように、実行時にコードをコンパイルする必要があります。 – MahanGM

関連する問題