这通常是如何使用Java接口来设置事件处理程序的,这种方法是否存在隐藏的缺点?

嘿所有,我仍然相对较新的Java,并寻求理智检查。 我一直在研究这个Cocos2D的Java端口,并注意到CCLayer类内置了Android原生触摸事件的钩子。这很好,但我真正喜欢的是像CCSprite这样的对象直接响应触摸事件而不必在层中侦听这些事件并遍历所有子节点以找到哪些事件恰好与事件的x / y坐标相交。所以我认为这将是一个完美的机会来测试我对如何设置一些事件处理程序的理解,并使CCSprite的子类实际上监听触摸而无需通过CCLayer来了解它。此外,我希望能够在临时基础上为不同的CCSprite实例分配不同的行为,而无需进一步明确子类化,就像Android按钮不需要被子类化只是为了给它们触摸事件的处理程序。 这是我第一次通过时提出的:
// 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触摸调度程序,它成功调用了那些ccTouches函数并将它们传递给MotionEvents,如果接口已经实例化,它又调用我的接口函数。 这是“正确”的方法(根据您的需要定义“它”,从使用接口创建事件处理程序到使用Cocos2D,到编写Java)?我不知道这有什么弊端吗?对于性能而言,这是否比迭代通过CCLayer的所有CCNode对象更糟糕?如果是这样,那怎么可能呢?     
已邀请:
我认为你已经掌握了正确设置监听器的基础知识。虽然我会改变一些事情。 首先,setter setIsTouchable。有点奇怪。你需要一个监听器对象来传递触摸事件吗?那么当你传递它时,这个setter会做什么呢(就像你的例子那样)?你剪断了代码,但是将布尔字段设置为true似乎不正确,因为它会将sprite对象置于不一致的内部状态。我会放弃那个二传手。 getter只能评估mTouchable是否已分配或为null。 第二,为什么要限制自己只听一个听众?将mTouchable更改为mTouchables,作为ITouchables列表。然后将setTouchable更改为addTouchable,并可能添加removeTouchable和clearTouchables方法。这样,您可以为必须响应相同事件的不同行为添加多个侦听器。这也是大多数其他事件系统的工作方式。然后,您只需更改isTouchable以检查列表是否为空。     
scriptoclypse ...我真的不完全理解你的问题,但你没有任何回应,是的接口和事件是非常相似的。在这个级别我只能用C#回复。     

要回复问题请先登录注册