Пользовательские компоненты в Crafty.js - PullRequest
0 голосов
/ 09 июня 2018

Я новичок в Crafty.js.В настоящее время я работаю над 2D сверху вниз, используя эту работу кадра.Я пытаюсь создать пользовательский компонент, который будет содержать информацию о модуле, такую ​​как здоровье, мана, имя и т. Д. Код моего компонента выглядит следующим образом:

Crafty.c("UnitInfo", {

    init: function() {

        this.bind("EnterFrame", function(){

            console.log("Custom Component Test: " + this.message);

        });

    },

    unitinfo: function(message) {

        this.message = message;

    }

});

Затем я добавил этот компонент в модуль, который находится вв моем случае, объект Enemy:

enemy1 = Crafty.e('Enemy, 2D, Canvas, Color, enemy_default, SpriteAnimation, Solid, Collision, UnitInfo')
         .attr({x: (screenWidth/2) + 150, y: (screenHeight/2) + 150, w: spriteBaseW, h: spriteBaseH, curHealth: 100 })
         .checkHits("Skill")
         .unitinfo("Random Msg")
         .bind("HitOn", function() {

            var rndDmg = 0;

            if(currentSkill==1) rndDmg = skillDamage.skill1;
            else if(currentSkill==2) rndDmg = skillDamage.skill2;
            else if(currentSkill==3) rndDmg = skillDamage.skill3;
            else if(currentSkill==4) rndDmg = skillDamage.skill4;

            rndDmg = randomRange(rndDmg-9,rndDmg);
            this.curHealth -= rndDmg;

            Crafty.e("2D, DOM, Text, Tween")
            .attr({x: this.x, y: this.y})
            .textColor("white")
            .text(rndDmg)
            .textFont({size: "20px"})
            .tween({y: this.y-30, alpha: 0.0}, 2000)
            .bind("TweenEnd", function(){
                this.destroy();
            });

            if(this.curHealth<=0) {

                //this.destroy();
                //console.log("An Enemy was killed!!!!");

            }else{

                console.log("Enemy HP: " + this.curHealth + ", Damage Taken: " + rndDmg);
            }

         })
         .bind("EnterFrame", function() {

            enemyAI(this);

         });

Когда я выполняю код, он показывает мне эту ошибку:

ошибка консоли

Я считаю,что unitinfo () работает правильно, так как в журналах консоли появляется «Случайное сообщение», и оно выполняется каждый кадр.Я просто не понимаю, почему «это» признано неопределенным.Может ли кто-нибудь помочь мне в этом?

1 Ответ

0 голосов
/ 10 декабря 2018

Это потому, что вы пытаетесь вызвать bind для результата unitinfo(), но этот метод не возвращает сущность.

Это фундаментальный аспект javascript, но это определенно ошибкапри реализации пользовательских компонентов в Crafty.Из документов

Имейте в виду, что метод цепочки методов (вызов e.place().color()) возможен только потому, что мы явно возвращаем его из нашего пользовательского метода.Забыв об этом, может быть распространенным источником ошибок, так что имейте это в виду, если вы получаете сложное для закрепления сообщение «метод неопределен».

, то есть когда вы определяете метод,Вы должны явно вернуть this, чтобы использовать его таким образом.

...