babu61509 散播福音的祭司
註冊時間: 2007-08-26 文章: 142
681.01 果凍幣
|
發表於: 2007-9-6, PM 5:26 星期四 文章主題: [XNA] vol 1 加圖片 && 畫圖片 && 讓圖片自動動及反彈 ! |
|
|
前言 :
目前本人也只是剛接觸 XNA 不久,很多地方還不熟悉...
所以只能先教教大家2D的東西...
大家一起奮鬥吧XD
有問題可以一起討論!
------------------------------------------------------------------ [哈啦區]
簡譯 XNA 說明文件內 :
Your First Game: Microsoft XNA Game Studio Express in 2D
前三個步驟就不講了,請大家自己看 XD
由於本人懶惰,所以只翻大概步驟,詳細請查看原文!
------------------------------------------------------------------ [缺很大的譯文]
步驟 4: 加入 Sprite
再來就是加入一張可以在螢幕上顯示的圖片,用一張小的bmp或是jpg檔都可以,自己畫的圖片也OK。
(內建支援 bmp, dds, dib, hdr, jpg, pfm, png, ppm, tga)
1. 在右邊的方案總管的專案名稱按右鍵 加入 - 現有項目,檔案類型選擇 Content Pipeline Files,選好檔案再按加入。(沒看到方案總管的按功能表 檢視 - 方案總管)
2. 加入圖片檔以後,會自動加入到 XNA Framework Content Pipeline (素材通道?),要用的時候就可以快速方便的使用。
3. 點選剛入的圖片,再按F4可以看到他的屬性欄,Assset Name 就是在程式碼中用來讀這個素材的名字。
4. 現在我們把剛剛加入的檔案,用程式碼把他讀近來,找到 LoadGraphicsContent 函式,在前面和裡面加入程式碼,讓他看起來像是 :
代碼: |
// 我們要畫的 texture (用來放圖片的)
Texture2D myTexture;
// 設定 sprite 要畫在哪
Vector2 spritePosition = Vector2.Zero;
// 畫 sprite 用的物件 (用來畫Texture2D的)
SpriteBatch spriteBatch;
protected override void LoadGraphicsContent( bool loadAllContent )
{
if (loadAllContent)
{
// 將 Asset Name叫做 mytexture 的素材載入到 MyTexture
myTexture = content.Load<Texture2D>( "mytexture" );
// 建立 spriteBatch 並指定繪圖裝置
spriteBatch = new SpriteBatch( graphics.GraphicsDevice );
}
}
|
注意要把content.load裡的傳入值(mytexture)改成你之前加入圖片的Asset Name 喔!
5. 加入程式碼在 Draw ,讓他看起來像是 :
代碼: |
protected override void Draw( GameTime gameTime )
{
// 清除輸出畫面為 CornflowerBlue (算是淺藍色?)
graphics.GraphicsDevice.Clear( Color.CornflowerBlue );
// 畫 sprite.
spriteBatch.Begin( SpriteBlendMode.AlphaBlend );
spriteBatch.Draw( myTexture, spritePosition, Color.White );
spriteBatch.End();
base.Draw( gameTime );
}
|
6. 建立並執行你的遊戲,就可以看到加入的那張圖片。
------------------------------------------------------------------ [插花]
到這裡大家應該就知道,Texture2D 宣告出來的物件是用來放圖片的。
SpriteBatch 宣告出來的物件是用來畫 Texture2D 的。
也就是說,Texture2D放圖片,透過SpriteBatch來把他畫出來。
------------------------------------------------------------------ [繼續]
步驟 5: 讓 Sprite 移動和反彈
更改 Update 函式裡和之前的程式碼像這樣 :
代碼: |
// Sprite 的移動速度和方向 (用向量儲存)
Vector2 spriteSpeed = new Vector2( 50.0f, 50.0f );
protected override void Update( GameTime gameTime )
{
// 在 Xbox 360 和 Windows 預設的離開鍵按下時離開遊戲
if (GamePad.GetState( PlayerIndex.One ).Buttons.Back == ButtonState.Pressed)
this.Exit();
// 移動 sprite
UpdateSprite( gameTime );
base.Update( gameTime );
}
void UpdateSprite( GameTime gameTime )
{
// Sprite 位置 += Sprite 速度 * 上次更新的間隔時間(秒)
spritePosition += spriteSpeed * (float)gameTime.ElapsedGameTime.TotalSeconds;
int MaxX = graphics.GraphicsDevice.Viewport.Width - myTexture.Width;
int MinX = 0;
int MaxY = graphics.GraphicsDevice.Viewport.Height - myTexture.Height;
int MinY = 0;
// 檢查反彈
if (spritePosition.X > MaxX)
{
spriteSpeed.X *= -1;
spritePosition.X = MaxX;
}
else if (spritePosition.X < MinX)
{
spriteSpeed.X *= -1;
spritePosition.X = MinX;
}
if (spritePosition.Y > MaxY)
{
spriteSpeed.Y *= -1;
spritePosition.Y = MaxY;
}
else if (spritePosition.Y < MinY)
{
spriteSpeed.Y *= -1;
spritePosition.Y = MinY;
}
}
|
執行以後就會發現,圖片會動而且遇到邊邊會反彈囉!
------------------------------------------------------------------ [全部的程式碼]
代碼: |
#region Using Statements
using System;
using System.Collections.Generic;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Storage;
#endregion
public class Game1 : Microsoft.Xna.Framework.Game
{
GraphicsDeviceManager graphics;
ContentManager content;
public Game1()
{
graphics = new GraphicsDeviceManager( this );
content = new ContentManager( Services );
}
protected override void Initialize()
{
base.Initialize();
}
// 我們要畫的 texture (用來放圖片的)
Texture2D myTexture;
// 設定 sprite 要畫在哪
Vector2 spritePosition = Vector2.Zero;
// 畫 sprite 用的物件 (用來畫Texture2D的)
SpriteBatch spriteBatch;
protected override void LoadGraphicsContent( bool loadAllContent )
{
if (loadAllContent)
{
// 將 Asset Name叫做 mytexture 的素材載入到 MyTexture
myTexture = content.Load<Texture2D>( "mytexture" );
// 建立 spriteBatch 並指定繪圖裝置
spriteBatch = new SpriteBatch( graphics.GraphicsDevice );
}
}
protected override void UnloadGraphicsContent( bool unloadAllContent )
{
if (unloadAllContent == true)
{
content.Unload();
}
}
// Sprite 的移動速度和方向 (用向量儲存)
Vector2 spriteSpeed = new Vector2( 50.0f, 50.0f );
protected override void Update( GameTime gameTime )
{
// 在 Xbox 360 和 Windows 預設的離開鍵按下時離開遊戲
if (GamePad.GetState( PlayerIndex.One ).Buttons.Back == ButtonState.Pressed)
this.Exit();
// 移動 sprite
UpdateSprite( gameTime );
base.Update( gameTime );
}
void UpdateSprite( GameTime gameTime )
{
// Sprite 位置 += Sprite 速度 * 上次更新的間隔時間
spritePosition += spriteSpeed * (float)gameTime.ElapsedGameTime.TotalSeconds;
int MaxX = graphics.GraphicsDevice.Viewport.Width - myTexture.Width;
int MinX = 0;
int MaxY = graphics.GraphicsDevice.Viewport.Height - myTexture.Height;
int MinY = 0;
// 檢查反彈
if (spritePosition.X > MaxX)
{
spriteSpeed.X *= -1;
spritePosition.X = MaxX;
}
else if (spritePosition.X < MinX)
{
spriteSpeed.X *= -1;
spritePosition.X = MinX;
}
if (spritePosition.Y > MaxY)
{
spriteSpeed.Y *= -1;
spritePosition.Y = MaxY;
}
else if (spritePosition.Y < MinY)
{
spriteSpeed.Y *= -1;
spritePosition.Y = MinY;
}
}
protected override void Draw( GameTime gameTime )
{
// 清除輸出畫面為 CornflowerBlue (算是淺藍色?)
graphics.GraphicsDevice.Clear( Color.CornflowerBlue );
// 畫 sprite.
spriteBatch.Begin( SpriteBlendMode.AlphaBlend );
spriteBatch.Draw( myTexture, spritePosition, Color.White );
spriteBatch.End();
base.Draw( gameTime );
}
}
|
------------------------------------------------------------------ [不準確的預告]
姆..下一篇應該是 鍵盤輸入 還有...直接從檔案載入圖片 和 輸出視窗的更改(解析度和全螢幕模式) _________________ 已經畢業了!! |
|