2015-10-13 42 views
2

所以,我一直在使用ByteArrays最近很多,我遇到了一些令人討厭的問題,讓我想撕開我的頭髮。AS3 - 問題與IExternalizable

基本上,我試圖保存一個應用程序的項目數據,我正在爲一個遊戲編譯一個文件的字符。該項目由自定義對象,矢量,矢量矢量以及自定義對象矢量矢量組成。我認爲正確編寫所有這些數據的最好方法是使用帶有readExternal和writeExternal命令的IExternalizable接口。所以這就是我在做什麼。

我所有的項目數據寫入到一個對象,然後寫一個對象到ByteArray,並將其保存到一個文件:

// probject means project object ! 
mProbject= { }; 

// Register vector as class, just to prevent any errors about that just in case 
registerClassAlias("vec_core.timeline.KeyFrame", Vector.<KeyFrame> as Class); 

// single KeyFrame Object 
mProbject.currentFrame = Main.getInstance().animationList.selectedItem.currentKeyFrame; 

// a Vector.<Vector.<KeyFrame>> 
mProbject.frames = Main.getInstance().animationList.keyFrameVectorVector; 

// an unsigned int 
mProbject.selectedItemIndex = Main.getInstance().animationList.entries.indexOf(Main.getInstance().animationList.selectedItem); 

// Vector.<String> 
mProbject.animationNames = Main.getInstance().animationList.animationNames; 

// String 
mProbject.projectPath = nativePath; 

//String 
mProbject.projectName = name; 

mByteArray = new ByteArray(); 
mByteArray.writeObject(mProbject); 
mByteArray.compress(); 

return mByteArray; 

關鍵幀類,但是裏面,有自定義對象的兩個向量:

private var mHitboxes:Vector.<Hitbox>; 
private var mHitboxSprites:Vector.<HitboxSprite>; 

,所以我成立這兩個類和我的Keyframe類的使用IExternalizable的:

public class HitboxSprite extends Sprite implements IExternalizable 
{ 
    public function readExternal(input:IDataInput):void 
    { 
     trueBounds.x = input.readFloat(); 
     trueBounds.y = input.readFloat(); 
     trueBounds.width = input.readFloat(); 
     trueBounds.height = input.readFloat(); 
     mHitbox = input.readObject(); 
    } 

    public function writeExternal(output:IDataOutput):void 
    { 
     output.writeFloat(trueBounds.x); 
     output.writeFloat(trueBounds.y); 
     output.writeFloat(trueBounds.width); 
     output.writeFloat(trueBounds.height); 
     output.writeObject(mHitbox);    
    } 
} 


public class Hitbox implements IExternalizable 
{ 
    public function readExternal(input:IDataInput):void 
    { 
     mName = input.readUTF(); 
     mType = input.readUnsignedInt(); 
     mEnabled = input.readBoolean(); 
     mKnockback = input.readBoolean(); 
     x = input.readFloat(); 
     y = input.readFloat(); 
     width = input.readFloat(); 
     height = input.readFloat(); 
     addMultipleTags(input.readUTF()); 
    } 

    public function writeExternal(output:IDataOutput):void 
    { 
     output.writeUTF(mName); 
     output.writeUnsignedInt(mType); 
     output.writeBoolean(mEnabled); 
     output.writeBoolean(mKnockback); 
     output.writeFloat(mX); 
     output.writeFloat(mY); 
     output.writeFloat(mWidth); 
     output.writeFloat(mHeight); 
     output.writeUTF(getAllTags()); 
    } 
} 

public class KeyFrame implements IExternalizable 
{ 
    public function readExternal(input:IDataInput):void 
    { 
     mID = input.readUnsignedInt(); 
     mLabel = input.readUTF(); 
    } 

    public function writeExternal(output:IDataOutput):void 
    { 
     output.writeUnsignedInt(mID); 
     output.writeUTF(mLabel); 
    } 
} 

但是當它到達的「根」的writeObject()方法的ByteArray,我得到的錯誤:

[Fault] exception, information=ArgumentError: Error #2004: One of the parameters is invalid. 

這可能是最惱人的問題我曾經有過。似乎我已經嘗試了一切,沒有任何工作。 是否有其他人有這方面的經驗?難道我做錯了什麼?? 我會很感激任何幫助,我可以得到這一點。我只想繼續製作我的遊戲:<

+0

也許您在尋找[this](http://stackoverflow.com/questions/14576627/how-to-work-registerclassalias-method-for-custom-mxml-components)? –

+0

@MarcoAurélioDeleu我的朋友,你救了我的命。我幾乎失去了理智,所以,我感謝你。那個問題在我搜索這個問題時沒有出現,所以我很感謝你指點我那個答案! adobe文檔只是告訴您註冊該類,但不是隻有註冊該對象時它才能用於自定義對象!如果你願意,你可以讓你的評論一個答案,我會很樂意接受它:> – SnaiLegacy

回答

0

正如評論部分所述,您正在尋找this。對於我來說,響亮的鐘聲是你所擴展的「雪碧」類。這讓我對你試圖將可視化內容進行外部化的問題產生懷疑。

+0

哦,是啊!我甚至沒有想到這個!我完全忘記了像精靈這樣的外部化視覺對象與普通對象不同。仍然,我不知道以這種方式外化一個精靈甚至是可能的。我想你每天都會學到新的東西,哈哈。再次感謝! – SnaiLegacy