5

いくつかのゲームオブジェクトを保持するLinkGroupというクラスがあります。Rotateを呼び出して、これらのオブジェクトにいくつかの回転変数を設定します。ゲームが更新ループに到達するたびに、回転変数に従ってオブジェクトを回転します。それらが十分に回転した場合、onCompleteコールバックを起動します。

次のコードは機能します...

public void Rotate(){
    _currentRotation = _0;
    _targetRotation = 180; //degrees
    _rotationSpeed = 50;

    try{
        _onComplete = LinkGroup.class.getDeclaredMethod("rotateComplete", null);
    }
    catch(Exception ex){

    }
}

...しかし、これは醜いです。

メソッドrotateCompleteを宣言し、文字列を介して手動でRotateにリンクする必要はありません。Rotateメソッド内でrotateCompleteメソッドを宣言できるように、C#の無名関数に似たものはありますか?

ボーナスポイントについては、「getDeclaredMethod」に必要な例外処理を実装するためのより良い方法はありますか?簡潔さは好みです。

4

3 に答える 3

8

私の理解では、ゲームオブジェクトが回転するたびonRotateComplete()に、クラスでメソッドを呼び出そうとしていると思います。LinkGroupJavaSwingがボタンのクリックやその他のイベントを処理するために使用するパターンを使用できます。これは次のように実行できます。

インターフェイスを定義する

interface IRotateHandler {
    public void onRotateComplete();
}

に変更するRotate()Rotate(IRotateHandler handler)LinkGroupクラスでこのようにゲームオブジェクトを呼び出すことができます。

gameObject.Rotate(new IRotateHandler() {
    public void onRotateComplete() {
        /* do your stuff!
    }
}
于 2012-12-25T04:25:45.130 に答える
4

を使用する必要はありませんgetDeclaredMethod_onComplete(または類似のもの)になりRunnable、匿名クラスを作成するだけです。

public void Rotate(){
    _currentRotation = _0;
    _targetRotation = 180; //degrees
    _rotationSpeed = 50;

    _onComplete = new Runnable() {
            public void run() {
                rotateComplete();
            }
        };
}
于 2012-12-25T04:12:47.730 に答える
0

Java7にはまだクロージャがありません。 Java8はそうします。 したがって、当面の間、Javaでその関数を匿名で作成する方法はありません。

エラー処理に関しては、APIをひと目見ると、RuntimeExceptions 2つと1つをスローしていることがわかりますReflectiveOperationException。これらの考えられる3つの例外すべてを異なる方法でキャッチし、それぞれに基づいて異なるアクションを実行したい場合を除いて、キャッチExceptionすることが最善の策かもしれません。

于 2012-12-25T04:11:03.107 に答える