ねえ、私はまだ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オブジェクトを反復処理するよりも、パフォーマンスがどういうわけか悪いですか?もしそうなら、それはどうして可能性がありますか?