0

私は FlashPunk を使い始めたばかりで、Mac の IDE として Flash Builder を使用しています。

私は、Box2D と box2fp を使用して FlashPunk をセットアップし、非常に単純なゲームを構築しようとしました。しかし、私の問題は、doDebug() を実行すると、次のエラーが発生することです。

TypeError: Error #1009: Cannot access a property or method of a null object reference.
at net.box2fp::Box2DWorld/debug_draw()[/Users/samirghobril/Desktop/MusicGame/src/net/box2fp/Box2DWorld.as:103]
at net.box2fp::Box2DWorld/doDebug()[/Users/samirghobril/Desktop/MusicGame/src/net/box2fp/Box2DWorld.as:123]
at Level1()[/Users/samirghobril/Desktop/MusicGame/src/Level1.as:13]
at Main()[/Users/samirghobril/Desktop/MusicGame/src/Main.as:18]

Main.as は次のとおりです。

package
{

    import net.box2fp.Box2DWorld;
    import net.flashpunk.Engine;
    import net.flashpunk.FP;
    import net.flashpunk.Screen;

    [SWF(width='800',height='600',backgroundColor='#ffffff',frameRate='60')]

    public class Main extends Engine
    {
        public function Main()
        {

            super(800, 600, Box2DWorld.DEFAULT_FRAMERATE, true);

            FP.world = new Level1;


        }

        override public function init():void
        {
            FP.console.enable();
            FP.world = new Level1;
        }
    }
}

Level1.as は次のとおりです。

package
{
    import Box2D.Common.Math.b2Vec2;

    import net.box2fp.Box2DWorld;

    public class Level1 extends Box2DWorld
    {
        public function Level1()
        {
            super();
            setGravity(new b2Vec2(0, 10));
            doDebug();
        }

        override public function begin():void
        {
            add(new Player(80, 600));
        }
    }
}

Player.as は次のとおりです。

package
{
    import Box2D.Dynamics.b2Body;

    import net.box2fp.Box2DEntity;
    import net.box2fp.Box2DShapeBuilder;

    public class Player extends Box2DEntity
    {
        public function Player(x:Number=0, y:Number=0, w:uint=1, h:uint=1, b2Type:int=0)
        {
            super(x, y, 30, 60, b2Body.b2_dynamicBody);
        }

        override public function buildShapes(friction:Number, density:Number, restitution:Number, group:int, category:int, collmask:int):void
        {
            Box2DShapeBuilder.buildRectangle(body, width / (2.0 * box2dworld.scale), height / (2.0 * box2dworld.scale));
        }
    }
}
4

1 に答える 1

0

次のようにコードを更新すると、プロジェクトがコンパイルされます。

Main.as:

package
{

    import net.box2fp.Box2DWorld;

    import net.flashpunk.Engine;
    import net.flashpunk.FP;
    import net.flashpunk.Screen;

    [SWF(width='800',height='600',backgroundColor='#ffffff',frameRate='60')]

    public class Main extends Engine
    {
        public function Main()
        {
            super(800, 600, Box2DWorld.DEFAULT_FRAMERATE, true);

            FP.console.enable();
            FP.world = new Level1();
        }

        override public function init():void
        {
            trace("FlashPunk has initialised");
        }
    }
}

Level1.as:

package
{
    import Box2D.Common.Math.b2Vec2;

    import net.box2fp.Box2DWorld;

    public class Level1 extends Box2DWorld
    {
        public function Level1()
        {
            super();
            setGravity(new b2Vec2(0, 10));
        }

        override public function begin():void
        {
            doDebug();
            add(new Player(80, 600));
        }
    }
}

説明: doDebug メソッドは、Main クラスのコンストラクターが呼び出されたときに存在しない FP.stage インスタンスにスプライトを追加しようとします (さらに、このメソッドを呼び出す Level1 クラスのコンストラクターも拡張されます)。

上記が合わない場合は、メイン クラスの init メソッドでワールドを作成できます。このメソッドは、FlashPunk が正常に初期化されたときにスーパー クラスによって呼び出されます (このチュートリアルを参照してください)。しかし、ドキュメンテーションを見ると、ワールドは通常、メイン クラスのコンストラクターで作成されているようです。

また、合法ではありますが (私が思うに)、クラスをインスタンス化するときに new の呼び出しの後に括弧を省略することは、あまり良い習慣とは見なされません。

これを行う:

FP.world = new Level1();

これではない:

FP.world = new Level1; 
于 2012-04-24T17:52:15.833 に答える