之前已经提出过这个主题,但我在网上找到的一个例子似乎并不适合我!我试图让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);
}
答案 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,你可以随心所欲地使用它。