0

我是 Crafty.js 的新手。我目前正在使用这个框架工作一个 2D 自上而下的 RPG。我正在尝试创建一个自定义组件,该组件将包含单元的信息,例如 Health、Mana、Name 等。我的组件代码如下:

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() 工作正常,因为控制台日志上出现了“随机消息”,并且每帧都在执行。我只是不明白为什么“这个”被认为是未定义的。有人可以帮我吗?

4

1 回答 1

0

这是因为您试图在 的结果上调用 bind unitinfo(),但该方法不返回实体。

这是 javascript 的一个基本方面,但在 Crafty 中实现自定义组件时绝对是一个问题。从文档

请记住,方法链接技术(调用e.place().color())仅是可能的,因为我们从自定义方法中显式返回 this。忘记这样做可能是错误的常见来源,因此如果您收到难以确定的“方法未定义”消息,请记住这一点。

即,当您定义一个方法时,您必须显式返回this才能以这种方式使用它。

于 2018-12-10T02:56:53.220 回答