📄 游戏程式设计指南(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 + -