Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这是Java接口用来设置事件处理程序的典型方式吗?这种方法有隐藏的缺点吗?_Java_Android_Cocos2d Android - Fatal编程技术网

这是Java接口用来设置事件处理程序的典型方式吗?这种方法有隐藏的缺点吗?

这是Java接口用来设置事件处理程序的典型方式吗?这种方法有隐藏的缺点吗?,java,android,cocos2d-android,Java,Android,Cocos2d Android,嘿,大家好,我对Java还比较陌生,正在寻找一个健全的检查 我一直在研究的Java端口,注意到CCLayer类有内置的Android本机触摸事件挂钩。这很好,但我真正希望的是,像CCSprite这样的对象能够直接响应触摸事件,而不必在层中侦听这些事件,并遍历所有子对象,以找到哪些事件恰好与事件的x/y坐标相交。因此,我认为这将是一个绝佳的机会来测试我对如何设置一些事件处理程序的理解,并创建一个CCSprite的子类,该子类实际上可以监听触摸,而无需通过CCLayer了解它。此外,我希望能够在特定

嘿,大家好,我对Java还比较陌生,正在寻找一个健全的检查

我一直在研究的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 touch dispatcher注册,后者成功地调用了这些CCTouchs函数并向它们传递MotionEvents,如果接口已实例化,则MotionEvents反过来调用my接口函数


这是一种“正确”的方法吗(根据您的需要定义“it”,从使用接口创建事件处理程序到使用Cocos2D,再到编写Java)?有没有我不知道的缺点?这对性能的影响是否比遍历作为CCLayer子对象的所有CCNode对象更糟糕?如果是这样,那怎么可能呢

scriptoclypse。。。我真的不完全理解你的问题,但你没有任何回应,是的,界面和事件非常相似。在这个级别上,我只能用C#。

我认为您已经掌握了正确设置侦听器的基本知识。不过,有些事情我会改变

首先,setter setisTouch。真奇怪。您需要一个侦听器对象来将触摸事件传递到右侧?那么,当您将其传递为真时(如您的示例所示),该setter将做什么?您截取了代码,但是将布尔字段设置为true在这里似乎不正确,因为这会使sprite对象处于不一致的内部状态。我会放弃那个二传手。getter只能评估mTouchable是赋值的还是空的


第二,为什么只局限于一个听众?将mTouchable更改为mTouchable,这是一个iTouchable列表。然后将setTouchable更改为addTouchable,并可能添加removeTouchable和clearTouchables方法。通过这种方式,您可以为必须响应相同事件的不同行为添加多个侦听器。大多数其他事件系统也是这样工作的。然后,您只需更改iTouch即可检查列表是否为空。

感谢您的回复,即使它是C#。我认为,在C世界中,你们有一个优势,C天生就支持委托,而在Java中,委托似乎只有通过一点技巧才能实现。在我上面的代码中为这些侦听器生成一个委托可能是合乎逻辑的下一步。谢谢你的资源!你是怎么得到一个CCSprite的setIsTouchEnabled()的?