0

システムに問題\設計上の問題があります。私がいたところから始めます:

私はJavaでゲームエンジンを作成していました.ゲームコンポーネントは、ゲームのmain\singletonインスタンス(ワールド、ファイルシステムなど)を参照するために一般的に必要でした. コードでファイルを開く必要があるときはいつでも、次のように記述します。

Global.game.getFilesystem().openFile(...)

この Game オブジェクトを絶えず渡す実用的な方法はまったくありません。私はペストのようなシングルトンのデザインパターンを避けてきましたが、むしろこれを回避したいと思っています...

とにかく、これで GameCore ライブラリができました。私は今、それを使ってゲームを実装しています。明らかに、その過程でゲームを拡張したいと考えています。問題は、私のクラスが同じ種類のリソースにアクセスするための便利な方法を必要としているということです。これはすべて問題ありませんが、Global.game は抽象クラス Game としてしか参照できないため、Global.game を使用できません (たとえそれがMyRpgGame のインスタンスが含まれています)、タイプ MyRpgGame が必要になる場合があります。確かに、型キャストはできますが、コード全体で乱雑で一定です。だから私が思いついた唯一の解決策は(私は本当に好きではありませんが...)、次のようなものです:

Game.game や RpgGame.game などでゲームを参照する場所...

public abstract class Game
{
    ...
    public static Game game = null;

    public Game()
    {
        if(game != null)
            throw new InitializationException("Cannot instantiate multiple instances of game.");
        game = this;

     ...
}

そして、私の RpgGame では、Game で静的フィールド ゲームを非表示にします。

public class RpgGame extends Game
{
    public static RpgGame game = null;

    public RpgGame()
    {
        if(game != null)
            throw new InitializationException("Cannot instantiate multiple instances of game.");

        game = this;
    }
4

2 に答える 2

2

必要なのは依存性注入のサポートです。依存性注入は特定のクラスではなくインターフェイスに基づくことができ、それらを渡す必要がないため、すべての問題が解消されます-それらは単に自動的に注入されます.

Google GuiceまたはSpring Frameworkを確認してください。Google Guice はより軽量ですが、Spring Framework は多くの組み込み機能を提供し、巨大なエコシステムを備えています。

于 2013-07-25T19:30:23.977 に答える
0

これが私がjavascriptで書いている私のゲームでやっていることです。これは、Java では慣用的でない場合があります。関数型プログラミング スタイルでゲームを作成しようとしていることに注意してください。仕組みは次のとおりです。 という名前のグローバル変数が 1 つありますgameState。次のような 1 つのメソッドでのみ割り当てられます。

applyTick()
    global.gameState = tick(global.gameState)
    renderGameState(gameState)

ゲームループが何度も呼び出さapplyTick()れます。このメソッドを除くすべてのメソッドで、ローカル gameStateインスタンスを処理します。私のメソッドのほとんどは、次のような署名を持っています。

 gameState = methodName(gameState)

このようにして、操作の順序を変更するのは非常に簡単です。

のような新しいデータが必要な場合は、score,それをオブジェクトに追加するGameStateだけで、気にするメソッドだけscoreを変更する必要があります。GameStateオブジェクトにロジックを入れていないことに注意してください。それは純粋にデータです。

これが良い方法なのか悪い方法なのかはわかりません。私自身、懐疑的です。これがメンテナンスの悪夢になり、自分のプログラムについて推論するのが難しくなるだろうと、私は考え続けています。しかし、これまではまったく逆でした。この「パターン」は、3 か月以上うまく機能しています。

于 2013-07-25T19:30:21.140 に答える