電腦遊戲製作開發設計論壇 首頁 電腦遊戲製作開發設計論壇
任何可以在PC上跑的遊戲都可以討論,主要以遊戲之製作開發為主軸,希望讓台灣的遊戲人有個討論、交流、教學、經驗傳承的園地
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入 

Google
[XNA] vol 2 直接從檔案讀取圖片 && 移動方向 && 改變解析度 ...

 
發表新主題   回覆主題    電腦遊戲製作開發設計論壇 首頁 -> 遊戲程式高級班:DirectX、OpenGL及各種圖型函式庫
上一篇主題 :: 下一篇主題  
發表人 內容
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 的 詳細介紹 !

_________________
已經畢業了!!
回頂端
檢視會員個人資料 發送私人訊息
從之前的文章開始顯示:   
發表新主題   回覆主題    電腦遊戲製作開發設計論壇 首頁 -> 遊戲程式高級班:DirectX、OpenGL及各種圖型函式庫 所有的時間均為 台灣時間 (GMT + 8 小時)
1頁(共1頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
可以 在這個版面附加檔案
可以 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作