Настраиваем starling для работы с box2d и debugdraw с as3

Эта тема поднималась раньше, но ни один из примеров, которые я нашел в Интернете, не работает для меня! Я пытаюсь заставить Starling работать с box2d, а также для отладки box2d.

Я пробовал кучу разных методов, и теперь мой код немного запутался из-за комментариев, чтобы попробовать разные сочетания «решения». Кто-нибудь знает, как все это сделать правильно? Я был бы очень признателен, если бы кто-то мог это объяснить.

Вот последняя попытка, которую я пробовал:

В моем классе запуска:

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(Startup.debugSprite);

Вот сильно закомментированный отладчик:

  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);

        }

person user2396672    schedule 14.07.2014    source источник
comment
Пожалуйста, определите работу.   -  person iforce2d    schedule 14.07.2014
comment
Предположительно он не показывает отладочный рисунок.   -  person Jason Sturges    schedule 15.07.2014


Ответы (1)


DebudDraw работает с ОДНИМ классическим Flash Sprite (по какой-то причине вы продолжаете создавать новые). Только один b2DebugDraw должен быть создан и установлен с этим ОДНИМ спрайтом.

Старлинг делает вид, что владеет сценой и всем шоу-листом, но это не так. Используйте просто свой экземпляр 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);

Вот и все, не создавайте новый спрайт, не создавайте новый отладчик, все готово, это все, что вам нужно.

person BotMaster    schedule 15.07.2014