123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- #region File Description
- //-----------------------------------------------------------------------------
- // AnimationPlayer.cs
- //
- // Microsoft XNA Community Game Platform
- // Copyright (C) Microsoft Corporation. All rights reserved.
- //-----------------------------------------------------------------------------
- #endregion
- using System;
- using Microsoft.Xna.Framework;
- using Microsoft.Xna.Framework.Graphics;
- namespace Platformer
- {
- /// <summary>
- /// Controls playback of an Animation.
- /// </summary>
- struct AnimationPlayer
- {
- /// <summary>
- /// Gets the animation which is currently playing.
- /// </summary>
- public Animation Animation
- {
- get { return animation; }
- }
- Animation animation;
- /// <summary>
- /// Gets the index of the current frame in the animation.
- /// </summary>
- public int FrameIndex
- {
- get { return frameIndex; }
- }
- int frameIndex;
- /// <summary>
- /// The amount of time in seconds that the current frame has been shown for.
- /// </summary>
- private float time;
- /// <summary>
- /// Gets a texture origin at the bottom center of each frame.
- /// </summary>
- public Vector2 Origin
- {
- get { return new Vector2(Animation.FrameWidth / 2.0f, Animation.FrameHeight); }
- }
- /// <summary>
- /// Begins or continues playback of an animation.
- /// </summary>
- public void PlayAnimation(Animation animation)
- {
- // If this animation is already running, do not restart it.
- if (Animation == animation)
- return;
- // Start the new animation.
- this.animation = animation;
- this.frameIndex = 0;
- this.time = 0.0f;
- }
- /// <summary>
- /// Advances the time position and draws the current frame of the animation.
- /// </summary>
- public void Draw(GameTime gameTime, SpriteBatch spriteBatch, Vector2 position, SpriteEffects spriteEffects)
- {
- if (Animation == null)
- throw new NotSupportedException("No animation is currently playing.");
- // Process passing time.
- time += (float)gameTime.ElapsedGameTime.TotalSeconds;
- while (time > Animation.FrameTime)
- {
- time -= Animation.FrameTime;
- // Advance the frame index; looping or clamping as appropriate.
- if (Animation.IsLooping)
- {
- frameIndex = (frameIndex + 1) % Animation.FrameCount;
- }
- else
- {
- frameIndex = Math.Min(frameIndex + 1, Animation.FrameCount - 1);
- }
- }
- // Calculate the source rectangle of the current frame.
- Rectangle source = new Rectangle(FrameIndex * Animation.Texture.Height, 0, Animation.Texture.Height, Animation.Texture.Height);
- // Draw the current frame.
- spriteBatch.Draw(Animation.Texture, position, source, Color.White, 0.0f, Origin, 1.0f, spriteEffects, 0.0f);
- }
- }
- }
|