• 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);
            }

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

  • 相关阅读:
    Quartz 配置
    8-6 泛型
    8-6 泛型
    HttpUrlConnect post提交
    正则表达式的简单运用
    bat ren命令修改文件后缀名
    集合的有序和重复
    一定要为HttpUrlConnection设置connectTimeout属性以防止连接被阻塞
    List toArray() toArray(T[] a)
    CSS选择器
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/2458374.html
Copyright © 2020-2023  润新知