Метод расширения рисования XNA SpriteBatch создает исключение ArrayTypeMismatchException - PullRequest
0 голосов
/ 17 октября 2010

Я работаю над классом анимации для XNA.Я решил попробовать использовать методы расширения для SpriteBatch, чтобы добавить методы Draw, которые могут рисовать AnimatedSprite.

AnimatedSprite содержит список объектов Sprite, а объект Sprite имеет изображение Texture2D.Я создал статический класс Extensions, который содержит различные перегрузки метода Draw.

Вот один из таких методов (я полагаю, что проблема похожа для всех функций):

    public static void Draw(this SpriteBatch b, AnimatedSprite sprite, Vector2 position, Color color)
    {
        b.Draw(sprite.CurrentSprite.Image, position, color);
    }

Я получаюArrayTypeMismatchException когда я запускаю свой проект.Я не уверен, что является причиной этого, потому что sprite.CurrentSprite.Image это Texture2D.

Надеюсь, кто-нибудь сможет помочь мне понять, что является причиной этой проблемы и потенциального решения.

Спасибо!

Обновление: класс AnimatedSprite

public class AnimatedSprite
{
    List<Sprite> frames;

    double elapsedSeconds;
    int currentIndex;

    /// <summary>
    /// CurrentSprite is the current frame the animation is on
    /// Use CurrentSprite.Image to get the underlying Texture2D
    /// </summary>
    public Sprite CurrentSprite { set; get; }
    /// <summary>
    /// FrameRate is the frame rate of the animation, measured
    /// in frames per second
    /// </summary>
    public int FrameRate { set; get; }

    bool shouldAnimate;

    /// <summary>
    /// Constructor for AnimatedSprite
    /// </summary>
    /// <param name="sprites">A list of sprites, cannot be left null</param>
    /// <param name="frameRate">The framerate in frames per second</param>
    /// <exception cref="ArgumentException">Thrown if sprites is null</Sprite></exception>
    public AnimatedSprite(List<Sprite> sprites, int frameRate)
    {
        if (sprites == null) throw new ArgumentException("Please provide a non-null List<Sprite>");
        this.frames = sprites;
        this.currentIndex = 0;
        if(this.frames.Count != 0) this.CurrentSprite = frames[currentIndex];

        this.FrameRate = frameRate;

        this.elapsedSeconds = 0;
    }

    /// <summary>
    /// Add a frame to the animation. It will be added to the end.
    /// </summary>
    /// <param name="frame">The Sprite you would like to add</param>
    public void AddFrame(Sprite frame)
    {
        frames.Add(frame);
        if (frames.Count == 1) this.CurrentSprite = frames[0];
    }

    /// <summary>
    /// Call this function in any Update method to continue the animation
    /// </summary>
    /// <param name="gameTime">The gameTime object keeping track of time</param>
    public void Update(GameTime gameTime)
    {
        elapsedSeconds += gameTime.ElapsedGameTime.TotalSeconds;
        if (elapsedSeconds > (1.0 / FrameRate) && shouldAnimate)
        {
            NextFrame();
            elapsedSeconds = 0;
        }
    }

    #region Animation Controls
    /// <summary>
    /// Starts the animation. This MUST be called to start the animation
    /// </summary>
    public void Start()
    {
        shouldAnimate = true;
    }
    /// <summary>
    /// Stops the animation. Call Start() to start again
    /// </summary>
    public void Stop()
    {
        shouldAnimate = false;
    }
    /// <summary>
    /// Advances the animation to the next cell
    /// </summary>
    public void NextFrame()
    {
        if (frames.Count == 0) return;
        currentIndex++;
        if (currentIndex >= frames.Count) currentIndex = 0;
        this.CurrentSprite = frames[currentIndex];
    }
    /// <summary>
    /// Advances the animation to the previous cell
    /// </summary>
    public void PreviousFrame()
    {
        if (frames.Count == 0) return;
        currentIndex--;
        if (currentIndex < 0) currentIndex = frames.Count - 1;
        this.CurrentSprite = frames[currentIndex];
    }
    #endregion Animation Controls

1 Ответ

0 голосов
/ 14 февраля 2011

Единственный используемый массив - это sprite.CurrentSprite. Это (я предполагаю) использует внутренний индекс, который вы храните в своем анимированном классе спрайта, чтобы вернуть спрайт по этому индексу в массиве спрайтов. Поскольку это единственное место, где вы используете массив, это ваша проблема. Поскольку вы не опубликовали свой код класса AnimatedSprite, я могу только предложить вам взглянуть на свойство CurrentImage в вашем классе AnimatedSprite и посмотреть, имеет ли оно доступ к Sprite []. Пожалуйста, опубликуйте класс AnimatedSprite, чтобы я мог помочь вам больше.

Кроме того, по моему личному мнению, вы не должны хранить экземпляры класса sprite в AnimatedSprite, вы должны просто хранить массив текстур. Хранение массива Sprite подразумевает, что каждый из этих спрайтов является отдельной сущностью, которой они не являются; они являются частью одного и того же анимированного спрайта.

...