如何创建一个精灵类来防止一直重复相同的代码?

时间:2014-11-30 16:01:49

标签: c# class xna

我正在使用XNA创建Space Invaders副本。因此,我使用相同的逻辑在自己的类中设置了许多精灵的动画,但是对于大多数变量使用不同的值。这是我从spritesheets制作动画的方式:

Texture2D playerTex;
Vector2 playerPos = new Vector2(x, y), playerOrigin;
Rectangle playerHitBox;
float animationTimer = 0f, animationInterval = 100f;
int currentFrame = 1, frameWidth = example number, frameHeight = example number 2;

public void LoadContent(ContentManager Content)
{
    playerTex = Content.Load<Texture2D>("ship");
}

public void Update(GameTime gameTime)
{
    playerHitBox = new Rectangle(currentFrame * frameWidth, 0, frameWidth, frameHeight);
    playerOrigin = new Vector2(playerHitBox.X / 2, playerHitBox.Y / 2);
    animationTimer += (float)gameTime.ElapsedGameTime.Milliseconds;
    if (animationTimer > animationInterval)
    {
        currentFrame++;
        animationTimer = 0f;
    }

    if (currentFrame == 2)
    {
        currentFrame = 0;
    }
    playerHitBox = new Rectangle(currentFrame * frameWidth, 0, frameWidth, frameHeight);
    playerOrigin = new Vector2(playerHitBox.Width / 2, playerHitBox.Height / 2);
}

public void Draw(SpriteBatch spriteBatch)
{
    spriteBatch.Draw(playerTex, playerPos, playerHitBox, Color.White, 0f, Vector2.Zero, 1.0f, SpriteEffects.None, 0);
}

不是将这个逻辑用于它自己的类中的每个动画对象,而是寻找一种创建精灵类的方法,并使用精灵的Update() / Draw()继承。这样的事情对Draw()方法来说是一个好方法吗?

    public void Draw(Texture2D spriteTex, Vector2 spritePos, Nullable<Rectangle> spriteSourceRect, Color spriteColor, Single spriteRotation, Vector2 spriteOrigin, Vector2 spriteScale, SpriteEffects spriteEffects, Single spriteLayerDepth, SpriteBatch spriteBatch)
    {
        if (spriteTex != null)
        {
            spriteBatch.Draw(spriteTex, spritePos, spriteSourceRect, spriteColor, spriteRotation, spriteOrigin, spriteScale, spriteEffects, spriteLayerDepth);
        }
    }

1 个答案:

答案 0 :(得分:0)

你可以:

  1. 创建Sprite类以保留常见的动画属性,如纹理,持续时间和当前索引。
  2. 为位置,健康等自定义数据创建Invider类。
  3. 创建一个集合来存储游戏类中每个对象的自定义数据。
  4. 例如:

    class Sprite
    {
        public Texture2D texture;
        public Rectangle Frame;
        private frameIndex;
        private frameCount;
        private frameDuration;
        private frameInterval;
    
        public Sprite(Texture pTexture, ...)
        {
            // init sprite data
        }
        public Update(GameTime pGameTime)
        {
            // update sprite data
        }
    }
    
    class Invider
    {
        private Sprite Sprite;
        public Vector2 Porision;
        public int Health;
    
        public Invider(Sprite pSprite, Vector2 pPosition)
        {
            this.Sprite = pSprite;
            this.Position = pPosition;
        }
        public void Update(GameTime pGameTime)
        {
            // update invider data
        }
        public void Draw(SpriteBatch pSpriteBatch)
        {
            pSpriteBatch.Draw(this.Sprite.Texture, this.Sprite.Frame, this.Position, Color.White);
        }
    }
    
    public class Game1 : Game
    {
        private SpriteBatch spriteBatch;
        private Dictionary<int, Invider> invidersByID;
        private Sprite inviderSprite;
    
        public override Initialize()
        {
            // fill inviderByID collection
        }
    
        public override LoadData()
        {
            // create inviderSprite
        }
    
        public static UpdateStatic(GameTime pGameTime)
        {
            // update static data like frame index
        }
        public override void Update(GameTime pGameTime)
        {
            this.inviderSprite.Update(pGameTime);
    
            foreach(Invider invider in invidersByID.Values){
            {
                invider.Update(pGameTime);
            }
        }
        public override Draw(SpriteBatch pSpriteBatch)
        {
            this.spriteBatch.Begin();
            foreach(Invider invider in invidersByID.Values){
            {
                invider.Update(pGameTime);
            }
            this.spriteBatch.End();
        }
    }