滾動背景最主要的作用再於玩家可以感覺自己在自動的前進,一直重複這張圖片,這樣的手法在以前的許多遊戲都常常使用到,像是太空侵略者或是沙羅漫蛇等遊戲,幾乎都是利用這個原理來做背景的處理,一方面也可以不必要再去處理許多背景圖片的轉換,因為大多都用在宇宙中,無需有較大的變化,因此可以使用此方法。
此範例是參考了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(“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
- 本文固定链接: http://www.wy182000.com/2009/02/16/xna-滾動背景程式範例/
- 转载请注明: wy182000 于 Studio 发表