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行此段最主要是在當原本的圖片出現在最上面的時候,要補足該圖的下半部,而當該圖含蓋住整個視窗的話,就不需要補足它了,最主要就是利用這樣的方法達到重複循環圖片的效果。
最後附上範例程式Scrollingtexture.rar