0

編集私は自分の質問をより明確にしようとしました。

以下のように MyGLRendering クラスがあり、そこからすべてのロジック更新を行うメソッドがあります。ご覧のとおり、作成したオブジェクトを介してスプライトの X 座標にアクセスしています。したがって、'x' 変数は Sprite クラス内にあります。

私がしたいのは、コードを更新メソッドから独自のクラスに移動することだけです。私のレンダリングメソッドからそれを呼び出します。

public class MyGLRenderer extends Activity implements GLSurfaceView.Renderer {
    Sprite sprite1;
    public MyGLRenderer() {
        sprite1 = new Sprite();
     }


    //Now I can access and update the X variable from from this class like so:

    public void LogicUpdate() {
        sprite1.X = 0;   //I update all my sprites positions here - I want to move all this code into it's own class
    }
}

}

コードを新しいクラスに移動しようとすると、上記のように変数にアクセスできません。

sprite1.X = 0;

どうすればこれを行うことができますか?

4

2 に答える 2

1
// Sprite.java
public class Sprite {
    int spriteX; // this will implicitly set 0 here

    void setX(int newX) {
        this.spriteX = newX;
    }
}

// Logic.java
public class Logic {
    final MyGLRenderer renderer;
    public Logic(MyGLRenderer renderer) {
        this.renderer = renderer;
    }

    void update() {
        this.renderer.sprite1.setX(1);
    }
}

// MyGLRenderer.java
// IMHO it is not a good idea to have the Activity implement Renderer, but that's 
// whole another story
public class MyGLRenderer extends Activity implements GLSurfaceView.Renderer {
    final Sprite sprite1;
    public MyGLRenderer() {
        sprite1 = new Sprite();
    }
}

上記のコードでは、クラスのオブジェクトを作成するために、それLogicに渡す必要がありますMyGLRendererSpriteで使用できるオブジェクトへの参照がありますLogic。を呼び出すとupdate()、インスタンスLogicの値が更新されます。上記のコードは、これらのクラスがすべて同じパッケージにある場合にのみ機能します。そうでない場合は、フィールドとフィールド、およびメソッドを静的に宣言する必要があります。spriteXSpriteLogic.rendererMyGLRenderer.sprite1Sprite.setX

于 2013-05-06T21:08:22.017 に答える
0

1 つの静的クラスを作成し、その中にレンダラー オブジェクトを配置して、他のすべてのクラスがこのレンダラー オブジェクトにアクセスできるようにします。

SomeStaticClass クラス ->

public class SomeStaticClass{

    public static SomeClass objectToShare; // You can also have getter & setter, getter will always check if objectToShare is initialized or not, so that it will prevent NPE

    public static SomeClass getObjecctToShare() {
         if(objectToShare != null){
              return objectToShare;
         }
         //Init objectToShare here
         return objectToShare;
    }
}

現在、他のクラス(ロジッククラスとしましょう)->

SomeStaticClass.getObjectToShare().something = something;
于 2013-05-06T19:03:31.873 に答える