1. 程式人生 > >DirectX遊戲程式設計入門——第二部分(遊戲程式設計工具箱) ——精靈程式設計之透明的精靈

DirectX遊戲程式設計入門——第二部分(遊戲程式設計工具箱) ——精靈程式設計之透明的精靈

       本系列文章由 net_assassin 整理編寫,轉載請註明出處。

http://blog.csdn.net/net_assassin/article/category/1100363

作者:net_assassin    郵箱: [email protected]    期待著與志同道合的朋友們相互交流


ID3DXSprite 物件對於計劃使用Direct3D編寫2D遊戲的程式設計師來說,實在是個極大的驚喜。

它的好處是,在使用和以前的實現(DirectDraw)一樣快得2D函式的同時有完整的3D渲染器隨時為你服務。將精靈處理成紋理並且以矩形(兩個三角形組成)來渲染,我們就可以對精靈進行變換

初始化精靈渲染器

       ID3DXSprite 物件是個包含從紋理繪製精靈的函式的精靈處理器。
LPD3DXSPRITE  spriteobj = NULL;

//將精靈處理器附著在Direct3D裝置上

HRESULT WINAPI D3DXCreateSprite(
         LPDIRECT3DDEVICE9  pDevice,
         LPD3DXSPRITE          *ppSprite
);

  1. 啟動精靈渲染器  在主D3D裝置中呼叫了BeginScene之後,就可以開始繪製精靈。      spriteobj->Begin(D3DXSPRITE_ALPHABLEND);
  2. 繪製精靈 
    HRESULT Draw(
        LPDIRECT3DTEXTURE9  pTexture,  //指定精靈所用的源影象的紋理
        CONST RECT  *pSrcRect, //可以從源影象中抓出“圖片單元”
        CONST D3DXVECTOR3 *pCenter,//指定旋轉發生的中心點
        CONST D3DXVECTOR3 *pPosition,//指定精靈的位置
        D3DCOLOR Color  //指定在繪製精靈影象時對其進行的色彩變更(不影響透明度)。顏色鍵
    )
  3. 停止精靈渲染器                                                                                                                                                              spriteobj->End();

透明的精靈程式

在之前我們的模板中新增改動:
  1. 在MyDirectX.h檔案中新增兩個函式的宣告,並且在MyDirectX.cpp檔案中新增相應的函式實現。
    D3DXVECTOR2 GetBitmapSize(string filename);
    LPDIRECT3DTEXTURE9 LoadTexture(string filename, D3DCOLOR transcolor = D3DCOLOR_XRGB(0,0,0));
    
    D3DXVECTOR2 GetBitmapSize(string filename)
    {
        D3DXIMAGE_INFO info;
        D3DXVECTOR2 size = D3DXVECTOR2(0.0f,0.0f);
    
        HRESULT result = D3DXGetImageInfoFromFile(filename.c_str(), &info);
        
        if (result == D3D_OK)
            size = D3DXVECTOR2( (float)info.Width, (float)info.Height);
        else
            size = D3DXVECTOR2( (float)info.Width, (float)info.Height);
    
        return size;
    }
    
    
    LPDIRECT3DTEXTURE9 LoadTexture(std::string filename, D3DCOLOR transcolor)
    {  
        LPDIRECT3DTEXTURE9 texture = NULL;
    
        //get width and height from bitmap file
        D3DXIMAGE_INFO info;
        HRESULT result = D3DXGetImageInfoFromFile(filename.c_str(), &info);
        if (result != D3D_OK) return NULL;
    
        //create the new texture by loading a bitmap image file
    	D3DXCreateTextureFromFileEx( 
            d3ddev,                //Direct3D device object
            filename.c_str(),      //bitmap filename
            info.Width,            //bitmap image width
            info.Height,           //bitmap image height
            1,                     //mip-map levels (1 for no chain)
            D3DPOOL_DEFAULT,       //the type of surface (standard)
            D3DFMT_UNKNOWN,        //surface format (default)
            D3DPOOL_DEFAULT,       //memory class for the texture
            D3DX_DEFAULT,          //image filter
            D3DX_DEFAULT,          //mip filter
            transcolor,            //color key for transparency
            &info,                 //bitmap file info (from loaded file)
            NULL,                  //color palette
            &texture );            //destination texture
    
        //make sure the bitmap textre was loaded correctly
        if (result != D3D_OK) return NULL;
    
    	return texture;
    }
  2. 修改Direct3D_init 和 Direct3D_Shutdown 以自動建立和銷燬精靈物件。
  3. 修改MyGame.cpp  在Game_Init 函式中新增:
    //load non-transparent image
        image_notrans = LoadTexture("shuttle_notrans.bmp");
        if (!image_notrans) return false;
    
        //load color-keyed transparent image
        image_colorkey = LoadTexture("shuttle_colorkey.bmp", D3DCOLOR_XRGB(255,0,255));
        if (!image_colorkey) return false;
    
        //load alpha transparent image
        image_alpha = LoadTexture("shuttle_alpha.tga");
        if (!image_alpha) return false;
    
    
        //You can use this function to get the size of the image
        D3DXVECTOR2 size = GetBitmapSize("shuttle_alpha.tga");
    
    在Game_Run 函式中新增:
    //start drawing
            spriteobj->Begin(D3DXSPRITE_ALPHABLEND);
    
            //draw the sprite
    		D3DXVECTOR3 pos1( 10, 10, 0);
    		spriteobj->Draw( image_notrans, NULL, NULL, &pos1, D3DCOLOR_XRGB(255,255,255));
    
    		D3DXVECTOR3 pos2( 350, 10, 0);
    		spriteobj->Draw( image_colorkey, NULL, NULL, &pos2, D3DCOLOR_XRGB(255,255,255));
    
    		D3DXVECTOR3 pos3( 700, 10, 0);
    		spriteobj->Draw( image_alpha, NULL, NULL, &pos3, D3DCOLOR_XRGB(255,255,255));
    
            //stop drawing
            spriteobj->End();
    Game_End中釋放資源:
    //free memory and shut down
        image_notrans->Release();
        image_colorkey->Release();
        image_alpha->Release();


說明 :從上圖我們可以看出,第一張圖部分是鏤空的,不是原來的黑色,原因是ID3DXSprite::Draw 預設使用黑色作為顏色鍵。

             如果在裝載紋理時指定了透明顏色鍵,則ID3DXSprite::Draw 將使用這一顏色鍵,即使在影象中還有alpha通道.

相關推薦

DirectX遊戲程式設計入門——第二部分遊戲程式設計工具箱) —— 繪製點陣圖

本系列文章由 net_assassin 整理編寫,轉載請註明出處。 http://blog.csdn.net/net_assassin/article/category/1100363 作者:net_assassin    郵箱: [em

DirectX遊戲程式設計入門——第二部分遊戲程式設計工具箱) ——精靈程式設計透明精靈

       本系列文章由 net_assassin 整理編寫,轉載請註明出處。 http://blog.csdn.net/net_assassin/article/category/1100363 作者:net_assassin    郵箱

程式設計入門——C語言翁凱老師)基礎部分

輸出“Hello World”(mooc第一週程式設計練習) # 定義main函式,如果定義為 int型的函式,記得要有返回值0,如果定義為void則不需要返回值。 # 輸出“Hello World”#include<stdio.h> int main(){ printf("H

Java語言程式設計基礎篇)第十版 程式設計練習題**3.10遊戲:加法測驗)

import java.util.Random; public class AdditionGame { public static void main(String[] args) { // TODO Auto-generated

Java語言程式設計基礎篇)第十版 程式設計練習題**3.15遊戲:彩票)

因為第三章還沒有陣列和迴圈,所以只能用IF語句和組合數的方法來判別使用者是否匹配到數字。 import java.util.Scanner; public class Lottery { public static void main(String[

用Python和Pygame寫遊戲-從入門到精通Sprite篇)

本文轉載自:http://eyehere.net/2011/python-pygame-novice-professional-sprite/ 這又是Pygame教程系列的一個——OVA篇,類似於py2exe篇一樣,額外寫的,也許不是pygame遊戲開發必須

用Python和Pygame寫遊戲-從入門到精通8)Move

1、Move background_image_filename = 'sushiplate.jpg' sprite_image_filename = 'fugu.png' import pygame from pygame.locals import * from s

網頁遊戲開發入門教程一webgame+design)

 一、簡單的程式框架。 webgame程式構成:三大部分。第一是資料流程。第二是程式。第三是美術。其中,資料流程包括了功能。也只有在功能中才能體現資料流程。資料流程相當的麻煩,後面再討論。比如最簡單的賣買產品。要實現這個功能。那麼需要有產品基礎表、產品詳細表、商店表、揹包表。如果擴充套件性更強,相應的雙表是

用Python和Pygame寫遊戲-從入門到精通py2exe篇)

本文轉載自:http://eyehere.net/2011/python-pygame-novice-professional-py2exe/ 這次不是直接講解下去,而是談一下如何把我們寫的遊戲做成一個exe檔案,這樣一來,使用者不需要安裝python就可以

用Python和Pygame寫遊戲-從入門到精通6)學習筆記

雖然是基礎,這裡還是要羅嗦一下,之前說的RBG影象,在遊戲中我們往往使用RGBA影象,這個A是alpha,也就是表示透明度的部分,值也是0~255,0代表完全透明,255是完全不透明,而像100這樣的數字,代表部分透明。你可以使用多種軟體建立含有Alpha通道的圖片,具體的網

用Python和Pygame寫遊戲-從入門到精通22)

辛苦啦~ 這次是我們系統的pygame理論學習的最後一章了,把這次的音樂播放講完了,pygame的基礎知識就全部OK了。不過作為完整的教程,只有理論講解太過枯燥了,我隨後還會加一個或更多的實踐篇系列,看需要可能也會追加真3D等額外的內容。 就像上次所說的,py

Oracle入門第二下)——單行函數

參數 tca 分享圖片 開始 () ins subst lpad 提醒 一、概述   什麽是單行函數: 操作數據對象 接受參數返回一個結果 只對一行進行變換 每行返回一個結果 可以轉換數據類型 可以嵌套 參數可以是一列或一個值     // 比如

MyEclipse教程:使用UML建立模組庫——第二部分二)

MyEclipse 線上訂購年終抄底促銷!火爆開搶>> 【MyEclipse最新版下載】 UML2建模檔案儲存在建模儲存庫中,建模可用於生成Java程式碼,或者可以從程式碼生成模型。 本教程介紹如何執行與建模儲存庫相關的任務。 您將學到如何: 建立UML模型儲存庫

MyEclipse教程:使用UML建立模組庫——第二部分一)

MyEclipse 線上訂購年終抄底促銷!火爆開搶>> 【MyEclipse最新版下載】 UML2建模檔案儲存在建模儲存庫中,建模可用於生成Java程式碼,或者可以從程式碼生成模型。 本教程介紹如何執行與建模儲存庫相關的任務。 您將學到如何: 建立UML模型儲存庫

java程式設計思想 第二一切都是物件)練習 2.11 練習2

練習2:參照本章的HelloDate.java這個例子,建立一個“hello,word”程式,該程式只要輸出這句話即可。你所編寫的類裡只需一個方法(即main方法,在程式啟動時被執行)。記住要把它設定為static形式,並指定引數列表即使根本不會用到這個列表。用javac進行編譯,再用java執行它

java程式設計思想 第二一切都是物件)練習 2.11 練習1

  練習1:建立一個類,它包含一個int域和一個char域,它們都沒有被初始化,將他們的值打印出來,以驗證java執行了預設初始化。     public class Main { static int a; static char ch

java程式設計思想 第二一切都是物件)練習 2.11 練習3

練習3:找出含有ATypeName的程式碼段,將起改寫成完整的程式,然後編譯,執行。 含有ATypeName的程式碼段在《Java程式設計思想》第25頁。 程式碼為:    class ATypeName {/* Class body goes here */}&nb

Linux入門第二二)

文字編輯器-vim Vim 有3種工作模式,分別是命令列模式、插入模式、底行模式 命令列模式:剛進入vim時的模式,該模式下可以移動游標進行瀏覽,可以進行整行刪除等操作,但無法編輯文字,命令列模式下的功能鍵有: • yy: 複製當前游標所在行• [n]yy:n為數字,複製當前游標開始的n行•

java程式設計思想 第二一切都是物件)練習 2.11 練習12

練習12:找出HelloDate.java的第二版本,也就是那個簡單註釋文件的示例。對該檔案執行javadoc,然後通過Web瀏覽器觀看執行結果。 該程式碼在本書第35頁 程式碼為: //:object/HelloDate.java import java.util.*; /** Th

java程式設計思想 第二一切都是物件)練習 2.11 練習11

練習11:將AllTheColorsOfTheRainbow這個示例改寫成一個程式,然後編譯、執行。 該示例在本書第36頁 示例為: class AllTheColorOfTheRainbow { int anIntegerRerRepresentingColors;