XNA那些事二 舞动的精灵(上)

 

什么是精灵,这绝对不是XNA特有的概念,在FLASH等简单的游戏框架当中都有这个概念,精灵是一个游戏当中可移动的有动画效果的元素。那么举一个最简单的例子。

 

举一个最简单的例子,植物大战这个游戏大家都玩过吧,那么这个游戏场早就冰刀中哪些元素是精灵呢?僵尸、植物、阳光、后面的小车都有一个动画元素,那么无疑他们也都是精灵。

好概念就说到这里,如果在XNA的世界里绘制一个精灵呢,其实非常简单,依旧新建一个XNA GAME STUDIO 4.0的工程,名字就叫GAME1吧,咱们之前在框架介绍当中已经说过了GAME1这个工程,但是还有一个工程叫GAME1CONTENT这个他就是这个GAME的资源工程,向这个工程添加文件非常简单

读者可以上图另存一下,然后复制,点中GAME1CONTENT然后直接CTRL+V就可以了把这个资源包含到这个游戏里面去了,怎么样挺神奇的吧。

那么接下来我们应该如何来绘制这个图片呢?

很简单在

1 GAME1类当中添加两个个类变量

    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
        Texture2D texture1;//存放图片的对象

        Vector2 spritePosition1=new Vector2(0, 0);//绘制精灵的位置 

2 在LoadContent方法中把图版载入进来。

 

protected override void LoadContent()
        {
            // Create a new SpriteBatch, which can be used to draw textures.
         

            spriteBatch = new SpriteBatch(GraphicsDevice);

texture1 = Content.Load<Texture2D>("GameThumbnail");

}

接下来在Draw方法中把这个精灵这样画出来。

 protected override void Draw(GameTime gameTime)
        {
                     graphics.GraphicsDevice.Clear(Color.CornflowerBlue);

            // Draw the sprite. 

                       spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend);

          spriteBatch.Draw(texture1, spritePosition1, Color.White);//在spritePosition1的位置画texture1
            spriteBatch.End();

                   base.Draw(gameTime);

        }

OK再运行一下你的程序看在出现在左上角的小图片了吧。就这么简单。

那么其实一个静态的图片真的算不上是精灵的感觉,那么我们想想怎么让这个精灵动起来来吧。

在这面程序的基础上再添加一个类变量

     public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
        Texture2D texture1;
            Vector2 spritePosition1new Vector2(0, 0);//绘制精灵的位置;
                Vector2 spriteSpeed1 = new Vector2(50.0f, 50.0f);//精灵的速度。

然后添加这样一个函数

 void UpdateSprite(GameTime gameTime, ref Vector2 spritePosition, ref Vector2 spriteSpeed)
        {
            // Move the sprite by speed, scaled by elapsed time.
            spritePosition +=
                spriteSpeed * (float)gameTime.ElapsedGameTime.TotalSeconds;//根据游戏运行时间改变精灵的位置,大家看等式的右边(float)gameTime.ElapsedGameTime.TotalSeconds就是速度乘以时间再加上原来的位置,就是现在的位置这是基本的几何原理。

            int MaxX =
                graphics.GraphicsDevice.Viewport.Width - texture1.Width;//graphics.GraphicsDevice.Viewport.Width 这个是屏幕的宽度精灵最大的X位置不能超过屏幕
            int MinX = 0;
            int MaxY =
                graphics.GraphicsDevice.Viewport.Height - texture1.Height;//同上
            int MinY = 0;

            // Check for bounce.
            if (spritePosition.X > MaxX)
            {
                spriteSpeed.X *= -1;//如果精灵超出屏幕宽度范围则X轴的速度反向。
                spritePosition.X = MaxX;
            }

            else if (spritePosition.X < MinX)
            {
                spriteSpeed.X *= -1;//同上
                spritePosition.X = MinX;
            }

            if (spritePosition.Y > MaxY)
            {
                spriteSpeed.Y *= -1;;//如果精灵超出屏幕高度范围则Y轴的速度反向。

                spritePosition.Y = MaxY;
            }

            else if (spritePosition.Y < MinY)
            {
                spriteSpeed.Y *= -1;//同上
                spritePosition.Y = MinY;
            }

        }

然后在UPDATE方法中调用上面这个函数更新精灵的位置。

 protected override void Update(GameTime gameTime)
        {
            // Allows the game to exit
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back ==
                ButtonState.Pressed)
                this.Exit();

            // Move the sprite around.
            UpdateSprite(gameTime, ref spritePosition1, ref spriteSpeed1);//更新精灵位置
 
                      base.Update(gameTime);
        }

好了再运行这个游戏看到了一个会动的精灵了是不是?好让咱们下次更深入的了解一下精灵!

posted @ 2011-04-09 16:07  javawebsoa  Views(211)  Comments(0Edit  收藏  举报