【发布时间】:2016-11-22 21:04:00
【问题描述】:
我正在努力进入激动人心的 byteArrays 世界!
最终目标
我想保存每个游戏元素的位置和其他属性(在本例中,是突破克隆中的块)作为我的应用程序关卡设计功能的一部分,同时也可以更轻松地为游戏设计关卡。
目前的方法
将数据从自定义类实例(砖块)的 Vector 转换为 ByteArray 并将该数据保存到文本文件中。 似乎到目前为止一切正常(直到我成功将该数据提取回 Vector 对象后才能确定,因为保存的文本文件是纯粹的 gobbledygook)。 p>
我通过将文本文件读入 byteArray 然后将 writeObject() 写入 Vector 来加载关卡设计,目的是现在拥有一个包含所有砖块的向量(这不起作用)。
问题
当我尝试运行我的加载函数时,文件加载,并且 byteArray 被数据“填充”,但是当我尝试执行 writeObject 时,我得到了所有这些错误(以下错误的副本每个向量中的砖块)。
TypeError: Error #1034: Type Coercion failed: cannot convert Object@92cdcb9 to flash.geom.Point.
TypeError: Error #1034: Type Coercion failed: cannot convert Object@92cde09 to flash.geom.Point.
TypeError: Error #1034: Type Coercion failed: cannot convert Object@92df041 to flash.geom.ColorTransform.
TypeError: Error #1034: Type Coercion failed: cannot convert Object@92df161 to flash.geom.Point.
TypeError: Error #1034: Type Coercion failed: cannot convert Object@92df281 to flash.geom.Point.
TypeError: Error #1034: Type Coercion failed: cannot convert Object@92df431 to flash.media.SoundTransform.
TypeError: Error #2004: One of the parameters is invalid.
我的自定义积木类是 Sprite 类的扩展。但它还具有依赖于Point 和ColorTransform 对象的属性。奇怪的是,在我的自定义类中,我没有任何引用或使用 SoundTransform... 所以这个错误看起来非常奇怪。如果有人想看,我会发布我的自定义课程。
我的保存和加载方法
private function saveLevelDesign(brVec:Vector.<LineTestBlock>):void{
trace("save");
var file:File = File.documentsDirectory;
file = file.resolvePath("AnimationFiles/brickLevels/lev_001.txt");
fileStream.open(file,FileMode.WRITE);
var bytes:ByteArray = new ByteArray();
bytes = brickArrayToByteArray(brVec);
//fileStream.close();
}
private function loadLevelDesign():void{
trace("loadLevelDesign");
var file:File = File.documentsDirectory;
file = file.resolvePath("AnimationFiles/brickLevels/lev_001.txt");
fileStream.open(file,FileMode.READ);
file.addEventListener(IOErrorEvent.IO_ERROR,ioError);
file.addEventListener(Event.COMPLETE, loaded);
file.load();
//fileStream.open(file,FileMode.READ);
}
private function ioError(ioE:IOErrorEvent):void{
trace("oops",ioE);
}
private function loaded(e:Event):void{
trace("loaded");
var bytes:ByteArray = new ByteArray();
fileStream.readBytes(bytes);
trace(bytes.length,"bytes length"); // 0 bytes length
var vec:Vector.<LineTestBlock> = new Vector.<LineTestBlock>;
for (var i:int = 4; i < _playerTurn._brickArray.length; i++){
vec.push(_playerTurn._brickArray[i]);
}
bytes.writeObject(vec);
trace(bytes.length,"bytes length"); // 53516 bytes length
destroyBricks(_playerTurn); // just removes all bricks on the stage
vec = byteArrayToBrickArray(bytes); // calling this function throws all those errors
trace("vector length:",vec.length); // vector length 208 (this is the correct number of bricks, so that's good)
}
我的字节转换方法
private function byteArrayToBrickArray(bytes:ByteArray):Vector.<LineTestBlock>{
bytes.position = 0;
var blocks:Vector.<LineTestBlock> = bytes.readObject() as Vector.<LineTestBlock>;
trace(bytes.position);
return blocks;
}
private function brickArrayToByteArray(brVec:Vector.<LineTestBlock>):ByteArray{
var bytes:ByteArray = new ByteArray();
/*for (var i:int = 0; i < brVec.length; i++){
if (brVec[i]._break == true){
bytes.writeObject(brVec[i]);
}
}*/
bytes.writeObject(brVec);
return bytes;
}
有人看看我是不是做错了什么,还是不理解?
【问题讨论】:
-
“到
ByteArray并将该数据保存到文本文件中”将二进制数据写入文本文件有什么意义? -
你的
byteArrayToBrickArray函数在哪里? -
@Neal Davis 在二进制文件中,显然。二进制数据不会产生任何有用的文本。
-
@null,哦……哈哈。多么耐人寻味。我会尝试一下,看看我的结果是否有任何改善。
-
@null 似乎文本文件或 bin 文件具有相同的结果。由于我并不关心它是文本文件还是 bin 文件,因此我将使用 bin 文件,因为它看起来更整洁,但似乎没有优势。
标签: actionscript-3