Расширение класса Cocos2d-js

Я пытаюсь расширить класс cc.LabelTTF в cocos2d-js. У меня проблемы со следующим кодом:

var FlowingText = cc.LabelTTF.extend({
    update : function(dt) {
        console.log("update. dt:"+dt);
    }
}); 

Я ожидаю, что FlowingText преуспеет во всех свойствах cc.LabelTTF, но следующий код дает сбой:

FlowingText.create("", "r-mplus-1c-m.ttf", 24);

давая мне ошибку, что

Uncaught TypeError: undefined is not a function

Код работает нормально, если вместо этого я делаю:

cc.LabelTTF.create("", "r-mplus-1c-m.ttf", 24);

функция «создать» является свойством cc.LabelTTF, которое, я думаю, я расширил, но я получаю эту ошибку. Есть идеи, что происходит?


person dk123    schedule 28.07.2014    source источник


Ответы (2)


Это известная проблема.

Когда вы используете extend для создания собственного класса из класса cc, метод create не наследуется. Если вы взглянете на любой из классов cocos2d, вы заметите, что метод create всегда добавляется к прототипу, и по какой-то причине это обходит механизм расширения.

Вкратце: вам нужно переопределить метод ctor или написать свой собственный метод create.

Это стандартный способ, которым это делается в файлах кода coco:

var FlowingText = cc.LabelTTF.extend({
    ctor: function(text, font, size){
        this._super(text, font, size);
        //possibly do other stuff here if necesary
    },
    update : function(dt) {
        console.log("update. dt:"+dt);
    }
}); 

И вы можете использовать это с:

var myFT = new FlowingText("asdf", "r-mplus-1c-m.ttf", 24);

И/или вы можете сделать это:

FlowingText.create = function(text, font, size) {
    return new FlowingText(text, font, size);
};

И используйте это так:

var myFT = FlowingText.create("asdf", "r-mplus-1c-m.ttf", 24);

Дополнительно: обратите внимание, что cc.LabelTTF.create() и new cc.LabelTTF() могут не совпадать. Когда вы переопределяете метод ctor, вы меняете то, что он вызывает с помощью new MyClass(). Если вы попытаетесь переопределить метод create в своем extend, вы получите сообщение об ошибке (по крайней мере, так было в прошлый раз, когда я пытался).

person Sebastián Vansteenkiste    schedule 28.07.2014
comment
Я рад, что это произошло! И спасибо @musikov! Это были какие-то глупые ошибки с моей стороны '^^ - person Sebastián Vansteenkiste; 31.07.2014

попробуйте так:

var FlowingText = $.extend(cc.LabelTTF, {
 update : function(dt) {
        console.log("update. dt:"+dt);
    }})

теперь должно работать FlowingText.create("", "r-mplus-1c-m.ttf", 24);

ДЕМО

person Mindaugas Večkys    schedule 28.07.2014
comment
Я взглянул на вашу демонстрацию, и она не совсем соответствует тому, что вы думаете (плюс у вас есть небольшие синтаксические ошибки, или, скорее, предупреждения). Кроме того, вы не отражаете, как работает структура кода классов cocos2d-html5, взгляните на мой ответ для уточнения. - person Sebastián Vansteenkiste; 28.07.2014