public virtual void addFrameAt(int frameID, AsTexture texture, AsSound sound, float duration)
 {
     if(frameID < 0 || frameID > getNumFrames())
     {
         throw new AsArgumentError("Invalid frame id");
     }
     if(duration < 0)
     {
         duration = mDefaultFrameDuration;
     }
     mTextures.splice(frameID, (uint)(0), texture);
     mSounds.splice(frameID, (uint)(0), sound);
     mDurations.splice(frameID, (uint)(0), duration);
     mTotalTime = mTotalTime + duration;
     if(frameID > 0 && frameID == getNumFrames())
     {
         mStartTimes[frameID] = mStartTimes[frameID - 1] + mDurations[frameID - 1];
     }
     else
     {
         updateStartTimes();
     }
 }
 public virtual void addFrameAt(int frameID, AsTexture texture, AsSound sound)
 {
     addFrameAt(frameID, texture, sound, -1);
 }
 public virtual void addFrame(AsTexture texture, AsSound sound, float duration)
 {
     addFrameAt(getNumFrames(), texture, sound, duration);
 }
 public virtual void addFrame(AsTexture texture, AsSound sound)
 {
     addFrame(texture, sound, -1);
 }
 public virtual void setFrameSound(int frameID, AsSound sound)
 {
     if(frameID < 0 || frameID >= getNumFrames())
     {
         throw new AsArgumentError("Invalid frame id");
     }
     mSounds[frameID] = sound;
 }