修正可能なゲームを作りたいです。これは私のプログラミング言語の選択にどのように影響しますか?[閉まっている]


26

私はJavaでいくつかの小さなゲームを作り始めており、より大きなプロジェクトのためにC#の学習を検討しています。修正可能なゲームを作りたいのですが、ゲームを修正可能にするにはJavaに固執する必要があると誰かから言われましたが、理由はわかりません。

それでは、どのようなプログラミング言語の特性が、言語をモッダブルなゲームにより適したものにしているのでしょうか?


3
修正可能なゲームを作成したい場合、PhysicsFSは知っておくと便利なライブラリです。(それは物理学とは何の関係もありません。名前にだまされてはいけません。))
ポールマンタ

10
「しかし、ゲームを変更可能にするにはJavaに固執する必要があると誰かに言われました」これは、ちなみにBSです。
レイデイ

回答:


18

MODシステムの設計方法によって異なります。それらのうちの2つを調べます。

SDK

ほとんどの場合、MOD作成者があなたと同じ言語を使用し、リフレクション(または選択した言語に応じて同様の)を介してMODをロードする必要があります。これにより、明らかに遅延バインディングが可能な言語に制限されます-そして、これを行うことができる多くの言語があります(Cでさえ、巧妙なLoadLibraryトリックで遅延バインディングを行うことができます)。MODが他のMOD(スクリプト化されたMODなど)をホストできるメタMODを実行することもできます。

このアプローチの最初の問題は、内部状態を隠すことです。C#を例にとると、modderはリフレクションを使用してプライベートメンバーにアクセスできますが、Cはこれも実行できます(ただし、より多くの作業が必要です)。

2番目の問題はホスティングです。サンドボックスがない場所でシステム上で実行される外部コードは、実際には嫌われています。最悪のシナリオとして、シードボックスを設定するmodを作成できます。これがISPにインストールされた場合、評判に深刻な損害を与える可能性があります。

スクリプティング

Modderは、Luaなどの言語を使用してModを作成します。ネイティブコードを呼び出すことができる言語が必要です(Luaとのインターフェイスに)。または、選択した言語で独自のスクリプト言語を作成する必要があります。

ここでの最初の問題は、ほとんどのスクリプト言語が解釈されることです。これはリアルタイムシステムでは受け入れられない場合があります(ただし、LuaJITを参照)。ゲームなど。

皮肉なことに、2番目の問題はまだここにあります。私は非常に「砲撃アウト」しているされているコア/デフォルトのライブラリに含まれた機能を失望された例としてのLuaを取る-サンドボックス環境として、それは完全に無用作る(努力、運とメンテナンスの大量せずに)、それはハードにです私がこれについてどれほど怒っているかを描写しますが、これらの反特徴を含めて、彼らが強いカクテルを飲んでいたことを本当に願っています。独自の言語を使用している場合は、明らかにこれを簡単に回避できます(UnrealScriptを参照)。

最後に、スクリプティングエンジンとの対話のコストは法外なものになる可能性があります-再びLuaをC#と組み合わせると、ネイティブ関数を(P / Invoke経由で)呼び出すときにC#にはかなりのオーバーヘッドがあり、Luaはかなり「おしゃべり」なAPIです。「スクリプトSDK」を設計する方法が、主要言語とスクリプト言語の間で多くのチャットを必要とする場合、これは問題につながる可能性があります(Cには実際にはこの問題がないことに注意してください)。繰り返しますが、独自のスクリプト言語を記述し(MSILにコンパイルするC#の場合)、[仮想]環境で最も迅速に実行することで、これを回避できます。

スクリプトは基本的にプライマリコードとは完全に異なるシステムで実行されているため、内部状態へのアクセスを完全に制御できます(前述のシェル関数で派手なものを実行しない限り)。

結論

私は少し話題を逸しましたが、テキストの壁から基本的に得ることができるのは、任意の言語で変更可能なゲームを作ることができるはずです(私はあなたができると言うことをベンチャーします)-しかし、いくつかの言語ではより多くの作業につながる可能性があります。セキュリティについて少しアナルですか?はい、ユーザーコードに関してはあなたもそうすべきです。


最初に説明したシナリオでは、ユーザーが実際に自分の動的ライブラリをプログラミングしてゲームにプラグインすることについて話しているのですか?これは以前にライブラリ(たとえば、新しいコーデックを追加するためのオーディオライブラリなど)で使用されていましたが、おそらく改造についてあまり調べたことがないため、ゲームでこのようなケースに遭遇することはありません。私はこれに興味があります(ユーザーがこれを行う方法を知るのは本当に難しいようであり、通常はMODがアクセス可能であると見ています)ので、例を知っていますか?ほとんどの場合、ちょっとしたスクリプトを使用する世界のエディターなどの特殊なツールを使用しています。
デヴィッドゴーベイア

1
@DavidGouveia Europa Universalis(および異なる期間の同等のゲーム)に使用されるエンジンParadoxの少なくとも1つのバージョンは、バイナリパッチの形式をサポートしていました(ただし、modderのソースを修正して、データファイルの実装を変更することにより、より一般的に使用されるmodに加えて、ゲームDLL(適切なSDKサポートの代わりに)。
ダンニーリー

2
@DavidGouveia参照:ソースエンジン。またはWinampプラグインも。私が考える地震でもこのように動作します。私はあなたがC#を使用することを獲得しました。したがって、MEF(Managed Extensibility Framework)を検討することをお勧めします。インターフェイスを公開し、リフレクションを介してロードし、おじさんをボブします。
ジョナサンディキンソン

@JonathanDickinsonああ、Sourceエンジンがこのモデルの下で実行されているとは思いもしませんでした。The Elder's Scrolls Constructionセットのようなツールのセットを常に想像していました。情報をありがとう(それがどのように機能するかはわかっていましたが、一般的なmodderが使用するには複雑すぎると思っただけです)。そして、「ボブはあなたのおじさんの役だ」と本当に笑いました。:
デビッドゴーベイア

1
Re Lua:これらの人たちは、Wikiソフトウェアでの使用に適したサンドボックス化されたLuaを持っています(英語版ウィキペディアが使用できるほど安定しています)。ニーズに合わせて調整できると確信していますが、拡張機能の一部はGPLになっているので、弁護士に確認してください。
ケビン

16

この言語はここでは決定的な要因ではありませんが、それはあなたがそれを定義するゲームをどれだけ柔軟かつデータ駆動型にするかということです。

すべてのゲームは、一連のデータ(たとえば、レベル、メッシュ、構成、アイテムなど)で実行されます。通常のゲームと変更可能なゲームの違いは、ユーザーが既存のデータを変更(または独自のデータを追加)できるツールを提供することです。どの言語を選択する場合でも、ゲームを可能な限りデータ駆動型にし、ゲームコンテンツをハードコーディングしないようにしてください。おそらく選択するほぼすべての言語で、ディスクからデータを読み取ることができます。これは必要なもののほとんどです。

また、個人用のツール(たとえば、独自のレベルエディター)を作成し、後で完成させてユーザーと共有するだけでも、半分の方法です。スーパー肉の少年のレベルエディタは、ほとんどのゲームの開発中に使用するツールの改善verision、ということでした。

また、ゲームのタイプに応じて、ユーザーがゲームの動作の一部をスクリプト化できるようにすることもできます。その場合、早い段階からスクリプト言語をゲームに組み込むことを検討する必要があります(独自の言語、または一般的な選択肢であるLuaやPythonのような既存の言語)。これも、データ駆動型設計のカテゴリに分類されます。既存のスクリプト言語を使用することにした場合、選択したプログラミング言語にそのスクリプト言語のバインディングがあるかどうかを確認する価値があるかもしれません(通常はサードパーティライブラリの形式)。


5

選択する言語は、実際にゲームがどの程度変更可能かを決定するものではなく、言語の使用方法がより重要になります。

ゲームの大部分がデータドリブンの場合(つまり、ゲームデータがコードから読み取られるファイルで定義されている場合)、ゲームは非常に変更可能です。これは、ほぼすべての言語で実行できます。スクリプト言語を使用すると、ゲームを簡単に変更できます。

ただし、これらを使用しないことでゲームを変更することが不可能になるということではありません。たとえば、Minecraftは非常に変更可能なゲームではありませんが、Java用の非常に優れたデコンパイラーとMinecraftの非常に大きなコミュニティがあるため、Minecraftを変更可能にするための多くのツールが作成されました(さまざまなmodloader、Bukkit)。これらのツールを使用すると、Minecraftを改造できます(ただし、一部の国ではおそらく技術的に違法です)。

私があなたに与えることができる最善のアドバイスは、modderが使用したいツールを使用することです。ファイルからNPCを定義する場合は変更できますが、コードで特殊なケースを使用する場合はおそらく変更できません。


1

Javaは、変更可能なゲームを作成するのに最適です。

そうは言っても、ゲームを変更可能にする最善の方法は、通常、より広範なアプリケーションに組み込み、スクリプト作成に使用できる動的言語を採用することです。コンパイル/ビルド/テストのサイクル全体を経ることなく、実行時にコードと対話できることがポイントなので、通常は動的言語が必要です。

考慮すべきいくつかの動的言語の選択:

  • Groovy-より大きなJavaプログラムに組み込むことができる、優れた動的なJavaのような言語。
  • Clojure -JVM用の強力で動的なLisp。一部のmodderが頭を悩ますことは難しいかもしれませんが、非常に強力な言語であり、非常に簡単に埋め込むことができます。ゲームの改造にまだ使用されているのを見ていないが、そうでない理由はない。
  • Lua-非常に人気のあるゲームスクリプト言語。Java内から使用できるJVMのバージョンがあると信じています(ただし、これらを自分で試したことはありません)
  • JavaScript - Rhino経由でJVMで利用可能。多くの人がJavaScriptを知っているので、ゲームのスクリプティングにはかなり堅実な選択肢であり、さらにプロトタイプオブジェクトモデルはゲームのMODに非常によく適合します。

-2

少しずさんですが、Javaでこれを行う簡単な方法があります。あなたがやらなければならないのは、フォルダ内のドットjavaファイルを取得し、このバッチファイルをフォルダに入れて、Runという名前を付けることです:

javac /src/.java Java / src /

注:必要な数のクラスを追加できます。注:最後の行には、拡張子.java、.exe、.bat、ectを含めないでください。

これは基本的に、ゲームが実行されるたびにコードを再コンパイルするだけなので、ゲームのソースが変更された場合、それをコンパイルしてから、新しくコンパイルされたゲームを実行します...


ジェイコブ質問を理解していないと思います。答えを読んで、それがここで議論されていることを理解するのに役立つかどうか見てください。
vikki
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.