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

Google
[XNA] vol 1 加圖片 && 畫圖片 && 讓圖片自動動及反彈 !

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


------------------------------------------------------------------ [不準確的預告]

姆..下一篇應該是 鍵盤輸入 還有...直接從檔案載入圖片 和 輸出視窗的更改(解析度和全螢幕模式)

_________________
已經畢業了!!
回頂端
檢視會員個人資料 發送私人訊息
taiwan08002
偶而上來逛逛的過客


註冊時間: 2007-08-15
文章: 5
來自: 那兒(*指*)
0.00 果凍幣

發表發表於: 2007-9-20, AM 11:28 星期四    文章主題: 引言回覆

呵哈。。。辛苦您了~~ Smile
回頂端
檢視會員個人資料 發送私人訊息 參觀發表人的個人網站 MSN Messenger
從之前的文章開始顯示:   
發表新主題   回覆主題    電腦遊戲製作開發設計論壇 首頁 -> 遊戲程式高級班:DirectX、OpenGL及各種圖型函式庫 所有的時間均為 台灣時間 (GMT + 8 小時)
1頁(共1頁)

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


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