創(chuàng)建第一個(gè)XNA程序:Hello XNA
下面創(chuàng)建一個(gè)簡單的Windows Phone 7的XNA程序,只是一個(gè)Hello XNA的文本,從屏幕的左上角一直往右下角移動,通過該例子來開始Windows Phone 7 XNA的游戲編程。
新建一個(gè)項(xiàng)目后可以看到這樣的一個(gè)項(xiàng)目工程結(jié)構(gòu),如圖所示。
Content項(xiàng)目是表示游戲的資源文件,相關(guān)游戲的資源就需要在Content目錄下進(jìn)行添加。
看一下Game1.cs這個(gè)主要的類:
- 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.Input.Touch;
- using Microsoft.Xna.Framework.Media;
- namespace HelloWorldXNA
- {
- /// <summary>
- /// 游戲的主要主體類
- /// </summary>
- public class Game1 : Microsoft.Xna.Framework.Game
- {
- GraphicsDeviceManager graphics;//用于管理圖形設(shè)備
- SpriteBatch spriteBatch;//游戲的圖形設(shè)備來畫2D對象
- SpriteFont spriteFont1;//字體
- Viewport viewport;//窗體
- Vector2 textSize;//字體大小 二維向量
- Vector2 textPosition;//字體位置
- public Game1()
- {
- graphics = new GraphicsDeviceManager(this);
- Content.RootDirectory = "Content";
- // Frame rate is 30 fps by default for Windows Phone.
- TargetElapsedTime = TimeSpan.FromTicks(333333);
- // Extend battery life under lock.
- InactiveSleepTime = TimeSpan.FromSeconds(1);
- }
- /// <summary>
- /// 游戲運(yùn)行前的一些初始化
- /// </summary>
- protected override void Initialize()
- {
- //在這里添加游戲的一些初始化處理
- base.Initialize();
- }
- /// <summary>
- /// 加載游戲資源,LoadContent只會執(zhí)行一次
- /// </summary>
- protected override void LoadContent()
- {
- // Create a new SpriteBatch, which can be used to draw textures.
- spriteBatch = new SpriteBatch(GraphicsDevice);
- // TODO: use this.Content to load your game content here
- viewport = this.GraphicsDevice.Viewport;//獲取游戲的窗體
- spriteFont1 = this.Content.Load<SpriteFont>("SpriteFont1");//加載字體資源
- textSize = spriteFont1.MeasureString("Hello,XNA!");//返回字符創(chuàng)的高度和寬度
- textPosition = new Vector2(0, 0);
- }
- /// <summary>
- /// 游戲退出,回收資源
- /// </summary>
- protected override void UnloadContent()
- {
- // TODO: Unload any non ContentManager content here
- }
- /// <summary>
- /// 繪制游戲前的更新處理
- /// </summary>
- /// <param name="gameTime">游戲的當(dāng)前時(shí)間對象</param>
- protected override void Update(GameTime gameTime)
- {
- // Allows the game to exit
- if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
- this.Exit();
- // TODO: Add your update logic here
- if (textPosition.X < viewport.Height)
- {
- textPosition.Y += 10 * (float)gameTime.ElapsedGameTime.TotalSeconds;
- textPosition.X += 20 * (float)gameTime.ElapsedGameTime.TotalSeconds;
- }
- else
- {
- textPosition.Y -= 10000 * (float)gameTime.ElapsedGameTime.TotalSeconds;
- textPosition.X -= 20000 * (float)gameTime.ElapsedGameTime.TotalSeconds;
- }
- base.Update(gameTime);
- }
- /// <summary>
- /// 繪制游戲
- /// </summary>
- /// <param name="gameTime">游戲的當(dāng)前時(shí)間對象</param>
- protected override void Draw(GameTime gameTime)
- {
- GraphicsDevice.Clear(Color.CornflowerBlue);
- // TODO: Add your drawing code here
- spriteBatch.Begin();
- spriteBatch.DrawString(spriteFont1, "Hello,XNA!", textPosition, Color.Red);
- spriteBatch.End();
- base.Draw(gameTime);
- }
- }
- }
運(yùn)行的效果如下:
對于新建一個(gè)XNA for WP7的工程,可以看到在它的工程文件中,有:Initialize(), LoadContent(), Update(),Draw()這幾個(gè)主要的函數(shù),那由些也就可以看得出XNA開發(fā)游戲的一個(gè)基本架構(gòu)了:
Loading:用來加載保證游戲可以正常運(yùn)行的所有資源等,這個(gè)狀態(tài)在整個(gè)系統(tǒng)中只在游戲開始前運(yùn)行,也就是說整個(gè)游戲的生命周期中只運(yùn)行一次。
Update:這個(gè)狀態(tài)是由所設(shè)置的時(shí)間間隔來驅(qū)動的,在每個(gè)時(shí)間間隔里重新計(jì)算游戲中各角色的狀態(tài),以及游戲分值和各種游戲邏輯。一般默認(rèn)為每秒30次(幀),如果設(shè)置間隔過大,游戲可能無法啟動。
Draw:這個(gè)狀態(tài)也是由所設(shè)置的時(shí)間間隔來驅(qū)動的,用來繪制各種變化到顯示設(shè)置上。
對于XNA資源,在創(chuàng)建新的工程時(shí),就一起創(chuàng)建了一個(gè)Content工程,所有的資源(圖片、聲音、視頻、字體、3D造形、紋理等)都要加載到這個(gè)工程中,并被這個(gè)工程編譯為.xnb格式的XNA二進(jìn)制文件,這樣才可以加載到游戲中,并被調(diào)用。
XNA游戲的生命周期如圖所示:
1.GraphicsDeviceManager:在XNA類庫介紹中提到的該類型是非常重要的。它為開發(fā)者提供方法來管理目標(biāo)設(shè)備的顯卡資源。簡單地說就是調(diào)用顯卡的一個(gè)接口,該對象的GraphicsDevice屬性代表當(dāng)前目標(biāo)設(shè)備的顯卡。
2.SpriteBatch:該對象主要的作用是繪制文字和2D圖像。在游戲開發(fā)過程中,它的作用是非常重要的,因?yàn)橛螒蛐枰蟛糠謭D片、文字和聲音等素材資源。所有游戲中需要顯示的畫面都必須經(jīng)過SpriteBatch對象中的Draw方法來繪制。
3.Initialize( ):該方法用來初始化游戲程序的變量和對象。它允許游戲在運(yùn)行之前做一些初始化的工作??梢栽诖瞬樵?nèi)魏涡枰姆?wù)和載入與圖形無關(guān)的內(nèi)容。例如,顯卡設(shè)備、游戲分?jǐn)?shù)設(shè)置等。
4.LoadContent( ):當(dāng)初始化完畢后,程序就進(jìn)入LoadContent,該方法用來加載游戲的素材,包括游戲的模式、聲音、圖像等。這個(gè)方法在一個(gè)游戲中只會被調(diào)用一次,并且是加載所有素材的地方。
5.Update( ):該方法相當(dāng)于Direct3D中的FrameMove,簡單地說就是在圖形上修改當(dāng)前畫面。它主要用于游戲執(zhí)行一些邏輯,如:刷新畫面、檢查碰撞、更新分?jǐn)?shù)、檢測游戲進(jìn)程、收集輸入數(shù)據(jù)以及播放音頻等。
6.Draw( ):該方法相當(dāng)于Windows編程的Paint或者OnPaint,是系統(tǒng)自動繪圖的方法。
游戲程序執(zhí)行完LoadContent后,開始進(jìn)入一個(gè)游戲循環(huán),無論用什么語言編寫游戲程序,都需要一個(gè)游戲循環(huán),這也是游戲程序與應(yīng)用程序的***區(qū)別。在XNA游戲項(xiàng)目中,游戲循環(huán)主要由Update和Draw兩個(gè)方法組成。
原文鏈接:http://www.cnblogs.com/linzheng/archive/2011/09/20/2182964.html
【編輯推薦】