我正在使用cocos2d-js v3.0,我试图在EventListener中使用this.sprite对象。但是我知道this.sprite是未定义的。
如果我在init函数中创建var sprite并且只是传递sprite就可以了。但是当我在init函数之外创建var sprite并使用this.sprite时,我得到了undefined。
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问题。
答案 0 :(得分:3)
它正在发生,因为事件监听器中的this
指的是事件监听器本身,而不是层。
试试这个:
var target = event.getCurrentTarget();
console.log(target);
console.log(target.sprite);
这可以让您清楚地知道发生了什么:如果您点击精灵对象,那么target
应该等于sprite
(因此target.sprite
将未定义),如果您点击图层,则target
将成为图层,target.sprite
将是您所期望的。
我建议您查看this article以进一步了解cocos2d v3中的新事件管理器。
答案 1 :(得分:-1)
首先,我认为这一行是错误的
this.sprite = new cc.Sprite.create("#player-stand-f-0");
"新"是不必要的
当你在初始化功能之外说'#34;时,我不知道它在哪里。 因为首先调用ctor函数,一旦你在使用之前没有创建它,它将是未定义的。你可以尝试
sprite:cc.Sprite.create("player-stand-f-0")