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
);
- 啟動精靈渲染器 在主D3D裝置中呼叫了BeginScene之後,就可以開始繪製精靈。 spriteobj->Begin(D3DXSPRITE_ALPHABLEND);
- 繪製精靈
HRESULT Draw( LPDIRECT3DTEXTURE9 pTexture, //指定精靈所用的源影象的紋理 CONST RECT *pSrcRect, //可以從源影象中抓出“圖片單元” CONST D3DXVECTOR3 *pCenter,//指定旋轉發生的中心點 CONST D3DXVECTOR3 *pPosition,//指定精靈的位置 D3DCOLOR Color //指定在繪製精靈影象時對其進行的色彩變更(不影響透明度)。顏色鍵 )
- 停止精靈渲染器 spriteobj->End();
透明的精靈程式
在之前我們的模板中新增改動:- 在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; }
- 修改Direct3D_init 和 Direct3D_Shutdown 以自動建立和銷燬精靈物件。
- 修改MyGame.cpp 在Game_Init 函式中新增:
在Game_Run 函式中新增://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_End中釋放資源://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();
//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;