XNA-滾動背景(程式範例)

XNA-滾動背景(程式範例)

    滾動背景最主要的作用再於玩家可以感覺自己在自動的前進,一直重複這張圖片,這樣的手法在以前的許多遊戲都常常使用到,像是太空侵略者或是沙羅漫蛇等遊戲,幾乎都是利用這個原理來做背景的處理,一方面也可以不必要再去處理許多背景圖片的轉換,因為大多都用在宇宙中,無需有較大的變化,因此可以使用此方法。

    此範例是參考了How To: Make a Scrolling Background這篇文章,將它的範例修改成最簡單的方式呈現,雖然原範例寫得過於複雜,但利用的原理相同的,主要是利用同一張圖片貼兩次在螢幕上,只是分別貼在不同的地方而已,而他是依據一張圖片的位置來決定貼第二次的圖片的位置,基本上就是將一張圖片貼兩次銜接在圖片的末端,如此重複就可以達到滾動背景的效果了。

程式範例:

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using Microsoft.Xna.Framework.Net;
using Microsoft.Xna.Framework.Storage;

namespace Scrollingtexture
{
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
        Texture2D bg;
        Vector2 screenpos, texturesize;
        int screenheight;
        int screenwidth;

        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
        }

        protected override void Initialize()
        {
            screenheight = GraphicsDevice.Viewport.Height;
            screenwidth = GraphicsDevice.Viewport.Width;
            screenpos = new Vector2(0, 0);
            base.Initialize();
        }

        protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);
            bg = Content.Load<Texture2D>("starfield");
            texturesize = new Vector2(0, bg.Height);
        }

        protected override void UnloadContent()
        {

        }

        protected override void Update(GameTime gameTime)
        {
            float elapsed = (float)gameTime.ElapsedGameTime.TotalSeconds;
            screenpos.Y += elapsed*100;
            screenpos.Y = screenpos.Y % bg.Height;
            base.Update(gameTime);
        }

        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);
            spriteBatch.Begin();
            if (screenpos.Y < screenheight)
            {
                spriteBatch.Draw(bg, screenpos,Color.White);
            }
            spriteBatch.Draw(bg, screenpos - texturesize,Color.White);
            spriteBatch.End();
            base.Draw(gameTime);
        }
    }
}

    33~34行利用內定的成員變數GraphicsDevice.Viewport.Height和GraphicsDevice.Viewport.Width分別取出視窗的高和寬,用變數存起來,方便網後能夠方便使用。

    35行讓圖片從座標(0,0)開始落下。

    43行宣告在此的原因是在於程式是先執行初始化的函數,然後才是LoadContent函數,而該Vector2變數最主要就是存放圖片的高度,往後用來決定圖片貼圖的位置。

    54行每秒加100個像素往下貼圖。

    55行讓貼圖的位置做循環。

    63~66行此段最主要是在當原本的圖片出現在最上面的時候,要補足該圖的下半部,而當該圖含蓋住整個視窗的話,就不需要補足它了,最主要就是利用這樣的方法達到重複循環圖片的效果。

1 

最後附上範例程式Scrollingtexture.rar