javascript - 在函数中创建拉斐尔元素时未定义?

标签 javascript undefined raphael collision

我正在使用 Raphael 元素创建一个迷你游戏,该元素旨在当玩家碰到“子弹”时创建一个弹出窗口,到目前为止,如果我正常创建每个元素,代码就会相应地工作。例如,这个:

let playerCircle = paper.circle(100, 3*pHeight/10, 15).attr({
    "fill": "black"
});

let enemyShip = paper.circle(100, 100, 15).attr({
    "fill": "red",
    "stroke": "black",
});

但是,我希望“enemyShip”在单击玩家圆圈时生成,并且我有以下当前代码:

let spawnEnemy = function(ev){
    let posX = random(pWidth, pWidth+30);
    let posY = random(0, 3*pHeight/5-30);

    let enemyShip = paper.circle(posX, posY, 15).attr({
    "fill": "red",
    "stroke": "black",
    });

    enemyShip.animate({
        "cx": posX-pWidth-60,
    }, 1000, "linear", function(){enemyShip.remove()})
};

但是,当我这样做时,会导致“未捕获的引用错误:敌人船未定义”,有什么方法可以解决这个问题吗?

不确定这些信息是否有帮助,但这是注册碰撞的代码:


let collision = function(a, b){
    a = {
        "x": a.attr("cx"),
        "y": a.attr("cy"),
    };

    b = {
        "x": b.attr("cx"),
        "y": b.attr("cy"),
    };

    let d = distance(a, b);

    if (d < playerCircle.attr("r") + enemyShip.attr("r")){
        alert("hi");
    };
};

最佳答案

这可能是一个范围问题。如果你在spawnEnemy函数之外声明enemyShip,它可能会起作用。因为碰撞无法了解该变量的本来面目。

我还会稍微更改一下你的碰撞函数,并使其适用于任何 2 个对象/实体,因此不必强制使用playerCircle 和敌人船,只需使用 a 和 b 及其属性,而不需要任何硬编码该函数中的引用。

关于javascript - 在函数中创建拉斐尔元素时未定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66731132/

相关文章:

具有多个分组的 Javascript 网格

javascript - 未定义为局部范围内的有效变量名

PHP - 定义时调用未定义的函数

javascript - 在不使用 Raphael javascript 库中的 boundingBox 函数的情况下获取文本的大小

jquery - 拉斐尔设置事件

java - 单击 Play Framework 上的按钮后强制下载文件

javascript - 在 div 上附加多个图像

javascript - 如果TR的值与jquery中的另一个TR相似,如何隐藏TR?

ruby-on-rails - 未定义方法 `formats=' 用于 ... Controller :Class

javascript - Raphael.draggable 不再适用于 Raphael