Накарайте Старлинг да работи с box2d и да отстранява грешки с as3

Тази тема е повдигана и преди, но нито един от примерите, които намерих онлайн, изглежда не работи за мен! Опитвам се да накарам 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);

Ето един силно коментиран чертеж за отстраняване на грешки:

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

Това е всичко, не създавайте нов Sprite, не създавайте нов debugdraw, готови сте, това е всичко, от което се нуждаете.

person BotMaster    schedule 15.07.2014