ba.writeInt(sprites.id.length);
ba.writeUTFBytes(sprites.id);
ba.writeInt(sprites.x);
ba.writeInt(sprites.y);
ba.writeInt(sprites.rotation);
}
//通知主线程PHYSICS_COMPLETE
channelToMain.send(MessageType.PHYSICS_COMPLETE);
//为拖拽操作更新hand的位置
hand.anchor1.setxy(worker.getSharedProperty("mouseX"), worker.getSharedProperty("mouseY"));
}
很简单对吧!?我们只要一个接一个地把数据封装进ByteArray,然后按同样的顺序读取它们就行了。哈,这是有点简单,但是速度快的跟狗屎一样!
提示:在存储String值时,我们必须先存储String的长度,这样另一端调用byteArray.readUTFBytes()时才能把长度信息传递过去。
你可以看到,如果worker线程向主线程发送消息动作。在主线程的监听函数里,我们将监听PHYSICS_COMPLETE消息,然后运行的基本上是上面函数的一个相反版本:
protected function onMessageFromWorker(event:flash.events.Event):void {
var msg:String = channelToMain.receive();
if(msg == MessageType.PHYSICS_COMPLETE){
//从byteArray对象里读取更新后的位置信息
var s:Crate;
var ba:ByteArray = positionBytes;
positionBytes.position = 0;
var id:String;
while(positionBytes.bytesAvailable){
//从byteArray对象里读取SpriteID
id = ba.readUTFBytes(ba.readInt());
//更新在屏幕上的Sprite位置
s = spritesById[id];
s.x = ba.readInt();
s.y = ba.readInt();
s.rotation = ba.readInt() * Math.PI / 180;
}
}
}
这就是它!你现在就拥有了一个完整的,运行在另一个线程的Stage3D里的物理系统!
当然,这只是个简单的示例程序,还有一大把的高级功能你可以添加的,比如:
1.添加更多形状/物体类型的功能。 2.移除/拆分条目的功能 3.增加关键节点的功能 4.等等
注:你将会看到一些附加的处理日志记录和异常捕获的代码,和非常多的try/catch语句块。在Flash Builder4.6里你没法在worker线程里运行trace或者查看运行时错误。所以这变得有必要了:在所有地方都使用try/catch,然后再发送stackTrace数据回主线程,让它打印出来。
在FB4.7里这些问题应该全部会被解决,你应该能正常地debug。
我非常希望获知大家对这篇文章的反馈。它对我来说是一片挺长的文章的,并且我不太确定是否把所有事情都说明白了,它对你们起到帮助了吗?