使用as3攻击starling与box2d和debugdraw一起工作

时间:2014-07-14 09:46:30

标签: actionscript-3 box2d

之前已经提出过这个主题,但我在网上找到的一个例子似乎并不适合我!我试图让starling与box2d一起工作,同时也用于box2d debugdraw。

我尝试过一系列不同的方法,而且我的代码现在有点乱,因为他们评论了尝试“解决方案”的不同组合。有谁知道怎么做这一切吗?如果有人可以解释的话我会非常感兴趣。

这是我尝试的最后一次尝试:

在我的启动课程中:

package {

import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
//import flash.events.Event;

import starling.core.Starling;
//import starling.display.Sprite;

import flash.events.Event;

[SWF(width="640", height="480", frameRate="60", backgroundColor="#000000")]

public class Startup extends Sprite {
    public static var mStarling:Starling;
    public static var debugSprite:Sprite;


    public function Startup() {
    //addChild ( new Stats() );

    super();

    //stage.align = StageAlign.TOP_LEFT;
    //stage.scaleMode = StageScaleMode.NO_SCALE;

    // create our Starling instance
    mStarling = new Starling(Game, stage);

    // set anti-aliasing (higher the better quality but slower performance)
    mStarling.antiAliasing = 1;

    mStarling.showStats = true;

    // start it!
    mStarling.start();


    stage.stage3Ds[0].addEventListener(Event.CONTEXT3D_CREATE, onContextCreated);
    }

    private function onContextCreated(e:Event):void{
        ////debug mode
//            debugSprite=new Sprite();
//            //addChild(debugSprite);
//          Starling.current.nativeOverlay.addChild(debugSprite);

        //var debugSprite:Sprite=new Sprite();
        addChild(debugSprite);
        (mStarling.stage.getChildAt(0) as Game).DebugDraw(debugSprite)

    }

我这样调用debugdraw:

debugDraw(Startup.debugSprite);

这是一个评论很多的debugdraw:

  private function debugDraw(debugSprite:flash.display.Sprite):void {
    /*var worldDebugDraw:b2DebugDraw=new b2DebugDraw();
    //var debugSprite:flash.display.Sprite = new flash.display.Sprite();
    var debugSprite:Sprite = new Sprite();
    addChild(debugSprite);
    //mStarling.current.nativeOverlay.addChild(debugSprite);
    //worldDebugDraw.SetSprite(debugSprite);
//debugDraw.SetSprite(Starling.current.nativeOverlay); //DOESN'T SEEM TO WORK
            worldDebugDraw.SetDrawScale(worldScale);
            worldDebugDraw.SetFlags(b2DebugDraw.e_shapeBit|b2DebugDraw.e_jointBit);

            //worldDebugDraw.SetFillAlpha(0.0);
            //worldDebugDraw.SetAlpha(0.0);
            //visible
            worldDebugDraw.SetFillAlpha(0.8); //for testing
            worldDebugDraw.SetAlpha(1); //for testing

            world.SetDebugDraw(worldDebugDraw);*/

            var worldDebugDraw:b2DebugDraw = new b2DebugDraw();
            worldDebugDraw.SetSprite(debugSprite);
            world.SetDebugDraw(worldDebugDraw);

        }

1 个答案:

答案 0 :(得分:0)

DebudDraw与ONE经典Flash Sprite一起使用(由于某种原因你不断创建新的Sprite)。只应创建一个b2DebugDraw,并使用该ONE Sprite进行设置。

Starling假装拥有舞台和所有的显示器,但事实并非如此。使用简单的StartUp实例,甚至直接使用舞台本身而不通过Starling,可以避免一些混乱。

完成所有这些的正确方法:

public var debugSprite:Sprite;//no static var

开始做什么?

//don't start it!
mStarling.start();

你明星无法启动的东西。此时您正在尝试创建有效的Context3D,因此请耐心等待。删除该行。

现在在onContextCreated:

mStarling.start();//now you can start
debugSprite = new Sprite();//create your sprite
addChild(debugSprite);
var game:Game = mStarling.stage.getChildAt(0) as Game;//Game? somebody is following a tutorial ...
if(game)
{
     game.setDebug(debugSprite);//this is a new public method to create in Game
}

在游戏方法setDebug中(带有一个参数Sprite):

var worldDebugDraw:b2DebugDraw = new b2DebugDraw();
worldDebugDraw.SetSprite(myspriteparameter);
world.SetDebugDraw(worldDebugDraw);

就是这样,不要创建新的Sprite,不要创建新的debugdraw,你可以随心所欲地使用它。