Cocos Creator js анимированный спрайт

Я анимировал спрайт, используя лист спрайтов и функцию обновления, например:

Примечание. Я перетащил plist в поле атласа узла спрайта (того же узла, к которому прикреплен скрипт monster.js) в пользовательском интерфейсе Ccos Creator.

//monster.js
onLoad: function(){
// change monsters face
            this.faces['1'] =  'monster1';
            this.faces['2'] =  'monster2';
            this.faces['3'] =  'Rmonster1';
            this.faces['4'] =  'Rmonster2';

}
    update: function (dt) {


    this.timekeep += dt;

    if(this.timekeep > 0.1){

var self = this;
          cc.loader.loadRes('monsters', cc.SpriteAtlas, function (err, atlas) {
  self.getComponent(cc.Sprite).spriteFrame = atlas.getSpriteFrame(self.faces[self.monstersN]);
});     

                this.timekeep = 0;

                this.monstersN++;
                if(this.monstersN > 4){

                    this.monstersN = 1;

                }
            }

На самом деле работает нормально. Я уже думал, что должен экспортировать cc.loader.loaderRes в функцию onLoad и сохранять атлас как глобальную переменную вместо загрузки каждый раз при вызове обновления.

Однако… учитывая встроенные функции анимации, это не может быть правильным решением. Итак, я попробовал это:

onLoad: function () {
            // change monster face
            this.faces['1'] =  'monster1';
            this.faces['2'] =  'monster2';
            this.faces['3'] =  'Rmonster1';
            this.faces['4'] =  'Rmonster2';
            var self = this;
                  cc.loader.loadRes('monsters', cc.SpriteAtlas, function (err, atlas) {
var sprite = self.getComponent(cc.Sprite);

        var animFrames = [];
 for (var i = 1; i < 4; i++) {   
     var spriteFrame = atlas.getSpriteFrame(self.faces[i]);
        var animFrame = new cc.AnimationFrame();
            animFrame.initWithSpriteFrame(spriteFrame, 1, null);
        animFrames.push(animFrame);
 }      
 var animation = sprite.Animation.create(animFrames, 0.2, 100);
    var animate   = sprite.Animate.create(animation); 

    sprite.runAction(animate); 
              });    


        },

Я получаю эту ошибку:

cc.AnimationFrame не является конструктором

Итак, я попробовал это:

onLoad: function () {

            // change monster face
            this.faces['1'] =  'monster1';
            this.faces['2'] =  'monster2';
            this.faces['3'] =  'Rmonster1';
            this.faces['4'] =  'Rmonster2';
            var self = this;
                  cc.loader.loadRes('monsters', cc.SpriteAtlas, function (err, atlas) {
self.atlasA = atlas;
              });    

 var sprite = this.getComponent(cc.Sprite);

        var animFrames = [];
 for (var i = 1; i < 4; i++) {   
     var spriteFrame = this.atlasA.getSpriteFrame(this.faces[i]);
    var animFrame = new cc.AnimationFrame();
        animFrame.initWithSpriteFrame(spriteFrame, 1, null);
    animFrames.push(animFrame);
 }      
 var animation = sprite.Animation.create(animFrames, 0.2, 100);
var animate   = sprite.Animate.create(animation); 

sprite.runAction(animate); 

        },

Я получаю эту ошибку:

Не удается прочитать свойство «getSpriteFrame» неопределенного

Как я могу использовать cc.animate для изменения спрайта, используя имеющуюся у меня таблицу спрайтов. Все, чего я хочу добиться, - это перемещаться по plist в том порядке, в котором изображения находятся в plist, повторяя это до тех пор, пока монстр не будет возвращен в пул, из которого он пришел.


person David Coleman    schedule 06.04.2018    source источник
comment
Пожалуйста, прочитайте При каких обстоятельствах я могу добавить «срочно» или другие подобные фразы к моему вопросу, чтобы получить более быстрые ответы? - Подводя итог, можно сказать, что это не идеальный способ обращения к волонтерам и, вероятно, контрпродуктивно для получения ответов. Пожалуйста, воздержитесь от добавления этого к своим вопросам.   -  person halfer    schedule 07.04.2018
comment
SO больше не место для получения ответов. :-(   -  person David Coleman    schedule 07.04.2018
comment
Я не рекомендую пассивно-агрессивные замечания, направленные на то, чтобы заставить людей помочь вам. Идеальный ответ на мое шаблонное замечание: «Извините, вы правы: я не буду добавлять это снова». Если вы помните, что большинство читателей здесь добровольцы, за исключением нескольких сторонников технологий, это очень вам поможет. Здесь любят помогать, но никто не обязан.   -  person halfer    schedule 07.04.2018
comment
Я знаю, что трачу свое время здесь, но я все равно понятия не имею, о чем вы говорите. Очевидно, я поставил срочный в своем посте. Я не вижу, куда я это положил. В любом случае, я нашел гораздо лучшие места, где можно получить помощь, так что делайте с этим, что хотите. Я оставлю вас наслаждаться этим самим :-) Просто чтобы уточнить, никакой агрессии нет вообще. просто разочарование, потому что мне нравилось это место.   -  person David Coleman    schedule 09.04.2018
comment
См. историю редактирования здесь. Дэвид, не принимай здешние стандарты и рекомендации на свой счет, они существуют не просто так. Конечно, вы всегда можете опубликовать на Meta, если у вас есть предложения о том, как сайт мог бы работать лучше - просто будьте готовы ожидать от установленные пользователи.   -  person halfer    schedule 09.04.2018
comment
Как бы то ни было, ваш вопрос не кажется таким уж плохим. Области, которые вам нужно улучшить (и я имею в виду это конструктивно): форматирование Markdown, корректность регистра и ожидания добровольцев.   -  person halfer    schedule 09.04.2018


Ответы (1)


Вот решение для тех, кто все еще может искать .....

cc.AnimationClip.createWithSpriteFrames([sf1, sf2, ...], fps)
person David Coleman    schedule 09.05.2018