首页 > Computer > XNA > XNA-滾動背景(程式範例)
2009
02-16

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

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

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

程式範例:

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using Microsoft.Xna.Framework;  
  5. using Microsoft.Xna.Framework.Audio;  
  6. using Microsoft.Xna.Framework.Content;  
  7. using Microsoft.Xna.Framework.GamerServices;  
  8. using Microsoft.Xna.Framework.Graphics;  
  9. using Microsoft.Xna.Framework.Input;  
  10. using Microsoft.Xna.Framework.Media;  
  11. using Microsoft.Xna.Framework.Net;  
  12. using Microsoft.Xna.Framework.Storage;  
  13.   
  14. namespace Scrollingtexture  
  15. {  
  16.     public class Game1 : Microsoft.Xna.Framework.Game  
  17.     {  
  18.         GraphicsDeviceManager graphics;  
  19.         SpriteBatch spriteBatch;  
  20.         Texture2D bg;  
  21.         Vector2 screenpos, texturesize;  
  22.         int screenheight;  
  23.         int screenwidth;  
  24.   
  25.         public Game1()  
  26.         {  
  27.             graphics = new GraphicsDeviceManager(this);  
  28.             Content.RootDirectory = “Content”;  
  29.         }  
  30.   
  31.         protected override void Initialize()  
  32.         {  
  33.             screenheight = GraphicsDevice.Viewport.Height;  
  34.             screenwidth = GraphicsDevice.Viewport.Width;  
  35.             screenpos = new Vector2(0, 0);  
  36.             base.Initialize();  
  37.         }  
  38.   
  39.         protected override void LoadContent()  
  40.         {  
  41.             spriteBatch = new SpriteBatch(GraphicsDevice);  
  42.             bg = Content.Load(“starfield”);  
  43.             texturesize = new Vector2(0, bg.Height);  
  44.         }  
  45.   
  46.         protected override void UnloadContent()  
  47.         {  
  48.   
  49.         }  
  50.   
  51.         protected override void Update(GameTime gameTime)  
  52.         {  
  53.             float elapsed = (float)gameTime.ElapsedGameTime.TotalSeconds;  
  54.             screenpos.Y += elapsed*100;  
  55.             screenpos.Y = screenpos.Y % bg.Height;  
  56.             base.Update(gameTime);  
  57.         }  
  58.   
  59.         protected override void Draw(GameTime gameTime)  
  60.         {  
  61.             GraphicsDevice.Clear(Color.CornflowerBlue);  
  62.             spriteBatch.Begin();  
  63.             if (screenpos.Y < screenheight)  
  64.             {  
  65.                 spriteBatch.Draw(bg, screenpos,Color.White);  
  66.             }  
  67.             spriteBatch.Draw(bg, screenpos – texturesize,Color.White);  
  68.             spriteBatch.End();  
  69.             base.Draw(gameTime);  
  70.         }  
  71.     }  
  72. }  

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

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

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

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

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

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

1 

最後附上範例程式Scrollingtexture.rar

最后编辑:
作者:wy182000
这个作者貌似有点懒,什么都没有留下。

留下一个回复