2

ねえ、私はまだJavaに比較的慣れておらず、健全性チェックを探しています。

私はCocos2DのこのJavaポートを研究してきましたCCLayerクラスにはAndroidネイティブタッチイベントへの組み込みフックがあることに気づきました。それは素晴らしいことですが、私が本当に望んでいるのは、CCSpriteのようなオブジェクトが、レイヤー内のイベントをリッスンすることなくタッチイベントに直接応答し、すべての子を反復処理して、イベントのx/y座標と交差するものを見つけることです。 。したがって、これは、いくつかのイベントハンドラーを設定し、CCLayerを経由せずに実際にタッチをリッスンするCCSpriteのサブクラスを作成する方法についての私の理解をテストする絶好のチャンスであると考えました。さらに、Android Buttonsのように、明示的にサブクラス化することなく、アドホックベースでさまざまな動作をさまざまなCCSpriteインスタンスに割り当てることができるようにしたかったのです。

これは私が最初のパスで思いついたものです:

// My touch interface for all touchable CCNode objects.

package com.scriptocalypse.cocos2d;

public interface ITouchable {

    boolean onCCTouchesBegan();
    boolean onCCTouchesEnded();
    boolean onCCTouchesMoved();

}

そして今、コールバックにITouchableインターフェースを使用するクラス...

public class CCTouchSprite extends CCSprite implements CCTouchDelegateProtocol {

    protected ITouchable mTouchable;

    public void setTouchable(ITouchable pTouchable){
        mTouchable = pTouchable;
        boolean enable = mTouchable != null;
        this.setIsTouchEnabled(enable);
    }

    public void setIsTouchable(boolean pEnabled){
            // code to enable and disable touches snipped...
    }



    /////
    //  And now implementing the CCTouchDelegateProtocol...
    /////
    public boolean ccTouchesBegan(MotionEvent event) {

        Log.d("hi there", "touch me");
        if(mTouchable != null){
        mTouchable.onCCTouchesBegan();
        }
        return CCTouchDispatcher.kEventHandled;  // TODO Auto-generated method stub
    }

    public boolean ccTouchesMoved(MotionEvent event) {

        if(mTouchable != null){
            mTouchable.onCCTouchesMoved();
        }
        return CCTouchDispatcher.kEventIgnored;  // TODO Auto-generated method stub
    }

    public boolean ccTouchesEnded(MotionEvent event) {
        Log.d("hi there", "not touch me");
        if(mTouchable != null){
            mTouchable.onCCTouchesEnded();
        }
        return CCTouchDispatcher.kEventIgnored;  // TODO Auto-generated method stub
    }

}

そして最後に、クラスをインスタンス化し、インターフェースを実装します...

final CCTouchSprite sprite = new CCTouchSprite(tex);
sprite.setIsTouchEnabled(true);
sprite.setPosition(CGPoint.ccp(160,240));
sprite.setTouchable(new ITouchable(){
    @Override
    public boolean onCCTouchesBegan() {

        Log.d("SWEET SUCCESS", "I got a touch through my interface!");

        return true;
    }

    @Override
    public boolean onCCTouchesEnded() {
        Log.d("SWEET SUCCESS", "You stopped touching my interface!");
        sprite.runAction(CCRotateBy.action(1, 360));
        return false;
    }

    @Override
    public boolean onCCTouchesMoved(){
        Log.d("SWEET SUCCESS", "You moved the touch");
        return false;
    }
});

したがって、これはすべて機能します。サブクラスはCocos2Dタッチディスパッチャーに正常に登録されます。Cocos2DタッチディスパッチャーはこれらのccTouches関数を正常に呼び出し、MotionEventsを渡します。これにより、インターフェイスがインスタンス化されている場合は、インターフェイス関数が呼び出されます。

これはそれを行うための「適切な」方法ですか(インターフェイスを使用してイベントハンドラーを作成することから、Cocos2Dを操作すること、Javaを作成することまで、適切と思われるように「それ」を定義します)?私が気付いていないこれの欠点はありますか?これは、CCLayerの子であるすべてのCCNodeオブジェクトを反復処理するよりも、パフォーマンスがどういうわけか悪いですか?もしそうなら、それはどうして可能性がありますか?

4

2 に答える 2

1

scriptoclypse ...私はあなたの質問を完全には理解していませんが、あなたは何の応答もありませんでした、そしてはいインターフェースとイベントは非常に似ています。このレベルでは、C#でのみ応答できます。

于 2011-03-04T00:51:41.227 に答える
1

リスナーを正しく設定するための基本はわかっていると思います。しかし、私が変更することがいくつかあります。

まず、セッターsetIsTouchable。それは奇妙だ。タッチイベントを右に渡すにはリスナーオブジェクトが必要ですか?それで、あなたがそれを真に渡すとき(あなたの例がそうであるように)、このセッターは何をするつもりですか?コードをスニッピングしましたが、ブールフィールドをtrueに設定すると、スプライトオブジェクトが一貫性のない内部状態になるため、ここでは正しく表示されません。そのセッターを落とすだけです。ゲッターは、mTouchableが割り当てられているかnullであるかを評価できます。

次に、なぜリスナーを1人に制限するのですか?iTouchablesのリストであるmTouchablesをmTouchablesに変更します。次に、setTouchableをaddTouchableに変更し、場合によってはremoveTouchableメソッドとclearTouchablesメソッドを追加します。このようにして、同じイベントに応答する必要があるさまざまな動作に対して複数のリスナーを追加できます。これは、他のほとんどのイベントシステムも同様に機能する方法です。次に、isTouchableを変更して、リストが空かどうかを確認します。

于 2011-10-15T22:50:07.143 に答える