2

それで、私は最近 ByteArrays を頻繁に使用していますが、髪の毛を引き裂きたくなるような厄介な問題に直面しています。

基本的に、ゲームのキャラクターを1つのファイルにコンパイルするために作成しているアプリケーションのプロジェクトデータを保存しようとしています。プロジェクトは、カスタム オブジェクト、ベクトル、ベクトルのベクトル、さらにはカスタム オブジェクトのベクトルのベクトルで構成されています! このすべてのデータを適切に書き込む最善の方法は、 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;

ただし、KeyFrame クラス内には、さらに 2 つのカスタム オブジェクトのベクトルがあります。

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

しかし、「ルート」ByteArray の writeObject() メソッドに到達すると、エラーが発生します。

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

これはおそらく、私がこれまでに経験した中で最も厄介な問題です。私はすべてを試したようですが、何も機能していません。他の誰かがこれを経験していますか?私は何か間違ったことをしていますか?? これについて何か助けていただければ幸いです。私は自分のゲームを作り続けたいだけです:<

4

1 に答える 1

0

コメント セクションで述べたように、あなたはこれを探していまし。私にベルを鳴らしたのは、あなたが拡張した「スプライト」クラスでした。あなたが視覚化可能なコンテンツを外部化しようとしているという点で、私は疑問に思いました。

于 2015-10-13T22:18:14.657 に答える