0

我正在使用 cocos2d-js v3.0,我正在尝试在 EventListener 中使用 this.sprite 对象。但是我知道 this.sprite 是未定义的。

如果我在 init 函数中创建 var sprite 并只传递 sprite 它工作正常。但是当我在 init 函数之外创建 var sprite 并使用 this.sprite 时,我得到了未定义的。

var roomMap = cc.Layer.extend({

sprite:null


ctor:function(){
    this._super();
    this.init();
},

init: function () {
    this._super();
    //create tile map
    this.mainMap = cc.TMXTiledMap.create(res.Main_tmx);

    var cache = cc.spriteFrameCache;
    cache.addSpriteFrames(res.player_plist, res.player_png);

    this.sprite = new cc.Sprite.create("#player-stand-f-0");
    this.sprite.setPosition(new cc.Point(300,300));
    this.addChild(this.sprite);

    var listener = cc.EventListener.create({

        event: cc.EventListener.MOUSE,

        onMouseUp: function (event){
            var sprite_action = cc.MoveTo(2,cc.p(event.getLocationX(),event.getLocationY()));
            console.log(this.sprite);
            //this.sprite.runAction(sprite_action);
            //this.addChild(sprite_action);

        }
    });

    cc.eventManager.addListener(listener, this.sprite);

这更像是我遇到的一个 javascript 问题。

4

2 回答 2

3

发生这种情况是因为this在事件侦听器内部,是指事件侦听器本身,而不是层。

尝试这个:

var target = event.getCurrentTarget();
console.log(target);
console.log(target.sprite);

这应该让您清楚地了解正在发生的事情:如果您正在单击精灵对象,那么target应该等于sprite(因此target.sprite将是未定义的),如果您正在单击图层,那么target将是图层,并且target.sprite将是您预期的。

推荐阅读这篇文章,进一步了解 cocos2d v3 中新的事件管理器。

于 2014-09-18T14:46:29.917 回答
-1

首先,我认为这条线是错误的

this.sprite = new cc.Sprite.create("#player-stand-f-0");

“新”是不必要的

当你说“在初始化函数之外”时,我不知道它在哪里。因为 ctor 函数会首先被调用,一旦你在使用前没有创建它,它将是未定义的。你可以试试

sprite:cc.Sprite.create("player-stand-f-0")
于 2014-09-18T02:34:50.680 回答