??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲欧美日韩中文久久,精品乱码久久久久久久,狠狠色丁香久久婷婷综合http://www.shnenglu.com/kangnixi/archive/2010/04/10/112131.html烟皑烟皑Fri, 09 Apr 2010 17:30:00 GMThttp://www.shnenglu.com/kangnixi/archive/2010/04/10/112131.htmlhttp://www.shnenglu.com/kangnixi/comments/112131.htmlhttp://www.shnenglu.com/kangnixi/archive/2010/04/10/112131.html#Feedback0http://www.shnenglu.com/kangnixi/comments/commentRss/112131.htmlhttp://www.shnenglu.com/kangnixi/services/trackbacks/112131.html    键盘是计机的标准配件之一Q也是基本的E序输入装置。虽然目前大多数游戏E序以鼠标或者游戏杆来作ؓ主要的输入设备。相比之下,以键盘操U|戏的方式g变得不太重要Q但有时候还是会使用键盘来设计一些快速键的功能,例如跌片头动画、结束游戏等

1、虚拟键?/strong>
    在早期非Windowspȝ的机器上Q如果一般应用程序要取得使用者键盘的输入Q就必须d得输入按键的“扫描码(Scan codeQ?#8221;。扫描码由实际的键盘g所产生Q但是由于不同国家不同区域所使用的键盘设备可能不同,因此Windowspȝ便发展了一套标准。其解决办法是Ҏ有键盘的按键定义Zl通用?#8220;虚拟键码”Q也是说在Windowspȝ下所有的按键都会被视拟键Q包含鼠标键在内Q,而每一个虚拟键都有其对应的一个虚拟键码?br>
2、键盘消?br>    Windowspȝ是一个消息驱动的环境Q一旦用者在键盘上进入输入操作,那么pȝ便会接受到对应的键盘消息。下面是最常见?中键盘消息:
    WM_KEYDOWNQ按下按键消?br>    WM_KEYUPQ松开按键消息
    WM_CHARQ字W消?br>    当某一按键被按下时Q伴随着q个操作所产生的是以虚拟键码类型传送的WM_KEYDOWN与WM_KEYUP消息。当E序接受到这些消息时Q便可由虚拟键码的信息来得知是哪个按键被按下?br>    此外QWM_CHAR则是当按下的按键为定义域ASCII中的打印字符Ӟ便发出此字符消息。前面介l的消息循环中的Translate()函数的作用便是当按下的按键ؓ打印字符Ӟ便将虚拟键码消息q行转换q且发出字符消息

烟皑 2010-04-10 01:30 发表评论
]]>
背景动画设计——多背景循环动画http://www.shnenglu.com/kangnixi/archive/2010/04/09/112093.html烟皑烟皑Fri, 09 Apr 2010 10:16:00 GMThttp://www.shnenglu.com/kangnixi/archive/2010/04/09/112093.htmlhttp://www.shnenglu.com/kangnixi/comments/112093.htmlhttp://www.shnenglu.com/kangnixi/archive/2010/04/09/112093.html#Feedback0http://www.shnenglu.com/kangnixi/comments/commentRss/112093.htmlhttp://www.shnenglu.com/kangnixi/services/trackbacks/112093.html    多背景@环动ȝ背景循环原理其实与随W?#8220;背景动画设计——@环背景动?/a>”讲过的背景@环的原理相同。不q由于不同背景在q近层次上及实际视觉Ud速度上ƈ不相同,因此在以贴图的方法制作多背景循环动画Ӟ需要决定不同背景脓囄先后Z及滚动的速度?br>    下图是本随W多背景循环动画范例的运行结果,画面中出C几种背景及恐龙跑动的前景图:

    观察上面的图Q先要决定构成这q画面的贴图序。从q近层次来看Q天I是最q的Q接着是草地和山cQ因为山峦叠在草CQ接下来是房屋,最后才是前景的恐龙Q所以进行画面脓图时序应该是:天空?gt;草地?gt;山c?gt;房屋?gt;恐龙
    另外Q进行山峦、房屋及恐龙的脓图操作时Q还需要进行透明的操作,才能使得q些物体能叠在它们前一层的背景上?br>    军_了脓图时的顺序之后,接着要来军_北京滚动时的速度。由于最q的背景是天I,所以当前景的恐龙跑动时Q滚动速度应该是最慢的Q而天I前的山峦滚动速度应该比天I快一点,至于房屋与草圎ͼ因ؓq在一P所以滚动速度相同Q而且又会比山峦还要快一点,q样我们决定出了所有背景的滚动速度为:天空<山c<草地=房屋
    前景的恐龙只让它在原地跑动,׃背景自动向右滚动Q因此就会生恐龙向前奔跑的视觉效果?br>

范例ch3_7Q运用脓图技巧ƈ调整不同背景循环滚动的速度Q显C具有远q层ơ感的多背景循环动画?br>下蝲地址Q?a >ch3_7
Q上传到windows liveI间Q可能需要MSN账号登陆Q?br>说明Q程序源代码中有相关的注释?br>E序q行l果如下图:



PSQ如惌得更多关于Visual C++游戏开发的内容Q可点击随笔Q《Visual C++游戏~程基础》学习笔记——烦引随W?/a>?

烟皑 2010-04-09 18:16 发表评论
]]>
背景动画设计——@环背景动?/title><link>http://www.shnenglu.com/kangnixi/archive/2010/04/09/112089.html</link><dc:creator>烟皑</dc:creator><author>烟皑</author><pubDate>Fri, 09 Apr 2010 09:40:00 GMT</pubDate><guid>http://www.shnenglu.com/kangnixi/archive/2010/04/09/112089.html</guid><wfw:comment>http://www.shnenglu.com/kangnixi/comments/112089.html</wfw:comment><comments>http://www.shnenglu.com/kangnixi/archive/2010/04/09/112089.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/kangnixi/comments/commentRss/112089.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/kangnixi/services/trackbacks/112089.html</trackback:ping><description><![CDATA[<br>    循环背景是不断地q行背景囄裁切与结合,然后昄在窗口上所产生的一U背景画面@环滚动的效果。下面就介绍如何利用同一张跟H口大小相同的背景天I图案来产生背景由左向右循环滚动的动L果的?br>    首先来介l背景图由左向右的概c假设下图所C的q张图是前一U画面更新时所看到的画面(外围的方框代表窗口)Q当下一U背景向x动时?br><br><br>Q阐qCؓ完成Q?br><br><br>范例ch3_6Q用定时器Q将q箋的Q务图案显C在H口上,产生动画效果?br>下蝲地址Q?a >ch3_6</a>Q上传到windows liveI间Q可能需要MSN账号登陆Q?br>说明Q程序源代码中有相关的注释?br>E序q行l果如下图:<br><img border=0 src="http://www.shnenglu.com/images/cppblog_com/kangnixi/游戏~程W??18.jpg"><br><br><br>PSQ如惌得更多关于Visual C++游戏开发的内容Q可点击随笔<a href="http://www.shnenglu.com/kangnixi/archive/2010/04/08/111931.html">Q《Visual C++游戏~程基础》学习笔记——烦引随W?/a>? <img src ="http://www.shnenglu.com/kangnixi/aggbug/112089.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/kangnixi/" target="_blank">烟皑</a> 2010-04-09 17:40 <a href="http://www.shnenglu.com/kangnixi/archive/2010/04/09/112089.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>背景动画设计——单一背景滚动http://www.shnenglu.com/kangnixi/archive/2010/04/09/112082.html烟皑烟皑Fri, 09 Apr 2010 09:06:00 GMThttp://www.shnenglu.com/kangnixi/archive/2010/04/09/112082.htmlhttp://www.shnenglu.com/kangnixi/comments/112082.htmlhttp://www.shnenglu.com/kangnixi/archive/2010/04/09/112082.html#Feedback0http://www.shnenglu.com/kangnixi/comments/commentRss/112082.htmlhttp://www.shnenglu.com/kangnixi/services/trackbacks/112082.html
    单一背景滚动的方法是Q利用一张相当大的背景图Q当游戏q行的时候,随着画面中h物的UdQ背景的昄区域也跟着Ud。要制作q样的背景滚动效果实际上很简单,只要在每ơ背景画面更新时改变要显C到H口上的区域可以了?br>

    例如在上面的q张背景NQ由左上到右下画?个方框,代表要显C在H口上的背景区域Q程序只要按照左上到右下的顺序在H口上连l显C3个方框区域,׃产生背景由左上往右下滚动的效果?br>


范例ch3_5Q以键盘?#8593;】、?#8595;】、?#8592;】、?#8594;】键控制背景滚动昄?br>下蝲地址Q?a >ch3_5Q上传到windows liveI间Q可能需要MSN账号登陆Q?br>说明Q程序源代码中有相关的注释?br>E序q行l果如下图:



PSQ如惌得更多关于Visual C++游戏开发的内容Q可点击随笔Q《Visual C++游戏~程基础》学习笔记——烦引随W?/a>?

 



烟皑 2010-04-09 17:06 发表评论
]]>
动画昄问题——脓囑֝标修正及排序贴图http://www.shnenglu.com/kangnixi/archive/2010/04/09/112075.html烟皑烟皑Fri, 09 Apr 2010 08:20:00 GMThttp://www.shnenglu.com/kangnixi/archive/2010/04/09/112075.htmlhttp://www.shnenglu.com/kangnixi/comments/112075.htmlhttp://www.shnenglu.com/kangnixi/archive/2010/04/09/112075.html#Feedback0http://www.shnenglu.com/kangnixi/comments/commentRss/112075.htmlhttp://www.shnenglu.com/kangnixi/services/trackbacks/112075.html    动画最基本的要求是画面要流畅且W合真实性。然后由于是利用贴图的方法来产生动画的,因此怼因一些小l节没注意到而得动ȝ效果看v来不太自然。在本篇随笔里就提出了两个这斚w的小问题Q在制作动画时若特别注意Q可使得游戏动画看v来更加顺畅?br>
1、脓囑֝标修?br>
2、排序脓?br>

范例ch3_4Q生多只恐龙随动,每次q行画面贴图前先完成排序操作QƈҎ龙跑动进行脓囑֝标修正,呈现较ؓ畅真实的动甅R?br>下蝲地址Q?a >ch3_4Q上传到windows liveI间Q可能需要MSN账号登陆Q?br>说明Q程序源代码中有相关的注释?br>E序q行l果如下图:




PSQ如惌得更多关于Visual C++游戏开发的内容Q可点击随笔Q《Visual C++游戏~程基础》学习笔记——烦引随W?/a>?


烟皑 2010-04-09 16:20 发表评论
]]>
基础动画昄——透明动画http://www.shnenglu.com/kangnixi/archive/2010/04/09/112072.html烟皑烟皑Fri, 09 Apr 2010 07:31:00 GMThttp://www.shnenglu.com/kangnixi/archive/2010/04/09/112072.htmlhttp://www.shnenglu.com/kangnixi/comments/112072.htmlhttp://www.shnenglu.com/kangnixi/archive/2010/04/09/112072.html#Feedback0http://www.shnenglu.com/kangnixi/comments/commentRss/112072.htmlhttp://www.shnenglu.com/kangnixi/services/trackbacks/112072.html    “透明动画”是游戏中一定会用到的基本技巧,它通过图案的连l显C及透明来生背景图上的动画效果。前面已介绍游戏循环昄动画的技巧,也介l了位图透明的方式,在本随W中用一个范例来说明透明动画的制作过E?br>    q个范例使用了如下图所C的恐龙跑动q箋图,每一张跑动图片的宽高?5×99?span style="COLOR: red">透明动画制作的前提是Q必d一个暂存的内存DC上完成每一张跑动图的透明然后再脓到窗口上Q这样在画面更新时才不会出现透明贴图q程中生的闪烁现象?br>


范例ch3_3Q显Cl动态前景图案,q在昄之前q行透明Q从而生透明效果?br>下蝲地址Q?a >ch3_3Q上传到windows liveI间Q可能需要MSN账号登陆Q?br>说明Q程序源代码中有相关的注释?br>E序q行l果如下图:



PSQ如惌得更多关于Visual C++游戏开发的内容Q可点击随笔Q《Visual C++游戏~程基础》学习笔记——烦引随W?/a>?

烟皑 2010-04-09 15:31 发表评论
]]>
基础动画昄——游戏@?/title><link>http://www.shnenglu.com/kangnixi/archive/2010/04/09/112069.html</link><dc:creator>烟皑</dc:creator><author>烟皑</author><pubDate>Fri, 09 Apr 2010 07:03:00 GMT</pubDate><guid>http://www.shnenglu.com/kangnixi/archive/2010/04/09/112069.html</guid><wfw:comment>http://www.shnenglu.com/kangnixi/comments/112069.html</wfw:comment><comments>http://www.shnenglu.com/kangnixi/archive/2010/04/09/112069.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/kangnixi/comments/commentRss/112069.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/kangnixi/services/trackbacks/112069.html</trackback:ping><description><![CDATA[<p><br>    定时器的使用固然很简单方便,但是事实上这LҎ仅适合用在昄易动d型的游戏程序中。因而一般而言Q游戏本w需要显C顺畅的游戏画面Q玩家感觉不到延迟的状况,基本上游戏画面必d一U钟之内更新臛_25ơ以上,q一U钟内程序还必须q行消息的处理和大量数学q算甚至x的输出等操作。而用定时器的消息来驱动q些操作Q往往达不到所要求的标准,不然׃产生画面昄不顺畅和游戏响应旉太长的情c?br><br>    q里提出一U?#8220;游戏循环”概念。游戏@环是原先程序中的消息@环加以修改,Ҏ时判断其中的内容是否有要处理的消息,如果有则q行处理Q否则按照设定的旉间隔来重l画面。下面所使用的游戏@环的E序代码Q?/p> <div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 游戏循环<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif">    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 当收到的msg.message不是H口l束消息WM_QUITQ则l箋q行循环?br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif">    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 其中msg是一个MSG的消息结构,其结构成员message则是一个消息类型的代号</span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">( msg.message</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">WM_QUIT )<br><img id=Codehighlighter1_136_921_Open_Image onclick="this.style.display='none'; Codehighlighter1_136_921_Open_Text.style.display='none'; Codehighlighter1_136_921_Closed_Image.style.display='inline'; Codehighlighter1_136_921_Closed_Text.style.display='inline';" align=top src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_136_921_Closed_Image onclick="this.style.display='none'; Codehighlighter1_136_921_Closed_Text.style.display='none'; Codehighlighter1_136_921_Open_Image.style.display='inline'; Codehighlighter1_136_921_Open_Text.style.display='inline';" align=top src="http://www.shnenglu.com/Images/OutliningIndicators/ContractedBlock.gif">    </span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_136_921_Closed_Text><img src="http://www.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_136_921_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif">        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 使用PeekMessage()函数来检目前是否有要处理的消息<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif">        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 若检到消息Q包含WM_QUIT消息Q则会返回一个非“0”的|否则q回“0”?br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif">        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 因此在游戏@环中Q若到消息便进行消息的处理Q否则运行else叙述之后的程序代?br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif">        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 注意QPeekMessage()函数不能用原先消息@环的条gGetMessage()取代<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif">        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 因ؓGetMessage()函数只有在取得WM_QUIT消息时才会返?#8220;0”Q其他时候则是返回非“0”?#8220;-1”Q发生错误时Q?/span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">( PeekMessage( </span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">msg, NULL, </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000"> ,PM_REMOVE) )<br><img id=Codehighlighter1_450_535_Open_Image onclick="this.style.display='none'; Codehighlighter1_450_535_Open_Text.style.display='none'; Codehighlighter1_450_535_Closed_Image.style.display='inline'; Codehighlighter1_450_535_Closed_Text.style.display='inline';" align=top src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_450_535_Closed_Image onclick="this.style.display='none'; Codehighlighter1_450_535_Closed_Text.style.display='none'; Codehighlighter1_450_535_Open_Image.style.display='inline'; Codehighlighter1_450_535_Open_Text.style.display='inline';" align=top src="http://www.shnenglu.com/Images/OutliningIndicators/ContractedSubBlock.gif">        </span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_450_535_Closed_Text><img src="http://www.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_450_535_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif">            TranslateMessage( </span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">msg );<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif">            DispatchMessage( </span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">msg );<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">        }</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif">        </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br><img id=Codehighlighter1_546_915_Open_Image onclick="this.style.display='none'; Codehighlighter1_546_915_Open_Text.style.display='none'; Codehighlighter1_546_915_Closed_Image.style.display='inline'; Codehighlighter1_546_915_Closed_Text.style.display='inline';" align=top src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_546_915_Closed_Image onclick="this.style.display='none'; Codehighlighter1_546_915_Closed_Text.style.display='none'; Codehighlighter1_546_915_Open_Image.style.display='inline'; Codehighlighter1_546_915_Open_Text.style.display='inline';" align=top src="http://www.shnenglu.com/Images/OutliningIndicators/ContractedSubBlock.gif">        </span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_546_915_Closed_Text><img src="http://www.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_546_915_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif">            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> GetTickCount()函数会取得系l开始运行到目前所l过的时_单位是百万分之一U?br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif">            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> DWORD GetTickCount();   </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">取得pȝ开始到目前l过的时?br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif">            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 在这里取得时间的目的主要是可以搭配接下来的判断式Q用来调整游戏运行的速度Q?br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif">            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 使得游戏不会因ؓq行计算机速度的不同而跑的太快或太慢</span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">            tNow </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> GetTickCount();<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif">            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> “tPre”记录前次l图的时_?#8220;tNow-tPre”则是计算上次l图到这ơ@环运行之?br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif">            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 相差多少旉。这里设|ؓ若相?00个单位时间以上则再次q行l图的操作,通过q个<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif">            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 数值的控制可以调整游戏q行的快?/span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">            </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(tNow</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">tPre </span><span style="COLOR: #000000">>=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">100</span><span style="COLOR: #000000">)<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif">                MyPaint(hdc);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">        }</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">    }</span></span></div>     如果?00改ؓ40Q即讑֮40个单位时_1微妙Q,那样每隔40个单位进行一ơ绘囄操作Q那?U钟大约重绘H口1000/40=25此,刚好可以辑ֈ期望倹{?br><br>    ׃循环的运行速度q比定时器发出时间信h得快Q因此用游戏@环的可以更精准地控制E序q行速度q提高每U钟画面重绘的次数?br><br><br>范例ch3_2Q用游戏@环生动L果,q在H口左上角显C每U画面更新次数?br>下蝲地址Q?a >ch3_2</a>Q上传到windows liveI间Q可能需要MSN账号登陆Q?br>说明Q程序源代码中有相关的注释?br>E序q行l果如下图:<br><img border=0 src="http://www.shnenglu.com/images/cppblog_com/kangnixi/游戏~程W??3.jpg"><br><br>    在这个范例中讑֮画面更新的时间间隔是0.1U,所以每U钟最多会更新10ơ画面,不过如果在范例运行的同时Q运行其他程序,那么CPU必须马上d理所开启的其他E序Q因此可能会使得每秒画面的更新次C降。这L情Ş在每U画面更新次数越高的时候会显著?br><br>PSQ如惌得更多关于Visual C++游戏开发的内容Q可点击随笔<a href="http://www.shnenglu.com/kangnixi/archive/2010/04/08/111931.html">Q《Visual C++游戏~程基础》学习笔记——烦引随W?/a>? <img src ="http://www.shnenglu.com/kangnixi/aggbug/112069.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/kangnixi/" target="_blank">烟皑</a> 2010-04-09 15:03 <a href="http://www.shnenglu.com/kangnixi/archive/2010/04/09/112069.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基础动画昄——定时器的?/title><link>http://www.shnenglu.com/kangnixi/archive/2010/04/09/112064.html</link><dc:creator>烟皑</dc:creator><author>烟皑</author><pubDate>Fri, 09 Apr 2010 06:17:00 GMT</pubDate><guid>http://www.shnenglu.com/kangnixi/archive/2010/04/09/112064.html</guid><wfw:comment>http://www.shnenglu.com/kangnixi/comments/112064.html</wfw:comment><comments>http://www.shnenglu.com/kangnixi/archive/2010/04/09/112064.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/kangnixi/comments/commentRss/112064.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/kangnixi/services/trackbacks/112064.html</trackback:ping><description><![CDATA[<br>    游戏中播攑֊ȝҎ有两U:一U是直接播放q文gQ如AVI和MPEGQ文Ӟ常用在游戏的片头与片;另一U则是游戏进行时利用q箋贴图的方式,制作动画的效果。事实上游戏E序本省几乎都是以无限@环的方式不断地在游戏H口q行H口画面重绘的操作,即画面没有M变化Q这个重l的操作q是会不断地q行Q一直到玩家选择l束游戏为止?br>    “基础动画昄”q一pd的随W将介绍如何利用Windows本省的定时器及游戏中常用的游戏@环来制作游戏的动态小狗,q介l最为常见的透明动画的制作方法?br><br>    定时器(TimerQ对象可以每隔一D|间发Z个时间消息,E序一旦接收到此消息之后,便可以决定接下来要做哪些事情。这L一个特性刚好可以适合播放静态的q箋囄Q生动ȝ效果。下面来介绍如何建立与用定时器?br><br><strong>1、徏立定时器</strong><br><br>    Windows API的SetTimer()函数可ؓH口建立一个定时器Qƈ且每隔一D|间就发出WM_TIMER消息Q此函数的用语法如下: <div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">UINT SetTime(  HWND 接收定时器消息的H口,<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif">                             UINT 定时器代?<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif">                             UINT 旉间隔,<br> <img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif">                            TIMERPROC 处理响应函数,);</span></div>     SetTimer()函数的第2个参数是定时器的代号Q这个代号在同一个窗口中必须是唯一的,且g?Q第3个参数则是定时器发出WM_TIMER消息的时间间隔,以千分之一Uؓ单位Q也是若此参数设ؓ1000Q则每间?U发Z个WM_TIMER消息Q第4个参数则用于讑֮ql调用处理WM_TIMER消息的响应函敎ͼ如果不用响应函数处理WM_TIMER消息Q则此参数应设ؓNULL?br>    下面是设定一个每?.5U发出WM_TIMER消息的定时器的程序代码?br> <div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">SetTimer(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">500</span><span style="COLOR: #000000">.NULL);</span></div>     <span style="COLOR: red">如果不用相应函数来处理定时器的消息Q那么就必须在消息处理函C定义处理消息的程序代码。(Q)</span><br><br><strong>2、删除定时器</strong><br><br>    定时器徏立后Q就会一直自动地按照讑֮的时间间隔发出WM_TIMER消息Q如果要停用某个定时器,必须使用下面的这个函数?br> <div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">BOOL KillTimer(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> 定时器代?;</span></div>     在大致了解了定时器的使用Ҏ后,接下来将q用定时器预先准备的几张h物连l摆动的位图Q生动ȝ效果Q如下图所C:<br><img border=0 alt="" src="http://www.shnenglu.com/images/cppblog_com/kangnixi/游戏~程W??1.jpg" width=1212 height=252><br><br>范例ch3_1Q用定时器Q将q箋的Q务图案显C在H口上,产生动画效果?br>下蝲地址Q?a >ch3_1</a>Q上传到windows liveI间Q可能需要MSN账号登陆Q?br>说明Q程序源代码中有相关的注释?br>E序q行l果如下图:<br><img border=0 src="http://www.shnenglu.com/images/cppblog_com/kangnixi/游戏~程W??2.jpg"><br><br><br>PSQ如惌得更多关于Visual C++游戏开发的内容Q可点击随笔<a href="http://www.shnenglu.com/kangnixi/archive/2010/04/08/111931.html">Q《Visual C++游戏~程基础》学习笔记——烦引随W?/a>?<br><br><br><br><br><br> <img src ="http://www.shnenglu.com/kangnixi/aggbug/112064.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/kangnixi/" target="_blank">烟皑</a> 2010-04-09 14:17 <a href="http://www.shnenglu.com/kangnixi/archive/2010/04/09/112064.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>游戏地图制作——景物脓?/title><link>http://www.shnenglu.com/kangnixi/archive/2010/04/09/112053.html</link><dc:creator>烟皑</dc:creator><author>烟皑</author><pubDate>Fri, 09 Apr 2010 04:34:00 GMT</pubDate><guid>http://www.shnenglu.com/kangnixi/archive/2010/04/09/112053.html</guid><wfw:comment>http://www.shnenglu.com/kangnixi/comments/112053.html</wfw:comment><comments>http://www.shnenglu.com/kangnixi/archive/2010/04/09/112053.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/kangnixi/comments/commentRss/112053.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/kangnixi/services/trackbacks/112053.html</trackback:ping><description><![CDATA[    <br>    学会了游戏地囄拼接技巧,本篇随笔要介绍如何在地图上布置一些景物,如花草树木和房子{。景物的点缀游戏地图更美观?br>    其实一旦完成了地图的拼接,景物部分容易多了。同样可使用一个与地图数组相同大小的数l来定义哪个囑֝位置上要出现哪些景物Q但׃景物囄大小与图块的大小q不一定相同,因此q要再将景物贴图的坐标稍作修正,使得q些景物可以出现在正的位置上。下面以?4×32的斜角图块上贴上一?0×60的树木图来做说明Q如下图所C:<br> <div align=center src_cetemp="/images/cppblog_com/kangnixi/游戏~程W?章图?41.jpg"><img border=0 src="http://www.shnenglu.com/images/cppblog_com/kangnixi/游戏~程W?章图?41.jpg"></div>     从图中可以看出,若斜角图块的贴图坐标是(xQyQ,那么树木囄X坐标必须向右Ud32-25=7个单位,Y坐标则必d上移?0-16=44个单位,则树木图的脓囑֝标ؓQx+7Qx-44Q。按照这LҎQ再对其他景物实际的贴图坐标q行修正Q最后就可以得到所要的地图场景了?br><br><br>范例ch2_11Q在斜角地图中加入景物,展现游戏地图效果?br>下蝲地址Q?a >ch2_11</a>Q上传到windows liveI间Q可能需要MSN账号登陆Q?br>说明Q程序源代码中有相关的注释?br>E序q行l果如下图:<br> <img border=0 src="http://www.shnenglu.com/images/cppblog_com/kangnixi/游戏~程W?章图?42.jpg"><br><br><br>PSQ如惌得更多关于Visual C++游戏开发的内容Q可点击随笔<a href="http://www.shnenglu.com/kangnixi/archive/2010/04/08/111931.html">Q《Visual C++游戏~程基础》学习笔记——烦引随W?/a>? <img src ="http://www.shnenglu.com/kangnixi/aggbug/112053.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/kangnixi/" target="_blank">烟皑</a> 2010-04-09 12:34 <a href="http://www.shnenglu.com/kangnixi/archive/2010/04/09/112053.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>游戏地图制作——斜角地图脓?/title><link>http://www.shnenglu.com/kangnixi/archive/2010/04/09/112050.html</link><dc:creator>烟皑</dc:creator><author>烟皑</author><pubDate>Fri, 09 Apr 2010 04:02:00 GMT</pubDate><guid>http://www.shnenglu.com/kangnixi/archive/2010/04/09/112050.html</guid><wfw:comment>http://www.shnenglu.com/kangnixi/comments/112050.html</wfw:comment><comments>http://www.shnenglu.com/kangnixi/archive/2010/04/09/112050.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/kangnixi/comments/commentRss/112050.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/kangnixi/services/trackbacks/112050.html</trackback:ping><description><![CDATA[<br>    斜角地图其实是^面地囄一U变化,它是拼接地囄囑֝内容Q由原先的四方Ş图案改变成由45度角俯瞰四方形图案时的菱形图案,p些菱形图案所拼接完成后的地图Q就是一张由45度角俯瞰的斜角地图了?br>    斜角地图拼接Ҏ同样也是使用与^面地图一L行与列的ҎQ事实上它们的原理是一L。但是由于地图拼接时只要取位图中的菱形部分,因此在脓囑֝标的计算会有所不同Q下面就来说明菱形图块在贴图时的差异Q如下图所C,其中的数字式囑֝的编受?br> <div align=center src_cetemp="/images/cppblog_com/kangnixi/游戏~程W?章图?33.jpg"><img border=0 src="http://www.shnenglu.com/images/cppblog_com/kangnixi/游戏~程W?章图?33.jpg"></div> <br>    上图中的左边是四方Ş囑֝的拼接,而右边的则是菱Ş囑֝的拼接。四方Ş囑֝拼接ҎӞ囑֝~号换算成行~号与列~号再换成贴图坐标。对于斜角地图拼接来_q些步骤都是一LQ但是在换算贴图坐标Ӟ׃只要昄囑֝中的菱Ş部分Q因此在贴图排列的方式上会有不同Q因而脓囑֝标的计算公式也就不一样了?br>    此外Q在合ƈ两个囑֝的菱形部分时Q?span style="COLOR: red">q需要加上一步透明的步?/span>Q不然若直接按照求得的脓囑֝标来q行贴图Q其效果׃如下图所C:<br> <div align=center src_cetemp="/images/cppblog_com/kangnixi/游戏~程W?章图?34.jpg"><img border=0 src="http://www.shnenglu.com/images/cppblog_com/kangnixi/游戏~程W?章图?34.jpg"></div> <br>    接下来看看斜角地图拼接时Q各个图块编号与实际排列的情形,如下图所C:<br> <div align=center src_cetemp="/images/cppblog_com/kangnixi/游戏~程W?章图?35.JPG"><img border=0 src="http://www.shnenglu.com/images/cppblog_com/kangnixi/游戏~程W?章图?35.JPG"></div> <br>    上图同样是一?×3个小囑֝所拼接而成的地图,其中的数字式囑֝~号。对于每一囑֝首先必须出它的行编号与列编P然后才能计算它实际的贴图坐标Q计行列编LҎ与随W?#8220;<a href="http://www.shnenglu.com/kangnixi/archive/2010/04/09/112037.html">游戏地图制作——^面地图脓?/a>”所使用的公式一P卻I <p align=center><span style="COLOR: red">列编?= 索引?/ 每一列的囑֝个数Q行敎ͼQ?br>行编?= 索引?% 每一列的囑֝个数Q行敎ͼQ?/span></p>     求出行编号与列编号后Q就可以计算出图块脓图时左上点的坐标Q除此之外,q需要知道图块中菱Ş部分的长度与高度Q这里假讑֛块中菱Ş的宽与高分别是w和hQ如下图所C:<br> <div align=center src_cetemp="/images/cppblog_com/kangnixi/游戏~程W?章图?36.jpg"><img border=0 src="http://www.shnenglu.com/images/cppblog_com/kangnixi/游戏~程W?章图?36.jpg"></div> <br>    那么囑֝左上点脓囑֝标的计算公式如下Q? <p align=center><span style="COLOR: red">左上点X坐标 = xstart + 行编?×Qw/2Q?- 列编?#215;Qw/2Q;<br><span style="COLOR: red">左上点Y坐标 = ystart + 列编?×Qh/2 Q? 行编?#215;Qh/2Q;</span></span></p> <br>    公式中的xstart与ystart是代表第一张图块左上角贴图坐标的位|,以下图来说明q个公式Q?br> <div align=center src_cetemp="/images/cppblog_com/kangnixi/游戏~程W?章图?37.jpg"><img border=0 src="http://www.shnenglu.com/images/cppblog_com/kangnixi/游戏~程W?章图?37.jpg"></div> <br>    图中以红U框来表C图块真正的矩Ş范围Q在q行贴图Ӟ首先要定义第1张图块的贴图位置Q其他图块的贴图坐标再由此图块向下g伸。现在假讄定图?的脓囑֝标是QxstartQystartQ,那么接下来考虑囑֝1的矩形范_它左上角贴图的坐标则是(xstart+w/2,ystart+h/2Q,考虑囑֝2的矩形范_它左上角贴图的坐标又变成Qxstart+w/2×2,ystart+h/2×2Q。依ơ类推,再加入行~号与列~号Q可以得C面的q个求图块脓囑֝标的公式Q? <p align=center><span style="COLOR: red">左上点X坐标 = xstart + 行编?×Qw/2Q;<br><span style="COLOR: red">左上点Y坐标 = ystart + 列编?×Qh/2 Q;</span></span></p> <br>    但是要注意一点,q是当图块都在属于同一列的情况。考虑下一列的囑֝4Q图?的左上角贴图坐标是(xstart-w/2,ystart+h/2Q,而图?的左上角贴图坐标是(xstart-w/2+w/2,ystart+h/2+h/2Q,囑֝6的左上角贴图坐标为(xstart-w/2+w/2×2,ystart+h/2+h/2×2Q,依次cLQ可看出同一列上坐标变化规律都是一LQ脓囑֝标都是往右下斚w增半个囑֝的长于高单位?br>    如果是在同一行(囑֝0??Q上的坐标变化则是往左下斚w减半个囑֝的长QX轴方向)以及递增半个囑֝的高QY轴方向)Q因此利用图块的行编号与列编号便得出了前面的贴图坐标公式?br>    计算出每个图块的坐标q完成了斜角地图的拼接后Q此时要整块地图脓到窗口中Q还需要知道地囄宽度与高度,计算的方法可以通过下图q行说明Q?br>    <div align=center src_cetemp="/images/cppblog_com/kangnixi/游戏~程W?章图?38.jpg"><img border=0 src="http://www.shnenglu.com/images/cppblog_com/kangnixi/游戏~程W?章图?38.jpg"></div> <br>    ׃面可以很Ҏ的推导出整张地图的宽与高计算公式如下Q? <p align=center><span style="COLOR: red">地图?nbsp;= Q列?行数Q?#215;Qw/2Q;<br><span style="COLOR: red">地图?nbsp;= Q列?行数Q?#215;Qh/2 Q;</span></span></p> <br>    在了解了关于斜角地图拼接的方法之后,接下来的q个范例上一节里的q面拼接地图转换成以45度角俯视的斜角地图?br><br>范例ch2_10Q从文g中加载位图,q显C在H口上?br>下蝲地址Q?a >ch2_10</a>Q上传到windows liveI间Q可能需要MSN账号登陆Q?br>说明Q程序源代码中有相关的注释?br>E序q行l果如下图:<br><img border=0 src="http://www.shnenglu.com/images/cppblog_com/kangnixi/游戏~程W?章图?40.jpg"> <br><br><br>PSQ如惌得更多关于Visual C++游戏开发的内容Q可点击随笔<a href="http://www.shnenglu.com/kangnixi/archive/2010/04/08/111931.html">Q《Visual C++游戏~程基础》学习笔记——烦引随W?/a>? <img src ="http://www.shnenglu.com/kangnixi/aggbug/112050.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/kangnixi/" target="_blank">烟皑</a> 2010-04-09 12:02 <a href="http://www.shnenglu.com/kangnixi/archive/2010/04/09/112050.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>游戏地图制作——^面地图脓?/title><link>http://www.shnenglu.com/kangnixi/archive/2010/04/09/112037.html</link><dc:creator>烟皑</dc:creator><author>烟皑</author><pubDate>Fri, 09 Apr 2010 01:26:00 GMT</pubDate><guid>http://www.shnenglu.com/kangnixi/archive/2010/04/09/112037.html</guid><wfw:comment>http://www.shnenglu.com/kangnixi/comments/112037.html</wfw:comment><comments>http://www.shnenglu.com/kangnixi/archive/2010/04/09/112037.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/kangnixi/comments/commentRss/112037.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/kangnixi/services/trackbacks/112037.html</trackback:ping><description><![CDATA[  <p><span>    游戏地图的画面是游戏中不可缺的重要环节之一Q要产生游戏地图Q除了可以直接用已l绘制好的地囑֤Q对于一些画面不太复杂,且具有重复性质的地图或场景Q有一个比较好的解军_法,那就是利用地图拼接的ҎQ将一块一块的小地图l合成较大的地图?br>    地图拼接的优点在于节省系l资源,因ؓ一张大型的地图会占用比较多的内存空_且加载速度较慢Q如果游戏中使用了ؓ数较多的大型地图Q那么势必会降低E序q行时的性能Q而且需要相当可观的内存I间?/span></p>     本篇随笔从最基本的^面地图脓囑ּ始讲Pq种贴图Ҏ相当直观Q即利用一张张四方形的图块组成同h四方形的大地图。下图便是一张由3U不同图块组合而成的^面地图?br> <div align=center src_cetemp="/images/cppblog_com/kangnixi/游戏~程W?章图?30.JPG"><img border=0 alt="" src="http://www.shnenglu.com/images/cppblog_com/kangnixi/游戏~程W?章图?31.JPG" width=286 height=216></div>     事实上,q张地图是由4×3张小囑֝l成的,列方向是4张图块,行方向是3张图块,q里使用列与行这L字眼Q是因ؓ随后用数l来定义地图中出现图块的内容?br>    从这张图中可以看刎ͼ一共出C3中不一L地图Q这是因为程序中会事先以数组定义哪个位置上要出现哪一U地图,使得拼接出来的地图能够符合需求。现在假讑֛?U不同图块的~号分别???Q那么可以以下面的这个一l数l来定义Z图中的地图?br> <div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img id=Codehighlighter1_17_57_Open_Image onclick="this.style.display='none'; Codehighlighter1_17_57_Open_Text.style.display='none'; Codehighlighter1_17_57_Closed_Image.style.display='inline'; Codehighlighter1_17_57_Closed_Text.style.display='inline';" align=top src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_17_57_Closed_Image onclick="this.style.display='none'; Codehighlighter1_17_57_Closed_Text.style.display='none'; Codehighlighter1_17_57_Open_Image.style.display='inline'; Codehighlighter1_17_57_Open_Text.style.display='inline';" align=top src="http://www.shnenglu.com/Images/OutliningIndicators/ContractedBlock.gif"><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> mapblock[</span><span style="COLOR: #000000">12</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">=</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_17_57_Closed_Text><img src="http://www.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_17_57_Open_Text><span style="COLOR: #000000">{</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,  </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">W??/span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif">                                           </span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,  </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">W??/span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">                                           </span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000">; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">W??br>      //Z么用一l数l而不是二l数l呢Q?/span></div> <p align=left><br>    这个一l数l以行列的方式排列,可以看出每个数组元素对应图中的哪个图块?br>    需要提醒的是,׃使用的是一位数l来定义地图内容Q因此上面这个数l的每个元素的烦引值是0……11.但是Q由于程序里不论计算囑֝贴图的位|还是计整张地囄长宽寸Q都是以行列来进行换的Q所以需要将数组的烦引D{换成相应的列~号与行~号Q{换公式如下:<br></p> <p align=center><span style="COLOR: red">列编?= 索引?/ 每一列的囑֝个数Q行敎ͼQ?br>行编?= 索引?% 每一列的囑֝个数Q行敎ͼQ?/span></p> <p>    下图验证上面的公式,Ҏ中的~号是一l数l的元素索引倹{?br> <div align=center src_cetemp="/images/cppblog_com/kangnixi/游戏~程W?章图?23.jpg"><img border=0 src="http://www.shnenglu.com/images/cppblog_com/kangnixi/游戏~程W?章图?23.jpg"></div> <br>    q里需要注意的是,列编号与行编L起始值都是从0开始算P而一旦算Z列编号与行编号之后,便可以按照图块的宽与高来求出囑֝贴图的位|,下面是计图块左上点贴图坐标的公式? <p> </p> <p align=center>左上点X坐标 = 行编?× 囑֝的宽度;<br>左上点Y坐标 = 列编?× 囑֝的高度;<br><br></p> <p>范例ch2_9Q运用不同小囑֝Q示范^面地图拼接的技巧?br>下蝲地址Q?a >ch2_9</a>Q上传到windows liveI间Q可能需要MSN账号登陆Q?br>说明Q程序源代码中有相关的注释?br>E序q行l果如下图:<br> <div align=center src_cetemp="/images/cppblog_com/kangnixi/游戏~程W?章图?32.jpg"><img border=0 src="http://www.shnenglu.com/images/cppblog_com/kangnixi/游戏~程W?章图?32.jpg"></div> <p> <br>PSQ如惌得更多关于Visual C++游戏开发的内容Q可点击随笔<a href="http://www.shnenglu.com/kangnixi/archive/2010/04/08/111931.html">Q《Visual C++游戏~程基础》学习笔记——烦引随W?/a>?/p> <img src ="http://www.shnenglu.com/kangnixi/aggbug/112037.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/kangnixi/" target="_blank">烟皑</a> 2010-04-09 09:26 <a href="http://www.shnenglu.com/kangnixi/archive/2010/04/09/112037.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>游戏画面Ҏ制作——透明半透明效果http://www.shnenglu.com/kangnixi/archive/2010/04/08/111995.html烟皑烟皑Thu, 08 Apr 2010 11:53:00 GMThttp://www.shnenglu.com/kangnixi/archive/2010/04/08/111995.htmlhttp://www.shnenglu.com/kangnixi/comments/111995.htmlhttp://www.shnenglu.com/kangnixi/archive/2010/04/08/111995.html#Feedback0http://www.shnenglu.com/kangnixi/comments/commentRss/111995.htmlhttp://www.shnenglu.com/kangnixi/services/trackbacks/111995.html    ?#8220;游戏画面Ҏ制作——半透明效果”的随W的代码中做Z观的半透明效果Q可是在q行的画面中Q似乎可看到前景囑֛周还留着原来位图的矩形轮廓,感觉有点中不。不q没关系Q在本篇随笔中将介绍如何制作更完的透明半透明效果?br>    制作透明半透明效果q是要运用前面所讲的透明及半透明技巧,是先进行透明处理再进行半透明处理。除此之外,q记得是怎么做透明的吗Q是利用贴图函数直接与已l脓在窗口中背景图进行两个必要的Rasterq算完成的。可是,如果q样做的话,那结果的透明囑ַl在H口上生了Q又要怎么做半透明处理Q?br>    在这里多使用了一个内存DC与位囑֯象,先在内存DC上完成透明Q再取出q个DC伤的位图内容来进行半透明处理Q这样就可以辑ֈ目的了。下面直接以一个范例来Cq种做法。这个范例中需要下面的位图Q用来制作前景图的透明Q?br>


范例ch2_8Q这个范例说明介l如何生透明半透明的效果?br>下蝲地址Q?a >ch2_8Q上传到windows liveI间Q可能需要MSN账号登陆Q?br>说明Q程序源代码中有相关的注释?br>E序q行l果如下图:


PSQ如惌得更多关于Visual C++游戏开发的内容Q可点击随笔Q《Visual C++游戏~程基础》学习笔记——烦引随W?/a>?

烟皑 2010-04-08 19:53 发表评论
]]>
游戏画面Ҏ制作——半透明效果http://www.shnenglu.com/kangnixi/archive/2010/04/08/111992.html烟皑烟皑Thu, 08 Apr 2010 11:12:00 GMThttp://www.shnenglu.com/kangnixi/archive/2010/04/08/111992.htmlhttp://www.shnenglu.com/kangnixi/comments/111992.htmlhttp://www.shnenglu.com/kangnixi/archive/2010/04/08/111992.html#Feedback0http://www.shnenglu.com/kangnixi/comments/commentRss/111992.htmlhttp://www.shnenglu.com/kangnixi/services/trackbacks/111992.html    半透明在游戏中通常用来呈现若隐若现的特D效果。事实上q种效果的运用相当频J,比如薄雾、鬼或隐Şd{,有时会以半透明的手法来表现。本随W就来介l半透明效果的制作方法,下图23是一张位囄q半透明处理后显C在背景上的效果?br>
1、半透明的制作原?/strong>
   
     单地_半透明效果是前景图案与背景图案像素颜色的混合。从?3中观察半透明效果呈现的区域,可以看到背景图案Q也可看到前景的人物图案。什么是前景图案与背景图案像素颜色的混合呢?q就要从位图的基本结构开始谈起了?br>    一张位图是p多的像素所l成的,每一个像素中都包含红QRQ、绿QGQ、蓝QBQ三原色的色彩|p三种原色值来军_该像素的色彩。而要呈现半透明效果Q必d前景图与背景囑ֽ此对应像素的颜色依某一比例来进行调配,q个比例叫?#8220;不透明?#8221;?br>    以没有进行半透明处理Q单U地一张前景图贴到背景图上的一块区域来_前景囄不透明度是100%Q而背景图在这一块区域上的不透明度则?%Q完全透明Q所以看不见背景Q,也就是说在这块区域上Q背景图的色彩完全派不上用场?br>    可是如果惌有半透明的效果,让前景图看v来稍微透明一点,那就需要确定不透明度的倹{假讄定不透明度是70%Q也是说前景图像素颜色按照一定的不透明度比例进行合成,那么最后整个区域所呈现出来的就是所要的半透明效果了。综合上面的说明Q可以整理出一个徏档的公式如下Q?br>    半透明图色?= 前景图色?× 不透明?+ 背景图色?×Q? - 不透明度)

2、半透明的操作步?/strong>
   
    清楚了半透明制作的原理后Q接下来说明E序产生半透明效果的实际步骤?br>    步骤一Q取得位囄?br>    位图l构包含了一些位囄基本信息Q由于我们在制作半透明效果时会用到Q因此在从文件加载位囑֐Q必d取得该位囄l构Q而取的位囄构的函数如下Q?
int GetObject(   HGDIOBJ GDI对象,  //取得GDI对象l构
                           
int l构大小,
                            LPVOID l构变量,);
    上面q个函数用于取得GDI对象的信息,包含q里所谈的位图Q其中第3个参数是一个结构变量,如果是用于取得位囄信息Q则输入一个位囄构的地址Q而Windows API所定义的位囄构(BITMAPQ如下:
typedef struct tagBITMAP{
                                                                LONG bmType;  
// 位图cdQ必设?
                                                                
LONG bmWidth;  // 位图宽度
                                                               
LONG bmHeight; //位图长度
                                                                
LONG bmWidthBytes;  //每一列像素所占Byte?/span>
                                                               
WORD bmPlanes;  //颜色q面?/span>
                                                               
WORD bmBitsPixel; //像素的位?/span>
                                                                
LPVOID bmBits;  //位图内存指针
                                                            
}
BITMAP;
    后面会用到bmWidth、bmHeight、bmWidthBytes及bmBitsPixelq几个结构成员的信息?br>    在此举个例子来说明取得位囄构的ҎQ假讄在有一个位囑֐UCؓ“bitmap”Q位囄构变量名UCؓ“bm”Q则使用GetObject()函数取得BITMAPl构的程序代码如下:
GetObject(bitmap,sizeof(BITMAP),&bm);
    q样Q位囄构bm中的各个l构成员便包含了位图bitmap的基本信息?br>    步骤二:建立暂存数组
    取得位图的结构,接下来必d建立一个暂存数l准备存储位图中所有像素的颜色倹{这个暂存数l的大小是由前一个步骤中所取得位图的bmHeight与bmWidthBytes信息来决定的Q因此,必须利用指针来动态徏立。gl前一个例子,若要建立一个可存储bitmap所有像素颜色值的暂存数组Q程序代码如下:
unsigned char *px = new unsigned char [bm.bmHeight * bm.bmWidthBytes];
    q里Q因为unsigned char变量cd大小?ByteQ所以这个数l的每个元素大小也就?ByteQ?bitsQ。以一?4bits色彩的位图来_它的每个像素是以24bits来表C颜色的Q其中BQ蓝Q、GQ绿Q、RQ红Q三原色各占8个bits?br>    因此Q在下面的步骤中Q当取出位图的所有颜色ƈ存储在这个数l中Ӟ每一个像素会占用3个数l元素来存储B、G、R的颜色倹{?br>    步骤三:取得位图位置
    建立了暂存数l之后,要取Z囄所有颜色值存储到数组中就单多了,有一个现成的API函数可以使用?
LONG GetBitmapBits(  HBITMAP 位图,  // 取得位图位?/span>
                                        
LONG 要取得的Byte?
                                         LPVOID 存储的数l指?;
    使用此函数取得位图位值的E序代码如下?br>
GetBitmapBits(bitmap, bm.bmHeight * bm.bmWidthBytes, px);
    下面以图来说明像素颜色值存储在数组中的对应关系Q如下图所C:

    步骤四:合成像素颜色?br>    取得了位囄所有像素颜色g后,接下来的工作是按照不透明度来讑֮半透明区域内每个像素的颜色了?br>    此时应该会有两个像素颜色数组Q一个是前景囄Q一个则是背景图的。根据实际要昄半透明区域的坐标,这两个数组出对应的元素进行签名讲q的颜色合成q算Q再存回暂存数组中,anemia数组中所存储的便是已l完成半透明的颜色g。这个步骤的实际处理q程Q将在代码中做详l说明?br>    步骤五:重设位图颜色
    处理完暂存数l中半透明的颜色g后,最后一个操作就是根据数l的内容来重设位囄颜色。这个操作同样可以用一个API的函数来完成?
LONG SetBitmapBits(     HBITMAP 位图, //讑֮位图位?/span>
                                           
DWORD 颜色数组大小, 
                                           CONST VOID 数组指针 );
//Z么是CONST VOID?

    以上5个步骤都完成之后Q所要的半透明图也完成了Q剩下的只有脓图操作了?br>

范例ch2_7Q取得前景图与背景图的颜色|以前景图的不透明?0%和背景图的不透明?0%q行半透明处理Q制作半透明效果?br>下蝲地址Q?a >ch2_7Q上传到windows liveI间Q可能需要MSN账号登陆Q?br>说明Q程序源代码中有相关的注释?br>E序q行l果如下图:



PSQ如惌得更多关于Visual C++游戏开发的内容Q可点击随笔Q《Visual C++游戏~程基础》学习笔记——烦引随W?/a>?

烟皑 2010-04-08 19:12 发表评论
]]>
游戏画面Ҏ制作——透明效果http://www.shnenglu.com/kangnixi/archive/2010/04/08/111977.html烟皑烟皑Thu, 08 Apr 2010 08:52:00 GMThttp://www.shnenglu.com/kangnixi/archive/2010/04/08/111977.htmlhttp://www.shnenglu.com/kangnixi/comments/111977.htmlhttp://www.shnenglu.com/kangnixi/archive/2010/04/08/111977.html#Feedback2http://www.shnenglu.com/kangnixi/comments/commentRss/111977.htmlhttp://www.shnenglu.com/kangnixi/services/trackbacks/111977.html    ׃所有的图文仉是以一个四方矩形来存储的,但有时我们可能会需要把一张怪物囄贴到H口的背景图上,而在q种情况下如果我们直接进行脓图,其结果如下图所C:
    q似乎不是所要的l果。在本篇随笔中将要讨?/span>透明效果Q就是要利用BitBlt()贴图函数以及Raster值的q算来将囄中不必要的部分去掉(又称去背Q,使得图中的主体可以与背景囑֮全融合?br>    制作透明效果有多U方法,但基本上都是利用贴图时不同的Rasterq算Q通过转换而最后生相同的透明效果?br>    以下面的恐龙图ؓ例子Q首先必d备一张位图,它的色彩分配如下所C?br>

    图中左边的图是要去背q脓在背景图上的前景图,双的黑白图UCؓ“屏蔽?#8221;Q在透明的过E中会用到它。把要去背的位图与屏蔽图合ƈ成同一张图Q透明的时候再按照需要来q行裁切。可以把它分成两张图Q但q样E序必须q行两次图文件加载的操作?br>    有了屏蔽囑ְ可以利用贴图函数来生透明效果了,所需q行的脓图步骤如下:
    Q?Q将屏蔽图与背景囑ց“AND”QRaster的SRCANDQ运,贴到目的地DC中?br>    Q?Q将前景图与背景囑ց“OR”QRaster的SRCPAINTQ运,贴到目的地DC中?br>    Z么经q上面的两个步骤p产生透明的效果呢Q可以参看下图:

 

    接下来说明上qC个步骤所产生的图点色彩的变化?br>   
    1、屏蔽图与背景图?#8220;AND”q算
    Q?Q屏蔽图中的黑色部分与背景图?#8220;AND”q算
     
    Q?Q屏蔽图中的白色部分与背景图?#8220;AND”q算
      
    l过q一q算所产生的结果如?0所C:

    2、前景图与背景图?#8220;OR”q算
    Q?Q前景图中的彩色部分与图20?#8220;OR”q算
      
    Q?Q前景图中的黑色部分与图20?#8220;OR”q算
      
    l过q一q算后所昄的画面就是所需的透明图了Q图下图所C?br>
范例ch2_6Q透明效果的显C?br>下蝲地址Q?a >ch2_6Q上传到windows liveI间Q可能需要MSN账号登陆Q?br>说明Q程序源代码中有相关的注释?br>E序q行l果如下图:




PSQ如惌得更多关于Visual C++游戏开发的内容Q可点击随笔Q《Visual C++游戏~程基础》学习笔记——烦引随W?/a>?

烟皑 2010-04-08 16:52 发表评论
]]>
l制位图http://www.shnenglu.com/kangnixi/archive/2010/04/08/111965.html烟皑烟皑Thu, 08 Apr 2010 07:28:00 GMThttp://www.shnenglu.com/kangnixi/archive/2010/04/08/111965.htmlhttp://www.shnenglu.com/kangnixi/comments/111965.htmlhttp://www.shnenglu.com/kangnixi/archive/2010/04/08/111965.html#Feedback0http://www.shnenglu.com/kangnixi/comments/commentRss/111965.htmlhttp://www.shnenglu.com/kangnixi/services/trackbacks/111965.html
    l图是属?/span>GDI的对象之一Q在一套游戏开发过E中Q常帔R要运用大量的位图来构建游戏的所有画面?br>    以游戏程序来_׃使用的位图数量相当多Q因此都会先位囑֭成文Ӟ{到E序需要时再将文g加蝲到窗口中?br>    位图从文g中加载到l制H口中必ȝq以下几个步骤:
    ①从文g中加载位图(
BITMAPQ对象?br>    ②徏立一个与H口DC兼容的内?/span>DC?br>    ③内?/span>DC使用步骤1所建立的位囑֯象?br>    ④将内存DC的内容粘帖到H口DC中,完成昑փ的操作?/span>


    以上是大致的程Q接下来一步步地说明如何完成这些操?

步骤一Q加载位?/span>

    要从文g加蝲位图Q常使用LoadImage()函数

HANDLE LoadImage(   HINSTANCE 来源实体,   //加蝲位图
                                         
LPCTSTR 名称,
                                          UINT 位图cd,
                                         
int 加蝲宽度,
                                         
int 加蝲高度,
                                         UINT 加蝲方式,);

     详细说明如下Q?/span> 

参数

说明

HINSTANCE

包含位图所在的实体Q若要加载的位图存在于硬盘或者资源文件中Q则此参数设?span>”NULL”

LPCTSTR

要加载位图所在的路径与文件名或者资源名U?/span>

UINT

加蝲位图的类型,有下?span>3U:

◆IMAGE_BITMAPQ加载的位图Z般图文gQ扩展名?span>“.bmp”

◆IMAGE_CURSORQ加载的位图为光标图标,扩展名ؓ“.cur”

◆IMAGE_ICONQ加载的位图为图标,扩展名ؓ“.ico”

int

位图加蝲的宽度,单位为像?/span>

int

位图加蝲的高度,单位为像?/span>

UINT

讑֮位图的加载方式,若是从文件中加蝲位图Q则设ؓ“LR_LOADFROMFILE

步骤二:建立与窗?/span>DC兼容的内?/span>DC

     内存DCq不是真正的讑֤?/span>DCQ在q里把它揭示Z个缓冲区或许会更恰当些。内?/span>DC用来暂存加蝲的位图,׃最l会把存储在q个内存DC上的位图贴到真正的窗口的DC上,因此q个内存DC必须跟窗?/span>DC的性质兼容。可调用CreateCompatibleDC()函数来徏立内?/span>DC?/span>

HDC CreateCompatibleDC(HDC hdc); // 建立兼容DC

    函数中输入的唯一参数是要与内存DC兼容的目?/span>DC?/span>跟窗?/span>DC一P内存DC使用后也必须q行释放的操作,释放内存DC所调用的函CؓDeleteDC()?/span>

DeleteDC(HDC DC名称); //释放DC

步骤三:选用位图对象

    位图对象?/span>GDI?/span>6U对象之一Q内?/span>DC选用位图对象的方法和前面介绍的选用ȝ或画L方式相同Q都是通过调用SelectObject()函数来实现?/span>

步骤四:贴图

    把内?/span>DC中的位图复制到显C的DC上,q个操作被称?#8220;贴图”。函数是BitBlt()Q?/span>

BOOL BitBlt (   HDC 目的DC,
                          
int 目的DC X坐标,
                          
int 目的DC Y坐标,
                          
int 贴到目的DC的宽?
                          
int 贴到目的DC的高?
                           HDC 来源DC,
                          
int 来源DC X坐标,
                          
int 来源DC Y坐标,
                           DWORD 贴图方式)

    BitBlt()函数最后一个参数所输入的是UCؓ“Raster”的运|q个值是用来讑֮内存DC到目?/span>DC的脓图方式。范例中输入?/span>Raster值是SRCCOPYQ表C囑֐的位图与原来的位囑֮全一P下表列出了可使用?/span>Raster值及说明?/span>

Raster?/span>

说明

BLACKNESS

来源位图{换ؓ黑色

DSTINVERT

目的地DC?#8220;NOT”q算

MERGECOPY

选择的笔刷与来源位图?#8220;AND”q算

MERGEPAINT

先将来源位图?#8220;NOT”q算Q再与目的地DC?#8220;OR”q算

NOTSRCCOPY

来源位囑ց“NOT”q算

NOTSRCERASE

先将来源位图与目的地DC?#8220;OR”q算Q再其?#8220;NOT”q算

PATCOPY

选择的笔刯到目的地DC?/span>

PATINVERT

目的地DC与选择的笔刷做“XOR”q算

PATPAINT

先将来源位图?#8220;NOT”q算Q再与笔刷做“OR”q算Q最后再与目的地DC?#8220;OR”q算

SRCAND

来源位图与目的?/span>DC?#8220;AND”q算

SRCCOPY

来源位图脓到目的地DC?/span>

SRCERASE

先将目的?/span>DC?#8220;NOT”q算Q再与来源位囑ց“AND”q算

SRCINVERT

来源位图与目的?/span>DC?#8220;XOR”q算

SRCPAINT

来源位图与目的?/span>DC?#8220;OR”q算

WHITENESS

来源位图{换ؓ白色

范例ch2_5Q从文g中加载位图,q显C在H口上?br>下蝲地址Q?a >ch2_5Q上传到windows liveI间Q可能需要MSN账号登陆Q?br>说明Q程序源代码中有相关的注释?br>E序q行l果如下图:



PSQ如惌得更多关于Visual C++游戏开发的内容Q可点击随笔Q《Visual C++游戏~程基础》学习笔记——烦引随W?/a>?/p>

烟皑 2010-04-08 15:28 发表评论
]]>
GDIl图函数http://www.shnenglu.com/kangnixi/archive/2010/04/08/111959.html烟皑烟皑Thu, 08 Apr 2010 06:37:00 GMThttp://www.shnenglu.com/kangnixi/archive/2010/04/08/111959.htmlhttp://www.shnenglu.com/kangnixi/comments/111959.htmlhttp://www.shnenglu.com/kangnixi/archive/2010/04/08/111959.html#Feedback2http://www.shnenglu.com/kangnixi/comments/commentRss/111959.htmlhttp://www.shnenglu.com/kangnixi/services/trackbacks/111959.html
1、文字输?/strong>
     H口画面上的文字输出比后面所要介l的几个l图函数q要重要Q因为在E序设计Ӟ可能有时需要在画面上显CZ些数据和信息Q以利于E序本n的追t与排错?br>
范例ch2_2Q根据鼠标的UdQ将光标所在位|的坐标值显C在H口中?br>下蝲Q?a >ch2_2Q上传到windows liveI间Q可能需要MSN账号登陆Q?br>说明Q程序源代码中有相关的注释?br>q行l果如下图:


2、多边Ş函数
    下表中给ZGDI函数中关于多边Ş的绘囑և敎ͼ 

函数名称

说明

Polygon

l制闭多边?/span>

PolyLine

l制多边U条

PolylineTo

以当前画W所在位|绘制多边线?/span>

PolyPolygon

l制多个闭多边?/span>

PolyPolyline

l制多个多边U条

    以上几个函数的用方法大同小异,以Polygon()函数来做说明?br>
BOOL Polygon(HDC hdc, CONST POINT Ҏl指? int 多边形点?;  //l制多边?/span>
    W?个参数输入的是一个POINTl构的数l指针,POINT可用于描qC个坐标点Q其l构如下Q?br>
typedef struct tagPOINT{
                                                        LONG x; 
// X坐标
                                                        LONG y; // Y坐标
                                                      }
 POINT;

范例ch2_3Q展C多边Şl制函数的用法,q在H口中绘制多边Ş?br>下蝲Q?a >ch2_3Q上传到windows liveI间Q可能需要MSN账号登陆Q?br>说明Q程序源代码中有相关的注释?br>q行l果如下图:


3、封闭图形函?br>    下边再来讨论一下封闭几何图形的l制ҎQ?#8220;ȝ与画?/font>”随笔中介l了ȝ形的Rectangle()函数Q现在再来看看画椭圆形的GDI函数?br>
BOOL Ellipse( HDC hdc,   //l制椭圆?/span>
                                    int 外围矩Ş左上点X坐标,
                                   
int 外围矩Ş左上点Y坐标,
                                   
int 外围矩Ş右下点X坐标,
                                   
int 外围矩Ş右下点Y坐标);
     上面的函数说明确定一个外围矩形就可以产生椭圆形?br>      
     下面再来看看l制圆角矩Ş的函数?br>
BOOL RoundRect( HDC hdc,    //l制圆角矩Ş 
                                             int 外围矩Ş左上点X坐标,
                                             
int 外围矩Ş左上点Y坐标,
                                            
int 外围矩Ş右下点X坐标,
                                            
int 外围矩Ş右下点Y坐标

                                            
int 圆角上椭圆长,
                                            
int 圆角上椭圆高)
;
    在这个函CQ除了给定外围矩形的坐标外,q给定了圆角上椭圆的长与高,用来表示圆角的弧度?br>
    最后来说明l制扇ŞQPieQ与弓ŞQChordQ函敎ͼ扇Ş与弓形都是椭圆的一部分?br>    扇Ş与弓形都有连接的L与终点,不同之处在于Q扇形还会与椭圆的中心点相连接,而弓形则直接q接L与终炏V绘制扇形的函数为Pie()Q绘制弓形的函数则ؓChord()Q两者输入的参数意义都相同,下面以Pie()函数Z来进行说明?br>
BOOL Pie (  HDC hdc,   //l制扇Ş
                     
int 外围矩Ş左上点X坐标,
                     
int 外围矩Ş左上点Y坐标,
                     
int 外围矩Ş右下点X坐标,
                     
int 外围矩Ş右下点Y坐标,
                      
int LX坐标,
                     
int LY坐标,
                     
int l点X坐标,
                     
int l点Y坐标);

范例ch2_4Q显C封闭图形绘制函数的用法Qƈ在窗口中l制不同囑Ş?br>下蝲Q?a >ch2_4Q上传到windows liveI间Q可能需要MSN账号登陆Q?br>说明Q程序源代码中有相关的注释?br>q行l果如下图:
 

PSQ如惌得更多关于Visual C++游戏开发的内容Q可点击随笔Q《Visual C++游戏~程基础》学习笔记——烦引随W?/a>?

烟皑 2010-04-08 14:37 发表评论
]]>
ȝ与画?/title><link>http://www.shnenglu.com/kangnixi/archive/2010/04/08/111951.html</link><dc:creator>烟皑</dc:creator><author>烟皑</author><pubDate>Thu, 08 Apr 2010 04:59:00 GMT</pubDate><guid>http://www.shnenglu.com/kangnixi/archive/2010/04/08/111951.html</guid><wfw:comment>http://www.shnenglu.com/kangnixi/comments/111951.html</wfw:comment><comments>http://www.shnenglu.com/kangnixi/archive/2010/04/08/111951.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/kangnixi/comments/commentRss/111951.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/kangnixi/services/trackbacks/111951.html</trackback:ping><description><![CDATA[<p><span>      ȝ和画刷都?/span><span>GDI</span><span>所定义的图形对象,ȝ是线条的样式Q画刷则是封闭图形内部填充的样式。可以自定义l图所用画W及d的样式,pȝ预设ȝ的样式ؓ</span><span>BLACK_PEN</span><span>Q画L样式?/span><span>NULL_BRUSH</span><span>?/span></p> <p><span>      要自定义ȝ或画P可以使用下列</span><span>3</span><span>?/span><span>API</span><span>函数?/span><span></p> <div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">HPEN CreatePen(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> 样式, </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> 宽度, COLORREF 颜色); </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">建立ȝ</span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">HBRUSH CreateHatchBrush(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> 样式, COLORREF颜色);   </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">建立阴媄d</span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">HBRUSH CreateSolidBrush(COLORREF 颜色);   </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">建立单色d</span></div> <p></span><span>      从上面的</span><span>3</span><span>?/span><span>API</span><span>函数可以看出Q其q回值都是以英文字母“</span><span>H</span><span>”开_“</span><span>H</span><span>”在这里代表的是前面所提过?#8220;</span><span>handle</span><span>”Q句柄)?/span></p> <p><span>      建立新画W与d之后Q必d所要进行绘囄</span><span>DC</span><span>中选用它们Q才会生预期的ȝ及画h果,选用的函数如下:</span><span></p> <div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">HGDIOBJ SelectObject(HDC hdc, HGDIBJ GDI对象); </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">选用GDI对象</span></div> <p></span><span>      q个</span><span>SelectObject()</span><span>函数所输入的第二个参数是</span><span>GDI</span><span>对象?/span><span>handle</span><span>Q而返回值则是前一ơ所使用?/span><span>GDI</span><span>对象。除了这一节所介绍的画W,d是属?/span><span>GDI</span><span>对象外,其他?/span><span>GDI</span><span>对象q有Q位图、字体、区域及调色ѝ?/span></p> <p><span>      GDI</span><span>对象一l徏立便会占用部分内存,一旦不使用的时候,务必它们删除,删除函数如下Q?/p> <div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">BOOL DeleteObject(HGDIOBJ GDI对象);   </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">删除GDI对象</span></div> <p></span><span>      若删除对象成功,则会q回布尔?#8220;</span><span>TRUE</span><span>”Q若p|则返?#8220;</span><span>FALSE</span><span>”?/span></p> <br>范例ch2_1Q徏?U系l所提供的画W即d样式Q将l果l制于窗口中<br>下蝲地址Q?a >ch2_1</a>Q上传到windows liveI间Q可能需要MSN账号登陆Q?br>说明Q程序源代码中有相关的注释?br><br>最后运行结果图Q?br><img border=0 src="http://www.shnenglu.com/images/cppblog_com/kangnixi/游戏~程W?章图?6.jpg"> <br><br>PSQ如惌得更多关于Visual C++游戏开发的内容Q可点击随笔<a href="http://www.shnenglu.com/kangnixi/archive/2010/04/08/111931.html">Q《Visual C++游戏~程基础》学习笔记——烦引随W?/a>? <img src ="http://www.shnenglu.com/kangnixi/aggbug/111951.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/kangnixi/" target="_blank">烟皑</a> 2010-04-08 12:59 <a href="http://www.shnenglu.com/kangnixi/archive/2010/04/08/111951.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>坐标与DChttp://www.shnenglu.com/kangnixi/archive/2010/04/08/111938.html烟皑烟皑Thu, 08 Apr 2010 03:53:00 GMThttp://www.shnenglu.com/kangnixi/archive/2010/04/08/111938.htmlhttp://www.shnenglu.com/kangnixi/comments/111938.htmlhttp://www.shnenglu.com/kangnixi/archive/2010/04/08/111938.html#Feedback0http://www.shnenglu.com/kangnixi/comments/commentRss/111938.htmlhttp://www.shnenglu.com/kangnixi/services/trackbacks/111938.html        GDIQ?/span>Graphics Device InterfaceQ中文可译ؓ“囑Ş讑֤接口”Q是Windows API中相当重要的一个成员,它掌了所有显像设备的囑փ昄及输出功能。缺了它,Windowspȝ不会像现在所使用的图形操作环境,而游戏程序既然运行了大量的媄像图形处理,自然不?/span>GDI

1、屏q区、窗口区与内部窗口区
      对于一个游戏程序来_不论采用全屏q的模式q是单纯的窗口模式,都必d立一个窗口?span>当窗口徏立后Q显C的屏幕上便划分?/span>3个区域,卛_q区Q?/span>ScreenQ、窗口区Q?/span>WindowQ与内部H口区(ClientQ?如下图所C:


      屏幕区的区域大小视用者计机所讑֮的显C分辨率而定Q一般在E序中都是以像素Q?/span>pixelQ当做坐标及长度单位?/span>800×600卛_q区矩Ş的大即?/span>800×600像素?/span>

2、Device Context

      Device ContextQ设备内容)一般简UCؓDCQ就l图的观Ҏ_DC是E序可以q行l图的地斏VD例来_如果要在整个屏幕Zl图Q那?span>Device(讑֤)是屏幕,?span>DC是屏幕Z的绘囑ֱ。相同的道理Q如果要在窗口中l图Q那?span>Device是H口Q?span>DC是H口上可以绘囄地方Q也是内部H口区?/span>

case WM_PAINT;
hdc 
= BeginPaint(hWnd, &ps);
EndPaint(hWnd, 
&ps);
break;

      其中Q调?/span>BeginPaint()函数开始进行窗口重l的动作Q而调?/span>EndPaint()函数则是l束所有绘囑֊作。程序代码中调用BeginPaint()时会q回一?/span>DC对象hdcQ此对象所代表的是H口Q?/span>hWndQ?/span>DCQ也是内部H口区。当H口重绘消息发生Ӟ可以在第二行和第三行E序代码之间加入要在内部H口上进行绘囄动作?/span>

      此外Q在处理WM_PAINT消息之外的地方,若要取得H口?/span>DCQ必调用下面的q个函数Q?/p>

HDC GetDC(HWND hWnd); //取得DC

      其中Q所输入的参数是H口?#8220;handle”?/span>handle?/span>Windowspȝ中用来识别各U不同资源的一个句柄,而且每一资源的handle都是唯一的。根?/span>handleQ?/span>Windows可以快速且正确地找到所要用的资源。注意,若?/span>GetDC()函数取得H口DC后,当不使用时必d它释放,否则其他应用E序无法用?/span>

int ReleaseDC(HWND hWnd, HDC释放DC名称); //释放DC

      若上面这个函数运行成功,则会q回整数“1”Q若p|则返?#8220;0”?/span>

3、坐标系l?/strong>

      坐标问题。以屏幕区的左上角的坐标点ؓ原点Q屏q上的Q何一个位|都可以某一点坐标来表示Q称为屏q坐标。若l图的区域是内部H口区,那么坐标原点所在的位置׃通了Q变成了内部H口最左上角的炏V?/span>


4、坐标{?/strong>

      对于坐标的{换,GDI中提供了相关的函数?br>

PSQ如惌得更多关于Visual C++游戏开发的内容Q可点击随笔Q《Visual C++游戏~程基础》学习笔记——烦引随W?/a>?/span>



烟皑 2010-04-08 11:53 发表评论
]]>
《Visuanl C++游戏~程基础》学习笔记——烦引随W?http://www.shnenglu.com/kangnixi/archive/2010/04/08/111931.html烟皑烟皑Thu, 08 Apr 2010 03:05:00 GMThttp://www.shnenglu.com/kangnixi/archive/2010/04/08/111931.htmlhttp://www.shnenglu.com/kangnixi/comments/111931.htmlhttp://www.shnenglu.com/kangnixi/archive/2010/04/08/111931.html#Feedback0http://www.shnenglu.com/kangnixi/comments/commentRss/111931.htmlhttp://www.shnenglu.com/kangnixi/services/trackbacks/111931.html书名Q《Visual C++游戏~程基础》,电子工业出版C?/p>
W??Windows APIE序快速入?/strong>

W??游戏画面l图
           2.1 基本屏幕l图
                2.1.1 坐标与DC
                2.1.2 ȝ与画?/a>
                2.1.3 
GDIl图函数
                2.1.4 l制位图
           2.2 游戏画面Ҏ制作
                2.2.1 透明效果
                2.2.2 半透明效果
                2.2.3 透明半透明效果
           2.3 游戏地图制作
                2.3.1 q面地图贴图
                2.3.2 斜角地图贴图
                2.3.3 景物贴图

W??游戏动画技?/strong>
           3.1 基础动画昄
                3.1.1 定时器的使用
                3.1.2 游戏循环
                3.1.3 透明动画
           3.2 动画昄问题
                3.2.1 贴图坐标修正Q未完成Q?br>                3.2.2 排序贴图Q阐q未完成Q代码完成)
           3.3 背景动画设计
                3.3.1 单一背景滚动
                3.3.2 循环背景动画Q阐q未完成Q代码完成)
                3.3.3 多背景@环动?br>
W??游戏输入消息处理
           4.1 键盘输入消息
                4.1.1 关于Windows中的键盘
                4.1.2 键盘消息处理
           4.2 鼠标输入消息
           4.3 鼠标相关函数
                4.3.1 获取H口外鼠标消?br>                4.3.2 讑֮鼠标光标位置
                4.3.3 昄与隐藏鼠标光?br>                4.3.4 限制鼠标光标Ud区域

W??游戏人工
           5.1 Ud型游戏AI
                5.1.1 q逐移?br>                5.1.2 w避Ud
                5.1.3 模式Ud
          5 .2 行ؓ型游戏AI
                5.2.1 计算色的思考与行ؓ
                5.2.2 搜烦q宫出口
           5.3 {略型游戏AI

W??游戏物理现象设计原理
           6.1 物理q动
                6.1.1 匀速运?br>                6.1.2 加速度q动
                6.1.3 重力
                6.1.4 摩擦?br>           6.2 物体间的撞
                6.2.1 以范围检碰?br>                6.2.2 以颜色检碰?br>                6.2.3 以行q\U检碰?br>                6.2.4 与斜面碰撞后的速度
           6.3 _子的应?br>                6.3.1 _子的定?br>                6.3.2 雪花U飞
                6.3.3 攄?br>
W??q入3D世界
           7.1 初探DirectX
                7.1.1 DirectX SDK?br>                7.1.2 DirectX的特?br>           7.2 使用Direct Graphics
                7.2.1 介绍Direct Graphics讑֤
                7.2.2 如何建立Direct Graphics讑֤
                7.2.3 使用Direct Graphics取得l图讑֤QGDIQ?br>           7.3 使用Direct Graphicsq行2D影像处理
                7.3.1 Direct Graphicsl图引擎
                7.3.2 如何贴媄像文?br>           7.4 Direct Graphics的颜色操?/span>
                7.4.1 Direct Graphics颜色操作程
                7.4.2 淯操作
                7.4.3 材质基台操作
                
W??Direct Graphics 3D的奇qM?br>           8.1 qh?D力 
                8.1.1 三维I间概念 
                8.1.2 模型与顶?nbsp;
                8.1.3 3D世界的环境描q?br>                8.1.4 点颜色的计方?br>                8.1.5 加蝲一个X文g的模?br>           8.2 3DI间坐标的{?/span>
                8.2.1 Direct Graphics坐标转换线
                8.2.2 世界环境描述
                8.2.3 视觉环境描述
                8.2.4 投射环境描述
           8.3 Direct Graphics的色彩计?/span>
                8.3.1 颜色的决定因?br>                8.3.2 发射光的讑֮方式
                8.3.3 表面材质的设定方?br>
W??DirectSound的用方?/strong>
           9.1 开始徏立DirectSound的第一?/span>
                9.1.1 建立DirectSound的第一?br>                9.1.2 DirectSound对象的徏?br>                9.1.3 讑֮E序协调层
                9.1.4 ~冲区的基本概念
                9.1.5 建立ȝ冲区
                9.1.6 WAVE声音文g的加?br>                9.1.7 建立ơ缓冲区
                9.1.8 加蝲声音道次~冲?br>           9.2 声音的播放与控制
                9.2.1 播放声音功能
                9.2.2 制作混音功能
                9.2.3 控制声音功能
           9.3 3Dx的实际演l?/span>
                9.3.1 认识3Dx
                9.3.2 建立們֐者功?br>                9.3.3 建立发声?br>
W?0?DirectInput的用方?br>           10.1 建立DirectInputE序
                10.1.1 开始徏立DirectInputE序
                10.1.2 建立DirectInput对象
                10.1.3 建立输入装置对象
                10.1.4 资料格式的设?br>                10.1.5 讑֮E序协调层
                10.1.6 输入装置的调用方?br>           10.2 键盘与鼠标输入的取得Ҏ
                10.2.1 键盘输入的取?br>                10.2.2 取得鼠标输入
           10.3 使用摇杆功能
                10.3.1 取得摇杆装置
                10.3.2 摇杆lg的列举方?br>                10.3.3 摇杆输入的取?br>                10.3.4 讑֮无效范围

W?1?威力强大的DirectPlay和DirectShow
           11.1 DirectPlay初体?br>                11.1.1 DirectPlay的用时?br>                11.1.2 DirectPlay的网l拓?br>                11.1.3 |络联机游戏的构?br>                11.1.4 DirectPlay的组成模?br>                11.1.5 联机E序范例介绍
           11.2 DirectShow的多媒体功能
                11.2.1 DirectShow的架?br>                11.2.2 播放q功能
                11.2.3 播放MP3

W?2?游戏设计实?/strong>
           12.1 俄罗斯方块游戏轻村ց
           12.2 抢娃娃游?/span>

附录A DirectDraw制作游戏U籍大公开
           A.1 E序中的各个自定义函?/span>
                A.1.1 初始化与建立DirectDraw对象
                A.1.2 建立DirectDrawq后暂存?br>                A.1.3 建立DirectSoundơ缓冲区
                A.1.4 讑֮颜色键函?br>           A.2 l丽的电急即?/span>
                A.2.1 游戏功能介绍
                A.2.2 游戏功能设计Ҏ
                A.2.3 E序内容说明 
           A.3 太空击游戏
                A.3.1 游戏功能介绍
                A.3.2 滚动背景的设?br>                A.3.3 怪物的生于Ud
                A.3.4 子弹的?br>                A.3.5 碰撞的Ҏ
                A.3.6 E序~写的方?br>
附录B 专业词汇

附录C 常用Windows虚拟键表


烟皑 2010-04-08 11:05 发表评论
]]>
W??Windows APIE序快速入?/title><link>http://www.shnenglu.com/kangnixi/archive/2010/04/08/111930.html</link><dc:creator>烟皑</dc:creator><author>烟皑</author><pubDate>Thu, 08 Apr 2010 03:02:00 GMT</pubDate><guid>http://www.shnenglu.com/kangnixi/archive/2010/04/08/111930.html</guid><wfw:comment>http://www.shnenglu.com/kangnixi/comments/111930.html</wfw:comment><comments>http://www.shnenglu.com/kangnixi/archive/2010/04/08/111930.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/kangnixi/comments/commentRss/111930.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/kangnixi/services/trackbacks/111930.html</trackback:ping><description><![CDATA[<p style="TEXT-INDENT: -18pt; MARGIN: 0cm 0cm 0pt 18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" class=MsoNormal><span style="mso-fareast-font-family: 'Times New Roman'" lang=EN-US><span style="mso-list: Ignore"><br><span style="COLOR: red">1?/span><span style="FONT: 7pt 'Times New Roman'">  </span></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">目前一般的大型商业游戏软g开发模式,大多采用</span><span lang=EN-US>Visual C++</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">E序开发工具与</span><span lang=EN-US>Windows API</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q?/span><span lang=EN-US>Application Program Interface</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q程序架构来~写以提高游戏程序运行时的效率?/span></p> <p style="TEXT-INDENT: -18pt; MARGIN: 0cm 0cm 0pt 18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" class=MsoNormal><span style="mso-fareast-font-family: 'Times New Roman'" lang=EN-US><span style="mso-list: Ignore"><br><span style="COLOR: red">2?/span><span style="FONT: 7pt 'Times New Roman'">  </span></span></span><span lang=EN-US>C++</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是拥有着优良传统的程序语aQ?/span><span lang=EN-US>VC++</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">则是微Y公司开发出的一套适用?/span><span lang=EN-US>C/C++</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语法的程序开发工兗在</span><span lang=EN-US>VC++</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">开发环境中Q编?/span><span lang=EN-US>Windows</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">操作pȝq_的窗口程序有两种不同的程序架构:一U是微Y?/span><span lang=EN-US>VC++</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中所加入?/span><span lang=EN-US>MFC</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q?/span><span lang=EN-US>Microsoft Foundation Class library</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q架构,</span><span lang=EN-US>MFC</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是一个庞大的cd函数库,其中提供了完整开发窗口程序所需的对象类型与函数Q常用于设计一般的应用软gE序Q另一U是本书所介绍?/span><span lang=EN-US>Windows API</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">架构Q?/span><span lang=EN-US>Windows API</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来开发上q的应用软gE序q不ҎQ但用在设计游戏E序上却相当单且h较优的q行性能?/span></p> <p style="TEXT-INDENT: -18pt; MARGIN: 0cm 0cm 0pt 18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" class=MsoNormal><span style="mso-fareast-font-family: 'Times New Roman'" lang=EN-US><br><span style="COLOR: red">3?/span>  </span><span lang=EN-US>VC++</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在游戏程序开发上所具备的优?/span></p> <p style="MARGIN: 0cm 0cm 0pt 18pt" class=MsoNormal>      <br>      <span style="COLOR: #008080">3.1优越的速度表现</span></p> <p style="MARGIN: 0cm 0cm 0pt 18pt" class=MsoNormal><span lang=EN-US>      C++</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">E序~译后的文g是可直接q行的机器码Q而其他程序语aQ如</span><span lang=EN-US>VB</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/span><span lang=EN-US>Java</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q编译后产生的是一U所谓的“中间?#8221;。运行中间码Ӟpȝ内必d在解释该E序语言?#8220;解释器(</span><span lang=EN-US>Interpreter</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q?#8221;Q用做同步翻译工作。解释器解释中间码时Q本w会加蝲到内存中占用部分内存Q且同步译中间码的q程也会费旉Q因此,q行q类E序时要比可直接q行的机器码~慢很多?/span></p> <p style="MARGIN: 0cm 0cm 0pt 18pt" class=MsoNormal><br>      <span style="COLOR: #008080">3.2Ҏ管理资源与内存</span></p> <p style="MARGIN: 0cm 0cm 0pt 18pt" class=MsoNormal><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">   ?/span><span lang=EN-US>VC++</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的开发环境中Q程序资源及内存理斚w都具有相当的Ҏ?/span></p> <p style="MARGIN: 0cm 0cm 0pt 18pt" class=MsoNormal><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">   在资源管理部分,通常是通过一个句柄来使用该项资源。这里所指的资源Q可能是H口、设备、图像和声音{对象?/span></p> <p style="MARGIN: 0cm 0cm 0pt 18pt" class=MsoNormal><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">   在内存管理部分,</span><span lang=EN-US>C/C++</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语言本n具备内存管理的功能Q除了可通过指针q行内存的存取和配置之外Q还提供了完整的内存理相关函数?/span></p> <p style="MARGIN: 0cm 0cm 0pt 18pt" class=MsoNormal><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">   ׃游戏E序使用了大量的多媒体数据,q行时会占用不少内存Q因此,若程序设计师能够Ҏ有效地来管理资源和内存Q将可大大降低硬件要求ƈ提高游戏E序本n的性能?/span></p> <p style="MARGIN: 0cm 0cm 0pt 18pt" class=MsoNormal><br>      <span style="COLOR: #008080">3.3易于使用Windows API</span></p> <p style="MARGIN: 0cm 0cm 0pt 18pt" class=MsoNormal><span lang=EN-US>      Windows API</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/span><span lang=EN-US>Windows</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">操作pȝ提供的动态链接函数库Q通常?#8220;</span><span lang=EN-US>.DLL</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">”的文件格式存在于</span><span lang=EN-US>Windows</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">pȝ中)Q?/span><span lang=EN-US>Windows API</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中包含了</span><span lang=EN-US>Windows</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的内核及所有应用程序所需要的功能?/span></p> <p style="MARGIN: 0cm 0cm 0pt 18pt" class=MsoNormal><span lang=EN-US>      Windows</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">操作pȝ发展至今Q?/span><span lang=EN-US>Windows API</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">主要可分?/span><span lang=EN-US>Win16</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q?/span><span lang=EN-US>Windows 3.1</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">以前Q以?/span><span lang=EN-US>Win32</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q?/span><span lang=EN-US>Windows 95</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">以后Q两U版本,不同版本</span><span lang=EN-US>Windows</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">pȝ?/span><span lang=EN-US>API</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的内Ҏ多或有些差异但都以向下兼容为原则?/span></p> <p style="MARGIN: 0cm 0cm 0pt 18pt" class=MsoNormal><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">   一般在</span><span lang=EN-US>VB</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">E序中,要调?/span><span lang=EN-US>Windows API</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的函敎ͼ必须先完成声明的操作。但?/span><span lang=EN-US>VC++</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">开发环境下Q不论采?/span><span lang=EN-US>MFC</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">q是</span><span lang=EN-US>Windows API</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的程序架构,只要在项目中讑֮好所要链接的函数库ƈ引用正确的头文gQ那么在E序中?/span><span lang=EN-US>Windows API</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的函数就跟?/span><span lang=EN-US>C/C++</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">标准函数库一样容易?/span></p> <p style="MARGIN: 0cm 0cm 0pt 18pt" class=MsoNormal><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">   Q动态链接(</span><span lang=EN-US>Dynamic Linking</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q是指在E序q行阶段Q真正调用外部函数时才进行链接(注:程序代码中调用函数的指针指向外部函数所在的地址Q的操作Q?br><br></span></p> <span style="mso-fareast-font-family: 'Times New Roman'" lang=EN-US><span style="mso-list: Ignore"> <p style="TEXT-INDENT: -18pt; MARGIN: 0cm 0cm 0pt 18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" class=MsoNormal><span style="mso-fareast-font-family: 'Times New Roman'" lang=EN-US><br><span style="COLOR: red">4?/span>  </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><a href="http://www.shnenglu.com/kangnixi/archive/2010/04/08/111927.html"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">构徏游戏设计的舞?/span></a>(单击光接可q入相应的随W?</span></p> <p><span><span>   <span style="COLOR: red">  5?/span> </span></span><span><a href="http://www.shnenglu.com/kangnixi/archive/2010/04/08/111929.html"><span>E序架构说明</span></a><font face=宋体>(单击光接可q入相应的随W?<br><br><br><br><font face="Times New Roman">PSQ如惌得更多关于Visual C++游戏开发的内容Q可点击随笔</font><a href="http://www.shnenglu.com/kangnixi/archive/2010/04/08/111931.html"><font face="Times New Roman">Q《Visual C++游戏~程基础》学习笔记——烦引随W?/font></a></font><font face="Times New Roman">?/font></span></span></span></p> <img src ="http://www.shnenglu.com/kangnixi/aggbug/111930.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/kangnixi/" target="_blank">烟皑</a> 2010-04-08 11:02 <a href="http://www.shnenglu.com/kangnixi/archive/2010/04/08/111930.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>E序架构说明http://www.shnenglu.com/kangnixi/archive/2010/04/08/111929.html烟皑烟皑Thu, 08 Apr 2010 03:00:00 GMThttp://www.shnenglu.com/kangnixi/archive/2010/04/08/111929.htmlhttp://www.shnenglu.com/kangnixi/comments/111929.htmlhttp://www.shnenglu.com/kangnixi/archive/2010/04/08/111929.html#Feedback0http://www.shnenglu.com/kangnixi/comments/commentRss/111929.htmlhttp://www.shnenglu.com/kangnixi/services/trackbacks/111929.html 

函数名称

说明

WinMain

ȝ序,E序起始?/p>

WndProc

自定义函敎ͼ处理E序消息

MyRegisterClass

自定义函敎ͼ注册H口cd

InitInstance

自定义函敎ͼ建立及显C窗口的初始化函?/p>


下面来说说这些函数的内容与功能?br>
1.WinMain函数
        ȝ序,也就是整个项目程序开始运行的地方Q如同ConsoleE序中的main()函数?/p>

//****ȝ?**********************************
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR     lpCmdLine,
int       nCmdShow)
{
MSG msg;
/**********************************************************
*              自定义函敎ͼ注册H口cd
* 调用MyRegisterClass()函数Q向pȝ注册H口cdQ输入参?br>* “hInstance”是目前程序运行个体的对象代码
*********************************************************
*/

MyRegisterClass(hInstance);
// q行初始化函敎ͼ调用InitInstance()函数Q进行初始化操作
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}

/******************************************************************
*                           消息循环
* E序通过此消息@环来获取消息Qƈq行必要的键盘消息{换,
* 而后控制权交给操作pȝQ由操作pȝ军_该由哪个E序?br>* 消息处理函数处理消息。这个@环用了3个API函数
* GetMessage 获取E序消息
* TranslateMessage 转换伪码及字W?br>* DispatchMessage 控制权交给pȝQ再ql决定负责处理消息的E序
*****************************************************************
*/

while (GetMessage(&msg, NULL, 00))
{
TranslateMessage(
&msg);
DispatchMessage(
&msg);
}

return msg.wParam;
}

2.MyRegisterClass函数    
/*****************************************************************
 * 在徏立程序窗口的实体之前Q必d定义一个窗口类别,其中包含所?br> * 建立H口的相关信息,q向pȝ注册。这里的MyRegisterClass()函数
 * 是q行定义及注册窗口类别的函数
 ****************************************************************
*/

ATOM MyRegisterClass(HINSTANCE hInstance)
{
    
//声明一个窗口类?#8220;WNDCLASSEX”和结?#8220;wcex”
    WNDCLASSEX wcex;

    
/***************************Begin***********************************/
    
// 定义“wcex”l构的各信息,其中讑֮消息处理函数QIpfnWndProcQؓ
    
// “WndProc”Q类别名UͼlpszClassNameQؓ“canvas”?/span>
    wcex.cbSize = sizeof(WNDCLASSEX); 
    wcex.style            
= CS_HREDRAW | CS_VREDRAW;
    
    
// 讑֮消息处理函数
    wcex.lpfnWndProc    = (WNDPROC)WndProc;
    
    wcex.cbClsExtra        
= 0;
    wcex.cbWndExtra        
= 0;
    wcex.hInstance        
= hInstance;
    wcex.hIcon            
= NULL;
    wcex.hCursor        
= NULL;
    wcex.hCursor        
= LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground    
= (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName    
= NULL;

    
//cd名称
    wcex.lpszClassName    = "canvas";
    
    wcex.hIconSm        
= NULL;
    
/****************************End************************************/

    
// 调用RegisterClassEx()函数注册cdQ返回一?#8220;ATOM”形态的字符Ԍ此字W串即ؓcd名称“canvas”
    return RegisterClassEx(&wcex);
}

3.InitInstance函数 
// 在这一初始函数中,按照前面所定义的窗口类别来建立q显C实际的E序H口
//*****初始化函?******************************
// 1.存储instance handle于全局变量?br>// 2.建立q显CZH口
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
    HWND hWnd;

    hInst 
= hInstance;
    
// 调用CreateWindow()函数来徏立一个窗口对象,所输入的第1个参?br>    // 是H口建立所依据的类别名Uͼ也就是前面程序所定义?#8220;canvas”
    hWnd = CreateWindow("canvas""l图H口" , WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, 
0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

    
if (!hWnd)
    
{
        
return FALSE;
    }


    
// 下面三条语句Q设定窗口的昄位置及窗口大,然后l制在显C备上
    
// 讑֮H口昄的位|及H口大小
    MoveWindow(hWnd,10,10,600,450,true);
    
// 讑֮H口昄时的状?/span>
    ShowWindow(hWnd, nCmdShow);
    
// 窗口绘制于昄讑֤?/span>
    UpdateWindow(hWnd);

    
return TRUE;
}

4.WndPro函数 
/********************************************************************************
 * 在前面定义类别的时候把WndPro定义为消息处理函敎ͼ也就是当某些外部消息发生Ӟ?br> * 按照消息的类型来军_该如何进行处理?br> * 此外QWndPro函数也是一个所谓的“回调函数QCALLBACKQ?#8221;Q简单地_回调函数是属?br> * Windows操作pȝ所调用的函敎ͼ而非E序本n所调用的函敎ͼq是因ؓWindows是一个多?br> * 务的作业环境Q在同一时刻可能会有多个E序正在q行Q而当某一事g发生Ӟ有可能每一
 * 个程序都会接受到此消息,因此pȝ必须d断该由哪个程序进行处理,然后再调用该E序
 * 的消息处理函数?br> *******************************************************************************
*/

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    PAINTSTRUCT ps;
    HDC hdc;

    
// 判断消息cd
    switch (message) 
    
{
        
case WM_PAINT:                        //H口重绘消息?/span>
            hdc = BeginPaint(hWnd, &ps);
            EndPaint(hWnd, 
&ps);
            
break;
        
case WM_DESTROY:                    //H口l束消息
            /***********************************************************
             * 调用PostQuitMessage()函数发送窗口结束消息给pȝQ通知
             * pȝl束目前E序的运行,然后ql处理程序结束的后箋操作
             **********************************************************
*/

            PostQuitMessage(
0);
            
break;
        
default:                            //其他消息
            
// DefWindowProc()函数调用预设的系l函数来处理E序本n不处理的消息
            return DefWindowProc(hWnd, message, wParam, lParam);
   }

   
return 0;
}

下蝲源代码:canvas.rarQ文件上传在Windows liveI间Q可能需要有msn账号q行dQ?


PSQ如惌得更多关于Visual C++游戏开发的内容Q可点击随笔Q《Visual C++游戏~程基础》学习笔记——烦引随W?/a>?

烟皑 2010-04-08 11:00 发表评论
]]>
构徏游戏设计的舞?/title><link>http://www.shnenglu.com/kangnixi/archive/2010/04/08/111927.html</link><dc:creator>烟皑</dc:creator><author>烟皑</author><pubDate>Thu, 08 Apr 2010 02:35:00 GMT</pubDate><guid>http://www.shnenglu.com/kangnixi/archive/2010/04/08/111927.html</guid><wfw:comment>http://www.shnenglu.com/kangnixi/comments/111927.html</wfw:comment><comments>http://www.shnenglu.com/kangnixi/archive/2010/04/08/111927.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/kangnixi/comments/commentRss/111927.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/kangnixi/services/trackbacks/111927.html</trackback:ping><description><![CDATA[<p>        如果您是W一ơ接触VC++Q或许还不清楚徏立VC++E序目的方式,不过没关p,在这里先以VC++目向导做个建立单项目的CZQ可以按照下面的操作步骤来完成这工作,如下图:<br>       <br><strong>W一步:</strong><br><img border=0 alt="" src="http://www.shnenglu.com/images/cppblog_com/kangnixi/构徏游戏设计的舞?2.jpg" width=752 height=493><br><br><strong>W二?/strong><br><img border=0 src="http://www.shnenglu.com/images/cppblog_com/kangnixi/构徏游戏设计的舞?3.jpg" width=622 height=480><br><br>在项目徏立完成后Q查看工作区的文件列表,可看到如下图所C的内容<br><img border=0 src="http://www.shnenglu.com/images/cppblog_com/kangnixi/构徏游戏设计的舞?5.JPG" width=228 height=330><br><br>其中几个重要的文件说明如下表所C:<br>  <table border=1 cellSpacing=0 cellPadding=0> <tbody> <tr> <td style="COLOR: #000000" vAlign=top width=79> <p style="COLOR: #000000">文g名称</p> </td> <td style="COLOR: #000000" vAlign=top width=489> <p style="COLOR: #000000">说明</p> </td> </tr> <tr> <td style="COLOR: #000000" vAlign=top width=79> <p style="COLOR: #000000">canvas.cpp</p> </td> <td style="COLOR: #000000" vAlign=top width=489> <p style="COLOR: #000000">ȝ序文Ӟ其中包含整个目的主E序WinMain</p> </td> </tr> <tr> <td style="COLOR: #000000" vAlign=top width=79> <p style="COLOR: #000000">canvas.rc</p> </td> <td style="COLOR: #000000" vAlign=top width=489> <p style="COLOR: #000000">资源文gQ定义了整个目所使用的资?/p> </td> </tr> <tr> <td style="COLOR: #000000" vAlign=top width=79> <p style="COLOR: #000000">StdAfx.h</p> </td> <td style="COLOR: #000000" vAlign=top width=489> <p style="COLOR: #000000">标头文gQ其中引用整个项目所需的头文g</p> </td> </tr> </tbody> </table> </p> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><br>可以直接按?/span><span lang=EN-US>F5</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">】键q行q个目?/span> <br><br>PSQ如惌得更多关于Visual C++游戏开发的内容Q可点击随笔<a href="http://www.shnenglu.com/kangnixi/archive/2010/04/08/111931.html">Q《Visual C++游戏~程基础》学习笔记——烦引随W?/a>? <img src ="http://www.shnenglu.com/kangnixi/aggbug/111927.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/kangnixi/" target="_blank">烟皑</a> 2010-04-08 10:35 <a href="http://www.shnenglu.com/kangnixi/archive/2010/04/08/111927.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.tingyuxuan999.cn" target="_blank">Ʒþþþþ </a>| <a href="http://www.gsappxz.cn" target="_blank">¾þƵ</a>| <a href="http://www.vaez.cn" target="_blank">Ʒþþþþþ</a>| <a href="http://www.fengbiaochem.com.cn" target="_blank">޾ƷŮþþ</a>| <a href="http://www.suppin.cn" target="_blank">鶹Ʒþþþþþ99</a>| <a href="http://www.ynymdp.cn" target="_blank">þþþƷҰ</a>| <a href="http://www.15961662156.cn" target="_blank">999þþѹƷ</a>| <a href="http://www.xopa.cn" target="_blank">99þ99þþƷѿ</a>| <a href="http://www.gzzmlhlaw.cn" target="_blank">ŷսþþþþþþ </a>| <a href="http://www.cc5ujj.cn" target="_blank">þþƷһ</a>| <a href="http://www.blog060422.cn" target="_blank">ȾþӾþþƷ18</a>| <a href="http://www.werro.cn" target="_blank">պƷþþþþþõӰ</a>| <a href="http://www.139shops.cn" target="_blank">޾Ʒþþ</a>| <a href="http://www.8xbu.cn" target="_blank">þøŮ߳MBA</a>| <a href="http://www.6nz.com.cn" target="_blank">þù׽ </a>| <a href="http://www.uusee5.org.cn" target="_blank">þAVۺϺɫ</a>| <a href="http://www.sxysw.cn" target="_blank">ۺϾƷ㽶þ</a>| <a href="http://www.cstshs.cn" target="_blank">޾Ʒþǧն</a>| <a href="http://www.ypnlb.cn" target="_blank">ɫۺϾþþþ</a>| <a href="http://www.acolor.com.cn" target="_blank">þþƷAV</a>| <a href="http://www.feschain.cn" target="_blank">99þó˹Ʒ</a>| <a href="http://www.b3382.cn" target="_blank">ۺϾþۺϼþ</a>| <a href="http://www.www227.cn" target="_blank">þþܳ</a>| <a href="http://www.radowatchessale.cn" target="_blank">þþƷAVһ</a>| <a href="http://www.ssc629.cn" target="_blank">ɫۺϾþþþۺһ</a>| <a href="http://www.90key.cn" target="_blank">ƷۺϾþþþþ888ѿ</a>| <a href="http://www.hankale.cn" target="_blank">þþƵ</a>| <a href="http://www.yxwelding.com.cn" target="_blank">ƷѾþþþӰԺ</a>| <a href="http://www.liuqianqian.cn" target="_blank">պ޹ۺϾþþ</a>| <a href="http://www.happy925.cn" target="_blank">ھƷþþþӰԺ޹² </a>| <a href="http://www.ybwsf.cn" target="_blank">aëƬþѲ</a>| <a href="http://www.yizhuyuan.cn" target="_blank">þþþùƷ۲ӰԺ</a>| <a href="http://www.c6t9.cn" target="_blank">þþþAVۿ</a>| <a href="http://www.dpzxj.cn" target="_blank">þþþ޾Ʒһ</a>| <a href="http://www.gdhaojulai.cn" target="_blank">99þþƷ鶹</a>| <a href="http://www.qdtiandiyuan.cn" target="_blank">ƷþþĻ</a>| <a href="http://www.bddp.com.cn" target="_blank">þþһƷ99þþƷ88</a>| <a href="http://www.odostudio.cn" target="_blank">97þ㽶߿ۿ</a>| <a href="http://www.yz10.cn" target="_blank">þþþŮʦһ</a>| <a href="http://www.spinpizza.cn" target="_blank">ҹƷþþþþëƬ</a>| <a href="http://www.ugmx.cn" target="_blank">Ʒþþþһ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>