Flash actionscript3在函数内创建对象
我一直在尝试编写一个函数,在Box2DFlash中创建一个简单的圆。但它一直告诉我对象为空,我无法访问它的属性。代码如下:Flash actionscript3在函数内创建对象,flash,apache-flex,actionscript-3,flash-builder,box2d,Flash,Apache Flex,Actionscript 3,Flash Builder,Box2d,我一直在尝试编写一个函数,在Box2DFlash中创建一个简单的圆。但它一直告诉我对象为空,我无法访问它的属性。代码如下: public var f1:b2Body; public var f2:b2Body; public function addACrate(fallingCrate:b2Body, positionX:Number,positionY:Number):void { var fallingBodyDef:b2Bo
public var f1:b2Body;
public var f2:b2Body;
public function addACrate(fallingCrate:b2Body, positionX:Number,positionY:Number):void
{
var fallingBodyDef:b2BodyDef = new b2BodyDef();
fallingBodyDef.type = b2Body.b2_dynamicBody;
fallingBodyDef.position.Set(positionX/ratio,positionY/ratio);
fallingCrate =_world.CreateBody(fallingBodyDef);
var fallingCrateShape:b2CircleShape = new b2CircleShape();
fallingCrateShape.SetRadius(10/ratio);
var fixtureDef:b2FixtureDef = new b2FixtureDef();
fixtureDef.shape = fallingCrateShape;
fixtureDef.density = 0.7;
fixtureDef.friction = 0.5;
fixtureDef.restitution = 0.3;//bouncyness
fallingCrate.CreateFixture(fixtureDef);
}
addACrate(f1,270,0);
trace(f1.GetPosition().y);
当我试图访问我的“f1”对象的“y”属性时,它告诉我它是空的。如果有人能告诉我出了什么问题,我将不胜感激谢谢或者更改
addACrate()
函数以返回b2Body
,而不是设置它,这样您的调用就可以
f1 = this.addACrate( 270.0, 0.0 );
或者,直接在函数中设置f1
(而不是使用fallingcrater
参数)
那么它应该会起作用。这与Flash传递引用的方式有关。将对象传递给函数时,可以更改该对象内部的属性,但不能使其指向新对象。在您的示例中,fallingCrate
本质上是一个局部变量,它设置为在调用addACrate
时传入的任何对象。你行吗
fallingCrate = _world.CreateBody(fallingBodyDef);
fallingCrate
现在是指向新对象的局部变量。由于fallingCrate
是本地的,因此当您退出函数时,它将超出范围。那么,您将得到一个空引用异常,因为您可能没有在任何地方设置f1
的值。解决办法是:
在函数中,使用f1=fallingCrate代码>在末尾
或
将函数定义为
public function addACrate(fallingCrate:b2Body, positionX:Number,positionY:Number):b2Body
然后将其称为f1=addACrate(参数)代码>
---编辑---
您正在发送对函数的引用,因此如果不是针对此行,它应该可以正常工作:
fallingCrate =_world.CreateBody(fallingBodyDef);
这将重新指定fallingCrate的值,因此fallingCrate不再引用与f1相同的对象
上述解决方案仍然适用:)