【问题标题】:A little bit of trouble with 2D arrays in javascriptjavascript中的二维数组有点麻烦
【发布时间】:2015-02-06 20:06:23
【问题描述】:

出于学习目的,我正在尝试将我用 Java 制作的基本游戏转换为 HTML5;但是我遇到了一些麻烦,我会提供一个可运行的示例,但是我使用的是 Phaser 引擎,并且我的代码非常分散。我正在尝试在 Javascript 中遵循 OO 方法,无论哪种方式都是我的代码。

创建数组:

function newArray2D(rows, columns) {
    var x = new Array(rows);
    for(var i = 0; i < rows; i++) {
        x[i] = new Array(columns);
    }
    return x;
}

-

tiles = newArray2D(Math.ceil(game.width / 64), Math.ceil(game.height / 64));

填充数组:

for(var x = 0; x < tiles.length; x++) {
    for(var y = 0; y < tiles[0].length; y++) {
        tiles[x][y] = new Tile(x * 64, y * 64);
    }
}

Tile“类”:

var x, y, width, height;

function Tile(x, y) {
    this.x = x;
    this.y = y;
    this.width = 64;
    this.height = 64;
}

function hovering(mouseX, mouseY) {
    if((mouseX > x && mouseX < (x + width)
            && mouseY > y && mouseY < (y + height))) {
        return true;
    }
    return false;
}

错误:

Uncaught TypeError: undefined is not a function

导致错误的代码:

for(var x = 0; x < tiles.length; x++) {
    for(var y = 0; y < tiles[0].length; y++) {
        if(tiles[x][y].hovering(game.input.mousePointer.x, game.input.mousePointer.y)) {
            tileDebug.text = 'Tile('+x+','+y+')';
        }
    }
}

触发错误的代码行:

if(tiles[x][y].hovering(game.input.mousePointer.x, game.input.mousePointer.y)) {

我不确定问题是什么,因为调试控制台并没有提供比“未定义不是函数”更多的信息.​​.....但我调用的函数是“悬停”,不是是吗?也许我创建数组错误?

【问题讨论】:

    标签: javascript jquery arrays html phaser-framework


    【解决方案1】:

    您尚未将hovering 方法分配给您的Tile“类”的prototype。试试这个:

    Tile.prototype.hovering = function(mouseX, mouseY) {
        if((mouseX > this.x && mouseX < (this.x + this.width)
                && mouseY > this.y && mouseY < (this.y + this.height))) {
            return true;
        }
        return false;
    }
    

    或者,您可以按原样保留hovering 的定义,并将Tile 对象作为附加参数传入。

    【讨论】:

    • 谢谢,你编辑的时候我正要问原型链接,现在问题是x/y也是未定义的,Called(undefined,undefined)是在悬停方式运行console.log("Called("+x+","+y+")");时打印的.
    • 此外,与代码本身有点无关,但通过一些巧妙的数学运算,您可以计算悬停在哪个图块上,而无需遍历所有图块(这可能效率低下)。
    • 谢谢!原型链接没有很好地解释为什么使用'this'关键字,在Java中它用于获取类范围内的变量实例,但这不是必需的,它在这里是否具有相同的功能,但是是必需的吗?
    • 是的,可能可以,我只是用它来确保在开始渲染之前我已经把所有东西都布置好了。
    • Javascript 中的 this 具有与其 Java 等价物类似的功能,但确实是必需的。
    【解决方案2】:

    您已将hovering 创建为全局 JS 命名空间中的函数。

    尝试将函数的声明更改为:

    newArray2D.hovering = function (mouseX, mouseY) {
        if((mouseX > x && mouseX < (x + width)
                && mouseY > y && mouseY < (y + height))) {
            return true;
        }
        return false;
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-31
      • 1970-01-01
      • 2011-04-29
      • 1970-01-01
      • 2023-03-23
      • 2010-11-20
      • 1970-01-01
      相关资源
      最近更新 更多