1

使用easeljs 和box2d,我创建了几个相互碰撞的对象。使用以下代码,我在屏幕上创建了一个框:

var b = new Box(400,0); // pass xPos and yPos
stage.addChild(b.view);

在我的脚本中的某个点,盒子与一个圆圈碰撞,当这种情况发生时,一个三角形必须向盒子吐温。所以我需要盒子的位置!在我的Box.js我有以下功能:

function getX(){
    var xPos = this.body.GetPosition().x * SCALE;
    return xPos;
}

我已经为以下函数替换了相同的函数:

function getX(){
    return this.x;
}

两个函数在我使用的浏览器控制台返回相同的值console.log(b.getX);,这是未定义的。我是否需要使用我的返回函数传递一个参数,或者我的函数结构不正确?

4

2 回答 2

4

你说的是console.log(b.getX),

首先,您不是在执行函数,而是在记录其内容。其次,该函数不是 var b的属性。

// create the function.
b.getX = function()
{
 this.x;
};

// runs the command.
b.getX();

编辑:

Jsfiddle 解释你做错了什么:http: //jsfiddle.net/kychan/zsWpN/

编辑2:

首先,我将解释什么是“属性”。属性是某个对象拥有的“事物”。让我们定义一个 var 并实例化它:

var x = {}; // this makes an object.

我们还可以使用它添加属性:

var y = {myProp1:'Hello', myProp2:'World'};

这将创建一个具有两个属性(myProp1 和 myProp2)的对象 (y)。

现在,在您的代码(jsfiddle)中,您拥有(全局)函数 getX。这未设置为属性,因此必须将其称为全局语句:

getX(b); // should return this.x;

摆弄更彻底的解释:http: //jsfiddle.net/kychan/WwxC9/

//    METHOD 1 (Your method); works, but you can do it more directly, see METHOD 2.
//    define the var, with 'var'.
//    let it hold a (global) function.
var getX = function(object){
    return object.x;
};

//    we make a test variable holding an object with property x:
var foo = {x:4};
console.log(getX(foo)); // this should return 4.

//    METHOD 2:
//    we will make a normal function (which has the same execution as METHOD 1).
function getX2(o)
{
    return o.x;
}

//    create a test variable.
var bar = {x:4};
console.log(getX2(bar)); // should print 4 as well.

//   METHOD 3:
//    now we create a CLASS which has a default property named getX:
function myObject()
{
    this.x     = 4;

    //    here, this is called a method (because it is a property owned by a class/object).
    this.getX  = function()
    {
        return this.x;
    };
}

//    we create a test variable holding the object from the class myObject.
var baz = new myObject();
console.log(baz.getX()); // now it ALSO should print 4!
于 2014-04-20T15:48:36.487 回答
1

连同凯的例子,我终于让它工作了!所以,谢谢凯!我使用了他在最终编辑中展示的第 3 种方法,通过在我的 box 函数的刻度函数中添加一个变量来解决这个问题。这是我所做的:

在我Box.js的中,我使用 box2d 创建了一个 b2_staticBody 并给了它一个 getX 函数,该函数返回框的 x 位置。

this.getX = function(){
    return boxX;
}

我的刻度函数(用easeljs 创建)更新了盒子的位置,所以这里我将box.x 保存到一个名为boxX 的var 中。

function tick(e){
    boX = this.body.GetPosition().x * SCALE;

    this.x = this.body.GetPosition().x * SCALE;
    this.y = this.body.GetPosition().y * SCALE;
    this.rotation = this.body.GetAngle() * (180/Math.PI);
}

现在我可以b.getX();在创建框后调用该函数。

b = new Box(350,450); // x and y position
stage.addChild(b.view);
var targetX = b.getX();
console.log(targetX);

再次感谢 Kai 帮助我了解如何解决我的问题并了解使用属性等。

于 2014-04-22T20:36:18.007 回答