Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 丢失的对象未显示在AS3中_Actionscript 3_Box2d - Fatal编程技术网

Actionscript 3 丢失的对象未显示在AS3中

Actionscript 3 丢失的对象未显示在AS3中,actionscript-3,box2d,Actionscript 3,Box2d,我有一个班,应该在舞台上创作砖块。每件事情似乎都工作正常,没有错误,我甚至可以在调试器窗口中看到创建的砖块对象和初始化的冲突变量,但仍然没有在舞台上显示任何内容,如果有任何帮助,我将不胜感激。我花了数小时来找出我遗漏的内容,但没有任何效果:( 这是密码 public class Level1 extends Sprite { private var worldVar:world = new world(); public var stageRef:Stage; pub

我有一个班,应该在舞台上创作砖块。每件事情似乎都工作正常,没有错误,我甚至可以在调试器窗口中看到创建的砖块对象和初始化的冲突变量,但仍然没有在舞台上显示任何内容,如果有任何帮助,我将不胜感激。我花了数小时来找出我遗漏的内容,但没有任何效果:(

这是密码

public class Level1 extends Sprite {

    private var worldVar:world = new world();
    public var stageRef:Stage;

    public function Level1(stageRef:Stage) {


        stageRef = stageRef;

        brick(402,431,140,36, stageRef);
        brick(544,431,140,36,stageRef);
        brick(342,396,16,32,stageRef);
        brick(604,396,16,32,stageRef);
        brick(416,347,16,130,stageRef);
        brick(532,347,16,130,stageRef);
        brick(474,273,132,16,stageRef);
        brick(474,257,32,16,stageRef);
        brick(445,199,16,130,stageRef);
        brick(503,199,16,130,stageRef);
        brick(474,125,58,16,stageRef);
        brick(474,100,32,32,stageRef);
        brick(474,67,16,32,stageRef);
        brick(474,404,64,16,stageRef);
        brick(450,363,16,64,stageRef);
        brick(498,363,16,64,stageRef);
        brick(474,422,64,16,stageRef);
    }

    private function brick(pX: int, pY: int, w: Number, h: Number, _stg:Stage): void {
        var sg = _stg; // assign the stage 
        var bric:Sprite = new Brick();
        sg.addChild(bric);
        //trace(worldVar.m_sprite.);
        bric.x = pX;
        bric.y = pY;
        bric.width = w;
        bric.height = h;

        var polygonShape: b2PolygonShape = new b2PolygonShape();
        var polygonFixture: b2FixtureDef = new b2FixtureDef();
        polygonShape.SetAsBox(w / 2 / worldVar.worldScale, h / 2 / worldVar.worldScale);
        polygonFixture.shape = polygonShape;
        polygonFixture.density = 1;
        polygonFixture.restitution = 0.5;
        polygonFixture.friction = 0.9;
        var brickbodyDef: b2BodyDef = new b2BodyDef();
        //brickbodyDef.type=b2Body.b2_dynamicBody;
        brickbodyDef.userData = bric;
        brickbodyDef.position.Set(pX / worldVar.worldScale, pY / worldVar.worldScale);
        var theBrick: b2Body = worldVar.createWorld.CreateBody(brickbodyDef);
        theBrick.CreateFixture(polygonFixture);


    }


}
基于@null建议,我确实对我的文档进行了更改 阶级

}

一切都在舞台上完美地呈现了多亏了这一点,但现在我被困在砖块上没有应用box2d物理,尽管所有的碰撞都在同一舞台上完美地为鸟工作

下面是birdMC类的代码

}

这是我主要用来声明全局变量的世界级 以及在b2世界中添加具有的墙

}

问题是鸟和墙的碰撞工作得很好,但砖块却不是,这让我很困惑,尽管它们都被单独实例化为

public var createWorld: b2World = new b2World(gravity, true);

这里有两个问题。我要说的是,它们是AS3中最常见的两种反模式

  • 将对stage的引用传递给
    DisplayObject
    几乎没有意义,因为每个
    DisplayObject
    都有自己的 在
    .stage
    属性中拥有对stage的引用。为什么还要创建 要引用的另一个类成员
    阶段

    这个属性的特殊之处在于它是
    null
    只要 该对象不在显示列表中。只要该对象 添加,
    stage
    将成为有效引用。如果
    DisplayObject
    需要一个有效的
    stage
    引用 侦听
    事件。已将\u添加到\u STAGE
    事件,该事件将被调度 一旦对象被添加并且
    阶段
    生效

  • 阶段添加任何内容
    可以看出,向
    阶段
    添加某些内容是不应该做的。 因此,一般来说,不应该直接将对象添加到舞台上

这很好。因为如果不向
stage
添加任何内容,那么首先就不需要传递对
stage
的引用,这就解决了第一个问题

如果不应将其添加到
阶段
,还应添加到什么? 答案是:您自己创建的主时间线或
DisplayObjectContainer

在主时间线上,实例化一个
Level1
(可怕的类名btw!)对象并将其添加到显示列表中:

var level:Level1 = new Level1();
addChild(level);
Level1
扩展了
DisplayObjectContainer
,这意味着可以向其中添加内容。在您的情况下,该级别的所有砖块都应添加到该级别。该级别充当该级别所有内容的容器

我修改了现有代码:

public class Level1 extends Sprite 
{
    private var worldVar:world = new world();

    public function Level1() 
    {
        brick(402,431,140,36);
        brick(544,431,140,36);
        brick(342,396,16,32);
        brick(604,396,16,32);
        brick(416,347,16,130);
        brick(532,347,16,130);
        brick(474,273,132,16);
        brick(474,257,32,16);
        brick(445,199,16,130);
        brick(503,199,16,130);
        brick(474,125,58,16);
        brick(474,100,32,32);
        brick(474,67,16,32);
        brick(474,404,64,16);
        brick(450,363,16,64);
        brick(498,363,16,64);
        brick(474,422,64,16);
    }

    private function brick(pX: int, pY: int, w: Number, h: Number): void 
    {
        var brick:Sprite = new Brick();

        addChild(brick); //not adding to stage, but the Level1 instance

        //trace(worldVar.m_sprite.);
        brick.x = pX;
        brick.y = pY;
        brick.width = w;
        brick.height = h;

        var polygonShape: b2PolygonShape = new b2PolygonShape();

        var polygonFixture: b2FixtureDef = new b2FixtureDef();
        polygonShape.SetAsBox(w / 2 / worldVar.worldScale, h / 2 / worldVar.worldScale);
        polygonFixture.shape = polygonShape;
        polygonFixture.density = 1;
        polygonFixture.restitution = 0.5;
        polygonFixture.friction = 0.9;

        var brickBodyDef: b2BodyDef = new b2BodyDef();
        //brickBodyDef.type=b2Body.b2_dynamicBody;
        brickBodyDef.userData = bric;
        brickBodyDef.position.Set(pX / worldVar.worldScale, pY / worldVar.worldScale);

        var brickBody: b2Body = worldVar.createWorld.CreateBody(brickBodyDef);
        brickBody.CreateFixture(polygonFixture);
    }
}
经验法则是:DisplayObjects从不将自己添加到显示列表中,它们只向自己添加其他子对象

这提供了一个严格的层次结构(如树),明确了如何在显示中添加人员和方式。当然,这条经验法则并不适用于所有情况,但在大多数情况下,在这种基本情况下,它应该可以正常工作


但是现在我被困在砖块上没有应用box2d物理,尽管所有的碰撞都在同一个舞台上完美地为鸟工作

问题是每个元素都会创建一个新的
world
类实例。我不知道这个类在做什么,因为box2d的世界类实际上是命名的。我想您为
b2World
类创建了某种包装类,如
Level1
中的这一行所示:

worldVar.createWorld.CreateBody(brickbodyDef);
但是到目前为止,我所看到的所有相关类都创建了它们自己的类实例:

public var worldVar:world = new world();
上面这一行可以在
birdMC
Level1
中找到。因此它们生活在各自的世界中,彼此独立

问题的核心与以下内容相同: 您需要一个世界对象来创建实体。 这与As3非常不同,在As3中,您可以创建对象,然后决定将其添加到何处


一种解决方案是将世界作为一个参数传递给每个构造函数。就像您以前使用
stage
所做的那样。这将允许您创建一个世界并将其传递给所有构造函数,而所有构造函数又在同一个世界上创建其box2d body对象。

我做了这些更改,请参见上文,我现在没有bo了x2dphysics@Adeel我做了一些假设并编辑了我的帖子,以解决这个问题谢谢你的及时回复我真的很感激。我编辑了我的帖子以添加墙。作为课堂,这将让你更好地理解我缺少的东西。再次感谢你的回复help@Adeel正如我所怀疑的,创建了不同的b2世界对象
world
类创建墙,每个世界对象都有墙。这就是为什么鸟和墙之间的碰撞有效。墙和砖之间的碰撞也有效(如果有的话),因为砖块的世界也有它的墙。正如我在编辑中所写的:解决方案是将
世界
对象传递给所有这些类,而不是让它们创建自己的类。非常感谢您的帮助这个问题困扰了我多久了,但现在它像魅力一样工作,感谢您。
public class Level1 extends Sprite 
{
    private var worldVar:world = new world();

    public function Level1() 
    {
        brick(402,431,140,36);
        brick(544,431,140,36);
        brick(342,396,16,32);
        brick(604,396,16,32);
        brick(416,347,16,130);
        brick(532,347,16,130);
        brick(474,273,132,16);
        brick(474,257,32,16);
        brick(445,199,16,130);
        brick(503,199,16,130);
        brick(474,125,58,16);
        brick(474,100,32,32);
        brick(474,67,16,32);
        brick(474,404,64,16);
        brick(450,363,16,64);
        brick(498,363,16,64);
        brick(474,422,64,16);
    }

    private function brick(pX: int, pY: int, w: Number, h: Number): void 
    {
        var brick:Sprite = new Brick();

        addChild(brick); //not adding to stage, but the Level1 instance

        //trace(worldVar.m_sprite.);
        brick.x = pX;
        brick.y = pY;
        brick.width = w;
        brick.height = h;

        var polygonShape: b2PolygonShape = new b2PolygonShape();

        var polygonFixture: b2FixtureDef = new b2FixtureDef();
        polygonShape.SetAsBox(w / 2 / worldVar.worldScale, h / 2 / worldVar.worldScale);
        polygonFixture.shape = polygonShape;
        polygonFixture.density = 1;
        polygonFixture.restitution = 0.5;
        polygonFixture.friction = 0.9;

        var brickBodyDef: b2BodyDef = new b2BodyDef();
        //brickBodyDef.type=b2Body.b2_dynamicBody;
        brickBodyDef.userData = bric;
        brickBodyDef.position.Set(pX / worldVar.worldScale, pY / worldVar.worldScale);

        var brickBody: b2Body = worldVar.createWorld.CreateBody(brickBodyDef);
        brickBody.CreateFixture(polygonFixture);
    }
}
worldVar.createWorld.CreateBody(brickbodyDef);
public var worldVar:world = new world();