0

我对java很陌生,我一直在慢慢地建立一个游戏。我知道有不同的方法来编写对象,但是在推荐之后,我将它们构建为这样的模型:

function object(x,y,z){
    var object={
    a:x,
    b:y,
    c:z
    };
    function doSomething(){
        ...
    }
    return object;
}

一切都很顺利,直到我让我的“玩家”射门。螺栓是对象,每个新创建的螺栓都存储在一个数组中。这里是:

var playerBolts=new Array();

这是他射击时在“玩家”对象内部调用的方法:

function shootBolt(){
    playerBolts.push(bolt(player.playerNum,player.facingLeft,player.x,player.y));
}

螺栓从玩家的当前位置射出,并且根据他所面对的方向,螺栓显然会朝那个方向移动。为了让螺栓知道它必须移动哪个,我在螺栓的对象构造函数中有一个布尔值,称为“面向”(上面的 player.facingLeft)。当我在三元运算符中使用该布尔值来给出方向速度时,它总是给我一个错误:“ReferenceError: facesLeft 未定义”。

这是创建的螺栓对象:

function bolt(fromPlayer,facing,playerX,playerY){
    var bolt={
        playerNum:fromPlayer,
        damage:10,
        facingLeft:facing, //The direction at which the bolt moves, if left, true
        x:playerX, //The x position of the bolt
        y:playerY, //The y position of the bolt
        xSpeed:facingLeft ? -3 : 3, //The horizontal speed at which the bolt is moving
        ySpeed:0, //The vertical speed at which the bolt is moving
        W:3, //The width of the bolt's model
        H:3, //The height of the bolt's model
        color:"red", //The color of the bolt's model
        update:update,
        draw:draw
    };
    function update(){ 
        ...
    }       
    function draw(){
        ...
    }
    return bolt;
}

如果我删除三元运算符并将 xSpeed 设置为预定义的值,则构造函数中的所有其他变量似乎都可以正常传递。所以我真的想知道我在这里做错了什么......我试着做一个 if/else 语句,但我得到:“SyntaxError:missing : after property id”。

我是否必须将所有对象更改为不同的模型,或者有什么我没有看到?如果不清楚,我可以随时提供更多信息或代码。

谢谢?!:P

4

2 回答 2

1

替换facingLeft ? -3 : 3facing ? -3 : 3, 因为您不能引用尚未创建的对象的属性(即“ facesLeft”)。

另请参阅这个简短的演示

于 2013-06-18T08:31:15.417 回答
1

1)您不能在构建对象时引用它。如果您在计算属性值时使用“this”,您将使用当前上下文,而不是新对象:

function someFunc() {
    var functionThis = this;

     var aNewObject = {
                        a : 3,
                        b : this.a *2   // nAn : this.a == functionThis.a                                           
                        }

     // this will be working :
     aNewObject.b = aNewObject.a * 2;
   }

所以当你提到'this.face'时,它会给出:undefined,所以三元运算符总是会切换到falsy case。

在您的情况下,解决方案很简单:使用 faces 参数而不是尝试获取 facesLeft 对象属性:

    xSpeed:facing ? -3 : 3,

2)如果您使用大量螺栓,请考虑在原型上设置方法以加快创建速度并减少垃圾创建。

于 2013-06-18T08:46:58.887 回答