Cocos2d js 触摸事件

3

我正在使用cocos2d-js构建一个应用程序,但是我遇到了键盘事件监听的问题。我期望会有一个名为setKeyboardEnabled的方法存在,但是当我调用它时,出现了一个错误,提示setKeyboardEnabled不是一个函数,我是否遗漏了什么?

var AnimationLayer = cc.Layer.extend({
ctor : function() {
    this._super();
    this.setKeyboardEnabled(true);
},


onKeyDown : function(key) {
   cc.log("action");
}
...
...
)}

当我尝试监听触摸事件时,同样的事情也会发生。

我看到一篇帖子说这种方法在这里不再可用http://discuss.cocos2d-x.org/t/looking-for-setkeyboardenabled-substitute/9744 - Pablo Jomer
1个回答

7
在Cocos2D v3中,事件处理的方式发生了变化。如果您想要详细了解整个系统,请阅读Cocos2d-Html5 v3.0中的新事件管理器

简而言之,如果您曾经使用过:

var AnimationLayer = cc.Layer.extend({
    ctor : function() {
        this._super();
        this.setKeyboardEnabled(true);
    },

    onKeyDown : function(key) {
       cc.log("action");
    }
    ...
    ...
)}

你需要将其转换为类似以下的形式:

var AnimationLayer = cc.Layer.extend({
    ctor : function() {
        this._super();

        cc.eventManager.addListener({
            event: cc.EventListener.KEYBOARD,
            onKeyDown : function(key) {
                cc.log("action");
            }
        }, this);
    },        

    ...
    ...
)}

起初听起来可能有点复杂,但这种新机制允许您将这些事件侦听器附加到任何类型的cc节点上,而不仅仅是层。因此,例如,当鼠标在其上方时,您可以执行类似于以下内容来使精灵淡出:

var hoverHandler = cc.EventListener.create({
    event: cc.EventListener.MOUSE,
    onMouseMove: function (event) {
      var target = event.getCurrentTarget();
      var locationInNode = target.convertToNodeSpace(event.getLocation());
      var s = target.getContentSize();
      var rect = cc.rect(0, 0, s.width, s.height);

      if (cc.rectContainsPoint(rect, locationInNode)) {
        cc.log("It's hovering! x = " + locationInNode.x + ", y = " + locationInNode.y);
        target.opacity = 180;
        return true;
      } else {
        target.opacity = 255;
        return false;
      }
  }
});

var MyLayer = cc.Layer.extend({
    init: function() {
        this._super();

        var mySpriteThatFadesWhenHovered = cc.Sprite.create(...);
        this.addChild(mySpriteThatFadesWhenHovered);

        cc.eventManager.addListener(hoverHandler.clone(), mySpriteThatFadesWhenHovered );
    }
)}

谢谢,这种处理用户事件的方式似乎更加灵活。 - Edgar Zakaryan
是的,注意我甚至都不想尝试在v2.3中编写那个悬停效果的代码,因为这对于做一些简单的事情来说太费力了。 PS:如果您对此满意,请记得将我的帖子标记为答案,以便未来的搜索者可以轻松找到它! - Sebastián Vansteenkiste

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接