大家好,我对 Java 还是比较陌生,正在寻找健全性检查。
我一直在研究Cocos2D的这个 Java 端口并注意到 CCLayer 类具有 Android 原生触摸事件的内置挂钩。这很好,但我真正想要的是像 CCSprite 这样的对象直接响应触摸事件,而不必在层中监听这些事件并遍历所有子级以查找哪些子级恰好与事件的 x/y 坐标相交. 所以我认为这将是一个完美的机会来测试我对如何设置一些事件处理程序并创建一个 CCSprite 的子类的理解,该子类实际上可以监听触摸,而无需通过 CCLayer 了解它。此外,我希望能够临时为不同的 CCSprite 实例分配不同的行为,而无需进一步明确子类化,就像 Android Buttons 没有的那样
这是我在第一次通过时想到的:
// 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 对象更糟糕?如果是这样,那怎么可能呢?