?? 游戲程式設計指南(hoho篇) lesson4.htm
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0045)http://www.gameres.com/HoHo/Guide/Lesson4.htm -->
<HTML><HEAD><TITLE>游戲程式設計指南(HoHo篇) Lesson4 - GameRes.com</TITLE>
<META content=zh-cn http-equiv=Content-Language>
<META content="MSHTML 5.00.3700.6699" name=GENERATOR>
<META content=FrontPage.Editor.Document name=ProgId>
<META content="text/html; charset=gb2312" http-equiv=Content-Type></HEAD>
<BODY aLink=#ff9900 bgColor=#000000 leftMargin=0 link=#ff9900 text=#ffffff
topMargin=0 vLink=#ff9900><FONT face=Arial>
<TABLE border=0 borderColor=#111111 cellPadding=0 cellSpacing=0 id=AutoNumber1
style="BORDER-COLLAPSE: collapse" width="100%">
<TBODY>
<TR>
<TD width="100%"><A href="http://www.gameres.com/"
title="中國游戲開發技術資源網 - GameRes.com"><IMG border=0 height=47
src="游戲程式設計指南(HoHo篇) Lesson4.files/titlesmall.jpg" width=200></A></TD></TR>
<TR>
<TD width="100%"> </TD></TR>
<TR>
<TD width="100%">
<DIV align=center>
<CENTER>
<TABLE border=0 cellPadding=0 cellSpacing=0 id=AutoNumber2
style="BORDER-COLLAPSE: collapse" width="85%">
<TBODY>
<TR>
<TD bgColor=#151631 width="100%">
<P align=right><FONT size=1>林德輝(Sea_Bug)
</FONT></P></TD></TR>
<TR>
<TD width="100%">
<P align=center><FONT size=1> </FONT><BR><FONT
color=#ffffee><B>游戲程式設計指南(HoHo篇)<BR>Lesson 4 —
圖形繪制篇</B></FONT></P></TD></TR>
<TR>
<TD width="100%"> </TD></TR>
<TR>
<TD width="100%"><FONT size=4><B>序</B></FONT><FONT
size=2><BR><BR> 這節講述的是HoHo的2D模塊最重要的功能,不用我多說,這就是HoHo的圖像繪制部分,相信沒人會否認圖像繪制對于游戲的重要性,基本上游戲給玩家的表述多是用圖像來說明,HoHo提供了多種多樣的圖像繪制方式,同時在性能方面也有相當的表現。<BR><BR> 一般在游戲中常用的繪圖方式有4種:普通繪制、顏色鍵(ColorKey)繪制、Alpha混合繪制、色彩飽和(Additive)繪制,其中普通繪制和顏色鍵(ColorKey)繪制在DirectDraw中就有支持,Alpha和Additive則需要我們自己進行運算處理(這里</FONT><FONT
face=Arial
size=2>Alpha混合繪制和色彩飽和(Additive)繪制簡稱為Alpha和Additive),不過沒關系,這些運算以及處理工作HoHo已經為你完成,你需要知道的就只是如何去使用。</FONT><FONT
size=2><BR><BR><BR></FONT><B>目錄:</B><FONT size=2><BR></FONT> <A
href="http://www.gameres.com/HoHo/Guide/Lesson4.htm#普通繪制"
target=_self>普通繪制</A><BR> <FONT face=Arial><A
href="http://www.gameres.com/HoHo/Guide/Lesson4.htm#顏色鍵(ColorKey)繪制"
target=_self>顏色鍵(ColorKey)繪制</A></FONT><BR> <FONT face=Arial><A
href="http://www.gameres.com/HoHo/Guide/Lesson4.htm#Alpha混合繪制"
target=_self>Alpha混合繪制</A></FONT><BR> <A
href="http://www.gameres.com/HoHo/Guide/Lesson4.htm#色彩飽和(Additive)繪制"
target=_self>色彩飽和(Additive)繪制</A><FONT face=Arial><FONT face=Arial
size=2><BR></FONT> <A
href="http://www.gameres.com/HoHo/Guide/Lesson4.htm#圖像RECT裁減繪制"
target=_self>圖像RECT裁減繪制</A><FONT face=Arial
size=2><BR><BR><BR><BR></FONT><B><FONT face=Arial size=4><A
name=普通繪制>普通繪制</A></FONT></B><FONT face=Arial size=2><BR><BR>
普通繪圖非常簡單,只要是HoHo載入的圖像數據都可以用來直接普通繪制,普通繪制就是將圖像原貌反映在屏幕上,只用通過以下簡單的一句代碼就可以完成,代碼片段:<BR><BR></FONT></FONT></FONT><FONT
color=#99ccff face=宋體 size=2> GetGraphics()->DrawBitmapMMX(
100, 100, g_pBitmapBMP, SCREENBUFFER );</FONT><FONT face=Arial><FONT
face=Arial size=2><BR> </FONT><FONT face=Arial>
<DIV align=center>
<CENTER>
<TABLE border=1 borderColor=#002846 cellPadding=0 cellSpacing=0
id=AutoNumber8 style="BORDER-COLLAPSE: collapse" width="80%">
<TBODY>
<TR>
<TD align=middle bgColor=#001824 width="100%"><FONT
size=2>普通繪制</FONT></TD></TR>
<TR>
<TD align=middle width="100%"><FONT size=1> <BR><IMG
border=0 height=401
src="游戲程式設計指南(HoHo篇) Lesson4.files/Lesson4_2.gif"
width=619><BR> </FONT></TD></TR></TBODY></TABLE></CENTER></DIV></FONT>
<P><FONT face=Arial
size=2>這樣就行了,是不是很簡單?這里還需要說明一下SCREENBUFFER的功能目的,SCREENBUFFER實際上也就是一個LP_BITMAPX數據,只不過它比較特殊,它被HoHo默認創建,并且作為與DirectDraw接口進行圖像數據更新的一個通訊圖像數據,我們只需要知道把圖像繪制到它上面就OK了。<BR><BR> 可能有人會問,我們這里的繪制是從g_pBitmapBMP到SCREENBUFFER,我們能否倒置?答案是肯定的,如果你把他們的位置倒換,那么就變成SCREENBUFFER的數據被繪制到g_pBitmapBMP中,除了SCREENBUFFER外,只要是常規的LP_BITMAPX數據結構都可以進行此項操作,有些特殊的LP_BITMAPX結構是無法互通數據,這里我們留著后面再來介紹,將圖像繪制出來是此節的主要討論內容。<BR><BR><BR><BR></FONT><B><FONT
face=Arial size=4><A
name=顏色鍵(ColorKey)繪制>顏色鍵(ColorKey)繪制</A></FONT></B><FONT face=Arial
size=2><BR><BR> 游戲中不可能所有的圖像都是整塊并且標準的四邊形圖像,比如游戲中的人物(精靈),它們在圖形文件中所存儲的數據如下:</FONT></P>
<DIV align=center>
<CENTER>
<TABLE border=1 borderColor=#002846 cellPadding=0 cellSpacing=0
id=AutoNumber9 style="BORDER-COLLAPSE: collapse" width="80%">
<TBODY>
<TR>
<TD align=middle bgColor=#001824 width="100%"><FONT
size=2>人物(精靈)原圖</FONT></TD></TR>
<TR>
<TD align=middle width="100%"><FONT size=1> <BR><IMG
border=0 height=192
src="游戲程式設計指南(HoHo篇) Lesson4.files/character.bmp"
width=96><BR> </FONT></TD></TR></TBODY></TABLE></CENTER></DIV>
<P><FONT face=Arial
size=2>如果我們按照普通繪制的方法,那么非人物(精靈)的圖像數據部分也會被繪制到屏幕上,令人厭惡的紫色色塊也會進入我們的游戲視野,我們來看看如何將這些紫色部分去掉,不要讓它來影響我們游戲的視覺效果。(通常我們不需要的顏色稱之為顏色鍵(ColorKey))<BR><BR> HoHo中可以直接進行ColorKey的過濾處理,不過在HoHo對圖像繪制進行ColorKey過濾的時候,我們必須事先通知HoHo,什么顏色是ColorKey,看看如下代碼片段:<BR><BR></FONT></FONT><FONT
color=#99ccff face=宋體 size=2> g_pBitmapBMP->SetColorKey(
RGB2Hi(255,0,255) );</FONT></P><FONT face=Arial>
<DIV align=center>
<CENTER>
<TABLE border=1 borderColor=#002846 cellPadding=0 cellSpacing=0
id=AutoNumber10 style="BORDER-COLLAPSE: collapse" width="80%">
<TBODY>
<TR>
<TD align=middle bgColor=#001824 width="100%"><FONT
size=2>設置ColorKey</FONT></TD></TR>
<TR>
<TD align=middle width="100%"><FONT size=1> <BR><IMG
border=0 height=395
src="游戲程式設計指南(HoHo篇) Lesson4.files/Lesson4_1.gif"
width=491><BR> </FONT></TD></TR></TBODY></TABLE></CENTER></DIV>
<P><FONT face=Arial
size=2>這里我們用到了兩支函數,其中SetColorKey()就不用多說了,它就是用來設置LP_BITMAPX的ColorKey,它需要的是一個PIXEL結構的數值,PIXEL是一個16Bit的數值,不要問我為什么是16Bit,我只能回答你,因為我們的游戲是在16Bit模式下運行的;另外,讓我們看看RGB2Hi(),這是一支HoHo提供的全局函數,功能是將RGB顏色值轉換為上面我們所說的16Bit的PIXEL數據,這里我們用RGB=255,0,255(紫色)來作為ColorKey的設置參數。<BR><BR> 再我們進行圖像繪制之前,我需要說明一下,HoHo內部默認的ColorKey是RGB=0,0,0,可能有人會反對這樣的做法,畢竟RGB=0,0,0就是黑色,黑色在游戲圖像中出現的幾率還是相當頻繁,用黑色豈不是很不方便,用RGB=255,0,255來作為默認ColorKey不更好?我只能說請相信我,我這樣做肯定有其好處,雖然這個好處未必明顯;在SetColorKey()函數執行后,原來LP_BITMAPX的圖像數據中的黑色(RGB=0,0,0)部分均會被假黑色代替(RGB=0,0,1),所以上面我們設置紫色為ColorKey,HoHo會將原圖像中的紫色部分改變為黑色,而原來的黑色部分會被修正為假黑色。(如果你不明白這段文字所說的問題,請掠過此段繼續看后面)<BR><BR> 說了那么久,在我們設置好ColorKey之后,我們可以同樣通過DrawBitmapMMX()函數來進行ColorKey處理的圖像繪制,代碼示例如下:<BR><BR></FONT></FONT><FONT
color=#99ccff face=宋體 size=2> GetGraphics()->DrawBitmapMMX(
250, 100, g_pBitmapBMP, SCREENBUFFER, true );</FONT></P><FONT
face=Arial>
<DIV align=center>
<CENTER>
<TABLE border=1 borderColor=#002846 cellPadding=0 cellSpacing=0
id=AutoNumber11 style="BORDER-COLLAPSE: collapse" width="80%">
<TBODY>
<TR>
<TD align=middle bgColor=#001824 width="100%"><FONT
size=2>ColorKey圖像繪制</FONT></TD></TR>
<TR>
<TD align=middle width="100%"><FONT size=1> <BR><IMG
border=0 height=401
src="游戲程式設計指南(HoHo篇) Lesson4.files/Lesson4_3.gif"
width=619><BR> </FONT></TD></TR></TBODY></TABLE></CENTER></DIV>
<P><FONT face=Arial
size=2>在這里我們只是簡單的在函數后面加了一個true標記,此標記告訴HoHo,此圖像要進行ColorKey處理。<BR><BR><BR><BR></FONT><B><FONT
size=4><A name=Alpha混合繪制>Alpha混合繪制</A></FONT></B><FONT face=Arial
size=2><BR><BR>
前面兩種繪制方式是游戲中最基本的應用,現在我們來看看Alpha混合如何處理,Alpha混合處理可以給游戲帶來非常多的特效以及更好的視覺效果,在HoHo中,Alpha混合的算法以及優化等工作都已經幫你完成,你所需要的就是簡單的調用函數就可以輕松實現Alpha的混合處理,我們來看看一下的代碼片段:<BR><BR></FONT></FONT><FONT
color=#99ccff face=宋體
size=2> GetGraphics()->DrawBitmapAlphaMMX( 400, 100,
g_pBitmapBMP, SCREENBUFFER, 16 );</FONT></P><FONT face=Arial>
<DIV align=center>
<CENTER>
<TABLE border=1 borderColor=#002846 cellPadding=0 cellSpacing=0
id=AutoNumber12 style="BORDER-COLLAPSE: collapse" width="80%">
<TBODY>
<TR>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -