1

私はflashとbox2dにかなり慣れていません。私はbox2dの基本をわざわざ回避することができましたが、これまでは、b2debugdraw関数を使用して、作成したすべてのオブジェクトを表示してきました。そこで、実際にスプライトや画像をオブジェクトに追加する方法を検討し始めることにしました。

私は今何時間もグーグルで絶望的に検索してきました、そして私はこの時点で完全にイライラしているので、あなたたちの一人がこれを理解するために私に手を差し伸べてくれたら本当にありがたいです、私がやろうとしているのは画像を追加することだけです/box2dで作った正方形に作った木枠のスプライト。

これが私の最近の試みです:

package 
{
import Box2D.Collision.b2AABB;
import Box2D.Collision.Shapes.b2PolygonShape;
import Box2D.Common.Math.b2Vec2;
import Box2D.Dynamics.b2Body;
import Box2D.Dynamics.b2BodyDef;
import Box2D.Dynamics.b2DebugDraw;
import Box2D.Dynamics.b2Fixture;
import Box2D.Dynamics.b2FixtureDef;
import Box2D.Dynamics.b2World;
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.events.Event;


/**
 * ...
 * @author Robert Damery
 */
public class Main extends Sprite 
{
    //World object
    public var world:b2World;
    //Scale number
    public const scale:int = 30;
    //Time Counter
    public var Counter:int = 60;

    public var boxbody:Sprite;

    public function Main():void 
    {
        var asprite:Sprite;
        asprite.graphics.beginBitmapFill(crate.jpg, null, false, false);
        asprite.graphics.drawRect(0, 0, 25, 25);
        asprite.graphics.endFill();
        asprite.x = 100;
        asprite.y = 100;
        stage.addChild(asprite);

        // create world
        CreateWorld();
        //Create a box function
        CreateBox(300, 600, 600, 25, false, .8);
        CreateBox(0, 600, 25, 600, false, .8);
        CreateBox(800, 0, 25, 600, false, .8);
        CreateBox(400, 100, 25, 25, true, .8);

        //Make frames pass in flash
        addEventListener(Event.ENTER_FRAME, newframeevent);
        //Draw our debug data
        debug_draw();
    }

    //Event handler function, makes time go by
    private function newframeevent(e:Event):void 
    {
        world.Step(1 / 30, 10, 10);
        world.ClearForces();
        world.DrawDebugData();
    }

    private function CreateWorld():void 
    {
        //Size of World
        var worldsize:b2AABB = new b2AABB();
        worldsize.lowerBound.Set(-500, -500);
        worldsize.upperBound.Set(500 , 500);
        //Define Gravity
        var gravity:b2Vec2 = new b2Vec2(0 , 9.8);
        // Ignore sleeping objects
        var doSleep:Boolean = true;
        world = new b2World(gravity, doSleep);
    }

    private function CreateBox(x:Number, y:Number, width:Number, height:Number, is_Dynamic:Boolean, density:Number):b2Body
    {
        x = con2D(x);
        y = con2D(y);
        width = con2D(width);
        height = con2D(height);

        //Create the body definition
        var floorshapedef:b2BodyDef = new b2BodyDef();
        floorshapedef.position.Set(x, y);
        //Determine whether object is dynamic or not
        if (is_Dynamic == true)
        {
            floorshapedef.type = b2Body.b2_dynamicBody;
        }
        else
        {
        floorshapedef.type = b2Body.b2_staticBody;
        }
        //Create the shape
        var floorshape:b2PolygonShape = new b2PolygonShape();
        floorshape.SetAsBox(width, height);

        //Create the fixture
        var floorfixture = new b2FixtureDef();
        floorfixture.shape = floorshape;
        floorfixture.density = density;
        floorfixture.restitution = .5;
        floorfixture.friction = .25;

        //Create body
        var floorbody:b2Body = world.CreateBody(floorshapedef);
        floorbody.CreateFixture(floorfixture);

        return floorbody;

    }

        //Debug Draw function
        public function debug_draw():void
    {
        var debug_draw:b2DebugDraw =  new b2DebugDraw();
        var debug_sprite:Sprite = new Sprite();
        addChild(debug_sprite);
        debug_draw.SetSprite(debug_sprite);
        debug_draw.SetDrawScale(scale);
        debug_draw.SetFlags(b2DebugDraw.e_shapeBit);
        world.SetDebugDraw(debug_draw);

    }

    public function con2D(num:Number):Number
    {
        return num / scale;
    }


}

}

スプライトをボックスに取り付けようとさえしなかったことはすでに知っていますが、それはボックスを表示することさえできなかったためです。この特定のコードを実行すると、次のようなエラーが発生します。未定義のプロパティクレートへのアクセス。

.flaを含むさまざまな形式の同じ画像がありますが、常に同じエラーが発生します。

4

2 に答える 2

0

ここに、これはbox2dのチュートリアルの長いリストです。Box2dにスプライトを追加することに関しては、あなたは間違った方法を考えています。Box2dは、リアルタイムの物理をシミュレートする物理エンジンです。DebugDrawを使用すると、シェイプの基本的なグラフィックが提供されます。

レンダリングと物理シミュレーションは、互いに沿って実行される2つの別個の「スレッド」です。

あなたがする必要があるのは、あなたのグラフィックスに形がどこにあるかをエミュレートさせることです。したがって、OnEnterFrameイベントでは、スプライトにbox2dシェイプから位置、回転、スケールを取得させる必要があります。また、box2dはメートル法であり、フラッシュはピクセルであることに注意してください。変換定数を使用してください。以下のリンクですべてが説明されています。時間をかけて読んでください。

http://www.kerp.net/box2d/

お役に立てれば : )

于 2012-12-17T14:51:10.640 に答える
0

この行は非常に間違っています:

asprite.graphics.beginBitmapFill(crate.jpg, null, false, false);

crate.jpg?これはbitmapdataインスタンスである必要がありますが、crate.jpgが有効なインスタンス名ではないと思います。

それに加えて、あなたはすでに他の答えを最高のものとして受け入れましたが、それはあなたの質問に答えません:未定義のプロパティクレートへのアクセス。

于 2014-06-19T11:35:20.190 に答える