babu61509 散播福音的祭司
註冊時間: 2007-08-26 文章: 142
681.01 果凍幣
|
發表於: 2007-9-7, PM 1:54 星期五 文章主題: [XNA] vol 2 直接從檔案讀取圖片 && 移動方向 && 改變解析度 ... |
|
|
前言 :
目前本人也只是剛接觸 XNA 不久,很多地方還不熟悉...
所以只能先教教大家2D的東西...
大家一起奮鬥吧XD
有問題可以一起討論!
標題是 : (太長被截XD)
[XNA] vol 2 直接從檔案讀取圖片 && 移動方向 && 改變解析度 && 全螢幕切換
------------------------------------------------------------------ [直接從檔案讀取圖片]
繼續上次的例子...
來教大家怎麼直接從檔案讀圖片喔!
上次是用 myTexture = content.Load<Texture2D>( "mytexture" ); 從方案裡面讀取Asset Name 叫 mytexture 的圖片
這次就直接從檔案讀出圖片來 ~ (要記得把圖片和程式放在一起喔)
用的是 Texture2D 的 FromFile 函式。
修改 LoadGraphicsContent 函式如下 :
代碼: |
protected override void LoadGraphicsContent(bool loadAllContent)
{
if (loadAllContent)
{
// 直接將 pupu.PNG 讀入 myTexture
myTexture = Texture2D.FromFile(graphics.GraphicsDevice,"pupu.PNG");
// 建立 spriteBatch 並指定繪圖裝置
spriteBatch = new SpriteBatch(graphics.GraphicsDevice);
}
}
|
這樣執行以後就跟上次的程式一樣的 !
只是改從檔案直接讀取圖片!
------------------------------------------------------------------ [更改視窗標題和解析度 And 全螢幕]
更改視窗標題只要指定字串到 base.Window.Title 就OK了
解析度則分別是 graphics.PreferredBackBufferWidth (寬)和 graphics.PreferredBackBufferHeight (高)
是否為全螢幕則是 graphics.IsFullScreen 預設是 false
當然還有一種方法是透過呼叫 graphics.ToggleFullScreen() 來切換的(下面 鍵盤輸入 篇有)
設定完以後要呼叫 graphics.ApplyChanges() 才會使用之前設定好的解析度喔 !
所以..更改 Initialize() 如下 :
代碼: |
protected override void Initialize()
{
// 更改視窗標題
base.Window.Title = "[XNA]vol 2 直接從檔案讀取圖片 && 移動方向 && 改變解析度 && 全螢幕切換";
// 更改視窗解析度
graphics.PreferredBackBufferWidth = 640;
graphics.PreferredBackBufferHeight = 480;
// 更改為全螢幕顯示
graphics.IsFullScreen = true;
// 啟用更改後屬性
graphics.ApplyChanges();
base.Initialize();
}
|
執行以後會發現解析度變了,而且變成全螢幕模式!
------------------------------------------------------------------ [鍵盤輸入]
透過 Keyboard.GetState() 會傳回一個 KeyboardState 型的變數,裡面會取得當時的按鍵表。
也就是說要先宣告一個 KeyboardState 變數,當要取得按鍵時再呼叫 Keyboard.GetState()。
將 Update 前和裡面更改為下 :
代碼: |
// Sprite 的移動速度和方向 (用向量儲存)
Vector2 spriteSpeed = new Vector2(50.0f, 50.0f);
// 宣告 KeyboardState 型 keyboard 變數
KeyboardState keyboard;
protected override void Update(GameTime gameTime)
{
// 在 Xbox 360 和 Windows 預設的離開鍵按下時離開遊戲
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
// 用 keyboard 變數取得 鍵盤按鍵狀態
keyboard = Keyboard.GetState();
// 依照方向鍵改變移動方向軸
if (keyboard.IsKeyDown(Keys.Up))
spriteSpeed.Y = -50;
if (keyboard.IsKeyDown(Keys.Down))
spriteSpeed.Y = 50;
if (keyboard.IsKeyDown(Keys.Left))
spriteSpeed.X = -50;
if (keyboard.IsKeyDown(Keys.Right))
spriteSpeed.X = 50;
// 切換視窗/全螢幕 (按ALT+ENTER)
if (keyboard.IsKeyDown(Keys.LeftAlt) || keyboard.IsKeyDown(Keys.RightAlt) && keyboard.IsKeyDown(Keys.Enter))
graphics.ToggleFullScreen();
// 移動 sprite
UpdateSprite(gameTime);
base.Update(gameTime);
}
|
執行以後會發現按上下左右就會讓圖片往按的方向移動喔,而且按ALT+ENTER可以切換視窗和螢幕 !
------------------------------------------------------------------ [全部的程式碼]
代碼: |
#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.Window.Title = "[XNA]vol 2 直接從檔案讀取圖片 && 移動方向 && 改變解析度 && 全螢幕切換";
// 更改視窗解析度
graphics.PreferredBackBufferWidth = 640;
graphics.PreferredBackBufferHeight = 480;
// 更改為全螢幕顯示
graphics.IsFullScreen = true;
// 啟用更改後屬性
graphics.ApplyChanges();
base.Initialize();
}
// 我們要畫的 texture (用來放圖片的)
Texture2D myTexture;
// 設定 sprite 要畫在哪
Vector2 spritePosition = Vector2.Zero;
// 畫 sprite 用的物件 (用來畫Texture2D的)
SpriteBatch spriteBatch;
protected override void LoadGraphicsContent(bool loadAllContent)
{
if (loadAllContent)
{
// 直接將 pupu.PNG 讀入 myTexture
myTexture = Texture2D.FromFile(graphics.GraphicsDevice,"pupu.PNG");
// 建立 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);
// 宣告 KeyboardState 型 keyboard 變數
KeyboardState keyboard;
protected override void Update(GameTime gameTime)
{
// 在 Xbox 360 和 Windows 預設的離開鍵按下時離開遊戲
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
// 用 keyboard 變數取得 鍵盤按鍵狀態
keyboard = Keyboard.GetState();
// 依照方向鍵改變移動方向軸
if (keyboard.IsKeyDown(Keys.Up))
spriteSpeed.Y = -50;
if (keyboard.IsKeyDown(Keys.Down))
spriteSpeed.Y = 50;
if (keyboard.IsKeyDown(Keys.Left))
spriteSpeed.X = -50;
if (keyboard.IsKeyDown(Keys.Right))
spriteSpeed.X = 50;
// 切換視窗/全螢幕 (按ALT+ENTER)
if (keyboard.IsKeyDown(Keys.LeftAlt) || keyboard.IsKeyDown(Keys.RightAlt) && keyboard.IsKeyDown(Keys.Enter))
graphics.ToggleFullScreen();
// 移動 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)
{
graphics.GraphicsDevice.Clear(Color.CornflowerBlue);
// 畫 sprite.
spriteBatch.Begin(SpriteBlendMode.AlphaBlend);
spriteBatch.Draw(myTexture, spritePosition, Color.White);
spriteBatch.End();
base.Draw(gameTime);
}
}
|
------------------------------------------------------------------ [不準確的預告]
學到這邊其實就可以做從檔案讀入地圖然後顯示出來全部地圖的程式了!
下篇介紹...角色的動作圖片切換方法 ! SpriteBatch.Draw 的 詳細介紹 ! _________________ 已經畢業了!! |
|