﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-当罗梅洛走进房间时，卡马克一如往常坐在显示器前优化着下一代图像引擎。</title><link>http://www.cppblog.com/CK985/</link><description>他的房间比以前大了不少，也更干净整洁，但仍然是那么简朴无华</description><language>zh-cn</language><lastBuildDate>Sat, 04 Apr 2026 03:49:20 GMT</lastBuildDate><pubDate>Sat, 04 Apr 2026 03:49:20 GMT</pubDate><ttl>60</ttl><item><title>BMS(音乐游戏)文件结构解析</title><link>http://www.cppblog.com/CK985/archive/2010/03/18/110024.html</link><dc:creator>CK</dc:creator><author>CK</author><pubDate>Thu, 18 Mar 2010 08:57:00 GMT</pubDate><guid>http://www.cppblog.com/CK985/archive/2010/03/18/110024.html</guid><wfw:comment>http://www.cppblog.com/CK985/comments/110024.html</wfw:comment><comments>http://www.cppblog.com/CK985/archive/2010/03/18/110024.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/CK985/comments/commentRss/110024.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/CK985/services/trackbacks/110024.html</trackback:ping><description><![CDATA[<p>*开头表示注释，这行后面的字符串都忽略<br>空行*1<br>*---------------------- HEADER FIELD<br>空行*1<br>#PLAYER V-整数<br>{游戏模式，1-单人，2-双人单边，3-单人双边，4-9Key，5-13Key}<br>无空行<br>#GENRE V-字符串<br>{曲风}<br>无空行<br>#TITLE V-字符串<br>{游戏标题}<br>无空行<br>#ARTIST V-字符串<br>{Noter}<br>无空行<br>#BPM V-实数<br>{BPM标识}<br>无空行<br>#PLAYLEVEL V-整数<br>{星级}<br>无空行<br>#RANK V-整数<br>{难度等级，3-Easy，2-Normal，1-Hard，0-Very Hard}<br>无空行<br>#TOTAL V-整数<br>{音符总数}<br>无空行<br>#VOLWAV V-整数<br>{意义暂时不明}<br>无空行<br>#STAGEFILE S-字符串<br>{预览图文件路径(直接跟文件名，即相对路径，跟BMS文件在同一文件夹)}<br>空行*1<br>{块<br>#WAVXX S-字符串</p>
<p>XX-2位16进制数，标志此WAV项编号<br>S-文件路径(相对路径)<br>}<br>空行*1<br>{块<br>#BMPXX S-字符串</p>
<p>XX-2位16进制数，标识此图资源编号<br>S-文件路径(相对路径)<br>注：BPM00代表游戏时的LOGO<br>}<br>空行*2（其实我猜中间还有个东西，不过没发现）<br>{块<br>#BPMXX V-实数</p>
<p>XX-2位16进制数，标识此BPM标签编号<br>V-此标签代表的BPM数值<br>}<br>空行*1<br>{块<br>#STOPXX V-实数</p>
<p>XX-2位16进制数，标识此STOP标签编号<br>}<br>空行*1<br>{块<br>S-字符串</p>
<p>Expand信息，貌似没用<br>}<br>空行*3<br>*---------------------- MAIN DATA FIELD<br>空行*1<br>{块<br>&nbsp; {块<br>&nbsp; #PPPTT:V<br>&nbsp; PPP=小节数</p>
<p>&nbsp; TT=记录类型<br>&nbsp;&nbsp;&nbsp;&nbsp; 01=WAV资源放置编号，每一列分一行<br>&nbsp;&nbsp;&nbsp;&nbsp; 03=16进制数值BPM（当设置的BPM值小于256而且不是小数时）<br>&nbsp;&nbsp;&nbsp;&nbsp; 04=BGA<br>&nbsp;&nbsp;&nbsp;&nbsp; 06=POOR<br>&nbsp;&nbsp;&nbsp;&nbsp; 07=LAYER<br>&nbsp;&nbsp;&nbsp;&nbsp; 08=自定义BPM数值编号<br>&nbsp;&nbsp;&nbsp;&nbsp; 09=STOP，作用不明<br>&nbsp;&nbsp;&nbsp;&nbsp; 11~16+18~19=8个按键，18为最左，11~16一次向右，19为按键最后一列，数值代表</p>
<p>Key音WAV编号<br>&nbsp;&nbsp;&nbsp;&nbsp; 51~56+58~59=8个按键位置，对应长条的起始和终止点，跟上面的一样</p>
<p><br>&nbsp; V:设字符串长度为A，则记录值将这个小节分为A/2个时间点，每个记录值以2位16进制数</p>
<p>存储，若为00则表示忽略<br>&nbsp; }<br>每小节空行*1<br>}<br>文件结束<br></p>
<img src ="http://www.cppblog.com/CK985/aggbug/110024.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/CK985/" target="_blank">CK</a> 2010-03-18 16:57 <a href="http://www.cppblog.com/CK985/archive/2010/03/18/110024.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>祝ってやる</title><link>http://www.cppblog.com/CK985/archive/2010/01/23/106280.html</link><dc:creator>CK</dc:creator><author>CK</author><pubDate>Sat, 23 Jan 2010 06:31:00 GMT</pubDate><guid>http://www.cppblog.com/CK985/archive/2010/01/23/106280.html</guid><wfw:comment>http://www.cppblog.com/CK985/comments/106280.html</wfw:comment><comments>http://www.cppblog.com/CK985/archive/2010/01/23/106280.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/CK985/comments/commentRss/106280.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/CK985/services/trackbacks/106280.html</trackback:ping><description><![CDATA[<a href="http://www.nicovideo.jp/watch/sm8966268">http://www.nicovideo.jp/watch/sm8966268</a><br><br>这首歌很有感觉啊。。。<br>以下是LRC歌词<br><br>[00:06.71]作詞：おにゅうP <br>[00:09.33]作曲：おにゅうP <br>[00:11.94]編曲：ピノキオP <br>[00:14.55]歌：初音ミク <br>[00:20.29]<br>[00:24.45]依偎在一起的 帥哥與美女 <br>[00:34.61]還有該死的現充 詛咒你們 <br>[00:45.02]<br>[00:45.24]為什麼這一條街上 <br>[00:50.26]到處都滿盈著笑臉？ <br>[00:55.50]雖然是我這個孤單寂寞的人 <br>[01:01.53]我還是要告訴大家 <br>[01:04.63]<br>[01:04.82]祝福你們　直到後世 <br>[01:09.65]於丑之時　參見死亡 <br>[01:15.62]當天壽已盡時 <br>[01:21.17]全都給我去死吧 <br>[01:25.16]祝福你們 <br>[01:32.26]<br>[01:47.75]一起進來的同事也 <br>[01:52.76]為了家人拚命工作而得到晉升 <br>[01:58.39]真的令人羨慕不已 <br>[02:03.40]詛咒你們 <br>[02:08.44]<br>[02:08.60]為什麼這個國家 <br>[02:13.67]到處都滿盈著笑臉？ <br>[02:18.85]雖然我什麼長處也沒有 <br>[02:24.10]我還是要告訴大家 <br>[02:27.87]<br>[02:28.05]祝福你們　直到後世 <br>[02:33.20]找好對象　一起結婚 <br>[02:39.19]還有可愛的小孩子 <br>[02:44.55]能夠圍繞在身邊 <br>[02:48.92]祝福你們 <br>[02:53.63]<br>[03:01.74]工作都不順利 <br>[03:06.22]因為原本就沒有工作 <br>[03:11.40]讀書也讀不好 <br>[03:16.43]戀情也沒有任何進展 <br>[03:21.79]不論是那樣的傢伙們<br>[03:26.84]或者不是那樣的傢伙們也好 <br>[03:32.79]我還是要告訴大家 <br>[03:37.27]全部都　全部都　全部都── <br>[03:41.09]<br>[03:41.32]祝福你們　直到後世 <br>[03:46.26]低頭哭泣的傢伙也 <br>[03:52.12]我都會祝福你的 <br>[03:57.31]所以抬起頭來吧 <br>[04:01.79]<br>[04:01.97]祝福你們　直到後世 <br>[04:07.36]於丑之時　參見死亡 <br>[04:12.91]為了你們　今後將來 <br>[04:18.57]的幸福 給予祝福<br>[04:32.71]<br>
<img src ="http://www.cppblog.com/CK985/aggbug/106280.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/CK985/" target="_blank">CK</a> 2010-01-23 14:31 <a href="http://www.cppblog.com/CK985/archive/2010/01/23/106280.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Sumreen(GAL GAME)引擎框架</title><link>http://www.cppblog.com/CK985/archive/2010/01/01/104602.html</link><dc:creator>CK</dc:creator><author>CK</author><pubDate>Fri, 01 Jan 2010 06:03:00 GMT</pubDate><guid>http://www.cppblog.com/CK985/archive/2010/01/01/104602.html</guid><wfw:comment>http://www.cppblog.com/CK985/comments/104602.html</wfw:comment><comments>http://www.cppblog.com/CK985/archive/2010/01/01/104602.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/CK985/comments/commentRss/104602.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/CK985/services/trackbacks/104602.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 因为东西挺多的，所以这里只讲基本的构架，即怎么构成这个程序，具体的细节问题后面一个一个再实现首先要声明一点，我的代码很丑的，因为自己以前没有学习过什么GAL GAME引擎相关方面的知识，只是想着如何实现一般GAL GAME的功能就自己YY出这个引擎了。&nbsp;这个引擎图形方面使用Direct3D，音频方面使用Fmod Sound System，IDE使用Visual Studio 2008，并...&nbsp;&nbsp;<a href='http://www.cppblog.com/CK985/archive/2010/01/01/104602.html'>阅读全文</a><img src ="http://www.cppblog.com/CK985/aggbug/104602.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/CK985/" target="_blank">CK</a> 2010-01-01 14:03 <a href="http://www.cppblog.com/CK985/archive/2010/01/01/104602.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>NOIP2009前一天</title><link>http://www.cppblog.com/CK985/archive/2009/11/20/101520.html</link><dc:creator>CK</dc:creator><author>CK</author><pubDate>Fri, 20 Nov 2009 13:50:00 GMT</pubDate><guid>http://www.cppblog.com/CK985/archive/2009/11/20/101520.html</guid><wfw:comment>http://www.cppblog.com/CK985/comments/101520.html</wfw:comment><comments>http://www.cppblog.com/CK985/archive/2009/11/20/101520.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/CK985/comments/commentRss/101520.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/CK985/services/trackbacks/101520.html</trackback:ping><description><![CDATA[出征宣言：决战成都！<br><br>好不容易都走到这一步了，怎么能在这种地方挂掉！<br><br>可恶！加油！
<img src ="http://www.cppblog.com/CK985/aggbug/101520.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/CK985/" target="_blank">CK</a> 2009-11-20 21:50 <a href="http://www.cppblog.com/CK985/archive/2009/11/20/101520.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Direct3D中的简单2D绘制（下）——文字的绘制</title><link>http://www.cppblog.com/CK985/archive/2009/09/10/95820.html</link><dc:creator>CK</dc:creator><author>CK</author><pubDate>Thu, 10 Sep 2009 09:29:00 GMT</pubDate><guid>http://www.cppblog.com/CK985/archive/2009/09/10/95820.html</guid><wfw:comment>http://www.cppblog.com/CK985/comments/95820.html</wfw:comment><comments>http://www.cppblog.com/CK985/archive/2009/09/10/95820.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/CK985/comments/commentRss/95820.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/CK985/services/trackbacks/95820.html</trackback:ping><description><![CDATA[&nbsp;
<p><span>在</span><span>Direct3D</span><span>渲染中当然也少不了文字。作为所有游戏最重要的一部分，绘制文字的问题也成了非常重要的一个话题。于是咱们接着研究关于文字的绘制。这部分学习完了以后，咱们就会拥有一个有着基本朴实功能的</span><span>GraphEngine</span><span>。可以绘制图片以及文字以后，剩下的事便可以干完了。</span></p>
<p><span>作为</span><span>Direct3D</span><span>中绘制文字的利器</span><span>ID3DXFont</span><span>有着完备的文字绘制功能。可是首先要说明的是，</span><span>ID3DXFont</span><span>在绘制文字的时候使用的是</span><span>GDI</span><span>的</span><span>API</span><span>，众所周知</span><span>GDI</span><span>是效率非常低下的东西。于是在这个基础上，</span><span>DXUT</span><span>提供了一个东西叫做</span><span>CDXUTTextHelper</span><span>，它封装了需要的</span><span>ID3DXFont</span><span>以及</span><span>Sprite</span><span>，并提高了工作效率。那么具体是怎么提高的呢？那就是它在内存中开辟了一块纹理，将绘制过的文字绘制在这上面，以后再次遇到这个字的时候就直接当做普通纹理处理了。这样做的代价就是内存的开销变大，经过咱的测试，稳定下来的大概会占掉</span><span>200-300MB</span><span>的内存，即使是在目前普及</span><span>1G-2G</span><span>内存的时代，这样的开销也算是非常巨大的，因此汝可以在</span><span>ID3DXFont</span><span>和</span><span>CDXUTTextHelper</span><span>之间作出选择，是牺牲空间换来时间还是牺牲时间换来空间。或者汝有更好的方法请回复。</span></p>
<p>&nbsp;</p>
<p><span>那么接下来就是正题了，这里以</span><span>ID3DXFont</span><span>为讲解对象，</span><span>CDXUTTextHelper</span><span>跟这个类似。</span></p>
<p><span>跟以前一样先来看构造</span><span>ID3DXFont</span><span>的函数原型：</span></p>
<p align=left><strong><span>HRESULT D3DXCreateFont(</span></strong></p>
<p align=left><span>&nbsp;<strong>LPDIRECT3DDEVICE9</strong> <em>pDevice</em><strong>,</strong></span></p>
<p align=left><span>&nbsp;<strong>INT</strong> <em>Height</em><strong>,</strong></span></p>
<p align=left><span>&nbsp;<strong>UINT</strong> <em>Width</em><strong>,</strong></span></p>
<p align=left><span>&nbsp;<strong>UINT</strong> <em>Weight</em><strong>,</strong></span></p>
<p align=left><span>&nbsp;<strong>UINT</strong> <em>MipLevels</em><strong>,</strong></span></p>
<p align=left><span>&nbsp;<strong>BOOL</strong> <em>Italic</em><strong>,</strong></span></p>
<p align=left><span>&nbsp;<strong>DWORD</strong> <em>CharSet</em><strong>,</strong></span></p>
<p align=left><span>&nbsp;<strong>DWORD</strong> <em>OutputPrecision</em><strong>,</strong></span></p>
<p align=left><span>&nbsp;<strong>DWORD</strong> <em>Quality</em><strong>,</strong></span></p>
<p align=left><span>&nbsp;<strong>DWORD</strong> <em>PitchAndFamily</em><strong>,</strong></span></p>
<p align=left><span>&nbsp;<strong>LPCTSTR</strong> <em>pFacename</em><strong>,</strong></span></p>
<p align=left><span>&nbsp;<strong>LPD3DXFONT *</strong> <em>ppFont</em></span></p>
<p><strong><span>)</span></strong><span>;</span></p>
<p><span>pDevice:Direct3D</span><span>设备</span></p>
<p><span>Height:</span><span>字符的逻辑单位高度</span></p>
<p><span>Weight:</span><span>字符的逻辑单位宽度</span></p>
<p><span>Weight:</span><span>字符粗细的枚举量，有以下几种：</span></p>
<p align=left><span>/* Font Weights */</span></p>
<p align=left><span>#define</span><span> FW_DONTCARE<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>0</span></p>
<p align=left><span>#define</span><span> FW_THIN<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>100</span></p>
<p align=left><span>#define</span><span> FW_EXTRALIGHT<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>200</span></p>
<p align=left><span>#define</span><span> FW_LIGHT<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>300</span></p>
<p align=left><span>#define</span><span> FW_NORMAL<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>400</span></p>
<p align=left><span>#define</span><span> FW_MEDIUM<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>500</span></p>
<p align=left><span>#define</span><span> FW_SEMIBOLD<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>600</span></p>
<p align=left><span>#define</span><span> FW_BOLD<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>700</span></p>
<p align=left><span>#define</span><span> FW_EXTRABOLD<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>800</span></p>
<p align=left><span>#define</span><span> FW_HEAVY<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>900</span></p>
<p><span>MipLevels:</span><span>好吧咱自重咱也不知道这个是干啥的不过也不需要了解它是干啥的填</span><span>0</span><span>就好了</span></p>
<p><span>Italic:</span><span>是否斜体</span></p>
<p><span>CharSet:</span><span>字体字符的设置，也就是一些字体的指定，一般填<span>DEFAULT_CHARSET</span></span></p>
<p align=left><span>#define</span><span> ANSI_CHARSET<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>0</span></p>
<p align=left><span>#define</span><span> DEFAULT_CHARSET<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>1</span></p>
<p align=left><span>#define</span><span> SYMBOL_CHARSET<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>2</span></p>
<p align=left><span>#define</span><span> SHIFTJIS_CHARSET<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>128</span></p>
<p align=left><span>#define</span><span> HANGEUL_CHARSET&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>129</span></p>
<p align=left><span>#define</span><span> HANGUL_CHARSET<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>129</span></p>
<p align=left><span>#define</span><span> GB2312_CHARSET<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>134</span></p>
<p align=left><span>#define</span><span> CHINESEBIG5_CHARSET<span>&nbsp;&nbsp;&nbsp;&nbsp; </span>136</span></p>
<p align=left><span>#define</span><span> OEM_CHARSET<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>255</span></p>
<p align=left><span>#if</span><span>(WINVER &gt;= 0x0400)</span></p>
<p align=left><span>#define</span><span> JOHAB_CHARSET<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>130</span></p>
<p align=left><span>#define</span><span> HEBREW_CHARSET<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>177</span></p>
<p align=left><span>#define</span><span> ARABIC_CHARSET<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>178</span></p>
<p align=left><span>#define</span><span> GREEK_CHARSET<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>161</span></p>
<p align=left><span>#define</span><span> TURKISH_CHARSET<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>162</span></p>
<p align=left><span>#define</span><span> VIETNAMESE_CHARSET<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>163</span></p>
<p align=left><span>#define</span><span> THAI_CHARSET<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>222</span></p>
<p align=left><span>#define</span><span> EASTEUROPE_CHARSET<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>238</span></p>
<p><span>#define</span><span> RUSSIAN_CHARSET<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>204</span></p>
<p><span>OutputPrecision</span><span>:</span><span>指定</span><span>Windows</span><span>如何把指定的字体大小和实际的字体相配，一般填</span><span>OUT_DEFAULT_PRECIS</span></p>
<p align=left><span>#define</span><span> OUT_DEFAULT_PRECIS<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>0</span></p>
<p align=left><span>#define</span><span> OUT_STRING_PRECIS<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>1</span></p>
<p align=left><span>#define</span><span> OUT_CHARACTER_PRECIS<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>2</span></p>
<p align=left><span>#define</span><span> OUT_STROKE_PRECIS<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>3</span></p>
<p align=left><span>#define</span><span> OUT_TT_PRECIS<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>4</span></p>
<p align=left><span>#define</span><span> OUT_DEVICE_PRECIS<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>5</span></p>
<p align=left><span>#define</span><span> OUT_RASTER_PRECIS<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>6</span></p>
<p align=left><span>#define</span><span> OUT_TT_ONLY_PRECIS<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>7</span></p>
<p align=left><span>#define</span><span> OUT_OUTLINE_PRECIS<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>8</span></p>
<p align=left><span>#define</span><span> OUT_SCREEN_OUTLINE_PRECIS<span>&nbsp;&nbsp; </span>9</span></p>
<p><span>#define</span><span> OUT_PS_ONLY_PRECIS<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>10</span></p>
<p><span>Quality:</span><span>指定<span>Windows</span>如何把指定的字体和实际的字体相配，一般填</span><span>DEFAULT_QUALITY</span></p>
<p align=left><span>#define</span><span> DEFAULT_QUALITY<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>0</span></p>
<p align=left><span>#define</span><span> DRAFT_QUALITY<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>1</span></p>
<p align=left><span>#define</span><span> PROOF_QUALITY<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>2</span></p>
<p align=left><span>#if</span><span>(WINVER &gt;= 0x0400)</span></p>
<p align=left><span>#define</span><span> NONANTIALIASED_QUALITY&nbsp;3</span></p>
<p><span>#define</span><span> ANTIALIASED_QUALITY<span>&nbsp;&nbsp;&nbsp;&nbsp; </span>4</span></p>
<p align=left><span>PitchAndFamily:</span></p>
<p align=left><span>Pitch:</span><span>一个位图内存地址距下一个位图内存地址的距离，一般填<span>DEFAULT_PITCH</span></span></p>
<p align=left><span>#define</span><span> DEFAULT_PITCH<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>0</span></p>
<p align=left><span>#define</span><span> FIXED_PITCH<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>1</span></p>
<p><span>#define</span><span> VARIABLE_PITCH<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>2</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>Family:</span><span>这个看注释就知道了，不知道的话就填<span>FF_DONTCARE</span></span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>/* Font Families */</span></p>
<p align=left><span>#define</span><span> FF_DONTCARE<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>(0&lt;&lt;4)&nbsp;<span>/* Don't care or don't know. */</span></span></p>
<p align=left><span>#define</span><span> FF_ROMAN<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>(1&lt;&lt;4)&nbsp;<span>/* Variable stroke width, serifed. */</span></span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>/* Times Roman, Century Schoolbook, etc. */</span></span></p>
<p align=left><span>#define</span><span> FF_SWISS<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>(2&lt;&lt;4)&nbsp;<span>/* Variable stroke width, sans-serifed. */</span></span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>/* Helvetica, Swiss, etc. */</span></span></p>
<p align=left><span>#define</span><span> FF_MODERN<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>(3&lt;&lt;4)&nbsp;<span>/* Constant stroke width, serifed or sans-serifed. */</span></span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>/* Pica, Elite, Courier, etc. */</span></span></p>
<p align=left><span>#define</span><span> FF_SCRIPT<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>(4&lt;&lt;4)&nbsp;<span>/* Cursive, etc. */</span></span></p>
<p><span>#define</span><span> FF_DECORATIVE<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>(5&lt;&lt;4)&nbsp;<span>/* Old English, etc. */</span></span></p>
<p><span>pFacename:</span><span>字体名称的宽字符串，例如<span>L</span></span><span>&#8221;Airia&#8221;</span></p>
<p><span>ppFont:ID3DXFont</span><span>类型的指针，传入进去以此建立字体对象。</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span>用<span>D3DXCreateFont</span>就可以创建各种各样的字体了。那么如何在实际的程序运行中用多种字体呢？你可以用<span>map</span>来管理，这样预处理出来是非常好的。</span></p>
<p><span>在附件中的工程的<span>GameEngine.cpp</span>的<span>OnCreateDevice</span>中可以看见字体的初始化过程。</span></p>
<p>&nbsp;</p>
<p><span>字体对象建立好了后便是绘制了，下面看一下<span>ID3DXFont::DrawText:</span></span></p>
<p align=left><strong><span>INT DrawText(</span></strong></p>
<p align=left><span>&nbsp;<strong>LPD3DXSPRITE</strong> <em>pSprite</em><strong>,</strong></span></p>
<p align=left><span>&nbsp;<strong>LPCTSTR</strong> <em>pString</em><strong>,</strong></span></p>
<p align=left><span>&nbsp;<strong>INT</strong> <em>Count</em><strong>,</strong></span></p>
<p align=left><span>&nbsp;<strong>LPRECT</strong> <em>pRect</em><strong>,</strong></span></p>
<p align=left><span>&nbsp;<strong>DWORD</strong> <em>Format</em><strong>,</strong></span></p>
<p align=left><span>&nbsp;<strong>D3DCOLOR</strong> <em>Color</em></span></p>
<p><strong><span>)</span></strong><span>;</span></p>
<p><span>pSprite:ID3DXFont</span><span>要借用<span>Sprite</span>来绘制文字，于是第一个参数传入已经建立好的<span>sprite</span></span></p>
<p><span>pString:</span><span>需要绘制的文字的宽字符串</span></p>
<p><span>Count:</span><span>需要绘制的文字的长度，若是<span>-1</span>则整个字符串一起画，否则按字数绘制</span></p>
<p><span>pRect:</span><span>指定一个矩形来让文字按<span>Format</span>格式在此矩形内排列</span></p>
<p><span>Color:</span><span>绘制文字的颜色</span></p>
<p><span>Format:</span><span>绘制文字的格式。<span>ID3DFont</span>提供了多样的绘制格式，见下：</span></p>
<p><span>注：我的程序中已经将<span>ID3DXFont</span>封装进<span>graphEngine</span>，具体参见代码</span></p>
<p>&nbsp;</p>
<p><span>DT_BOTTOM:</span><span>指定在矩形底部绘制</span></p>
<p><span>graphEngine-&gt;DrawTexts(L"Sumreen",MakeRect(0,0,200,200),DT_BOTTOM);</span></p>
<img height=234 alt="" src="http://www.cppblog.com/images/cppblog_com/ck985/Direct3D_2D_2/pic1.jpg" width=214 border=0>&nbsp;
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span>DT_CALCRECT:</span><span>改变传入的矩形的长宽，变成刚好能容下需要画文字的矩形</span></p>
<img height=260 alt="" src="http://www.cppblog.com/images/cppblog_com/ck985/Direct3D_2D_2/pic2.jpg" width=914 border=0>&nbsp;
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span>DT_CENTER:</span><span>指定在矩形的横向的中间绘制</span></p>
<p><span>graphEngine-&gt;DrawTexts(L"Sumreen",MakeRect(0,0,200,200),DT_CENTER);</span></p>
<img height=232 alt="" src="http://www.cppblog.com/images/cppblog_com/ck985/Direct3D_2D_2/pic3.jpg" width=212 border=0>&nbsp;
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span>DT_EXPANDTABS:</span><span>不忽略制表符绘制</span><span>(\t)</span><span>，一个</span><span>TAB</span><span>占</span><span>8</span><span>个位置</span></p>
<p><span>graphEngine-&gt;DrawTexts(L"\tSumreen",MakeRect(0,0,200,200),DT_EXPANDTABS);</span></p>
<img height=236 alt="" src="http://www.cppblog.com/images/cppblog_com/ck985/Direct3D_2D_2/pic4.jpg" width=213 border=0>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p><font face=Calibri>&nbsp;</font></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p><font face=Calibri>&nbsp;</font></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><font face=Calibri>DT_LEFT:</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">指定横向在矩形的左侧绘制</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><font face=Calibri>graphEngine-&gt;DrawTexts(L"Sumreen",MakeRect(0,0,200,200),DT_LEFT);</font></span></p>
<img height=235 alt="" src="http://www.cppblog.com/images/cppblog_com/ck985/Direct3D_2D_2/pic5.jpg" width=219 border=0>&nbsp;
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span>DT_NOCLIP:</span><span>不作任何格式限制及裁剪，以矩形左上角为绘制点绘制</span></p>
<p><span>graphEngine-&gt;DrawTexts(L"SumreenSumreenSumreenSumreen",MakeRect(0,0,50,200),DT_NOCLIP);</span></p>
<img height=234 alt="" src="http://www.cppblog.com/images/cppblog_com/ck985/Direct3D_2D_2/pic6.jpg" width=213 border=0>&nbsp;
<p>&nbsp;</p>
<p><span>DT_RIGHT:</span><span>指定在矩形右侧绘制文字</span></p>
<p><span>graphEngine-&gt;DrawTexts(L"Sumreen",MakeRect(0,0,200,200),DT_RIGHT);</span></p>
<img height=237 alt="" src="http://www.cppblog.com/images/cppblog_com/ck985/Direct3D_2D_2/pic7.jpg" width=216 border=0>&nbsp;
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span>DT_SINGLELINE:</span><span>在单行中绘制，忽略换行等</span></p>
<p><span>graphEngine-&gt;DrawTexts(L"Sumreen\nSumreen",MakeRect(0,0,200,200),DT_SINGLELINE);</span></p>
<img height=243 alt="" src="http://www.cppblog.com/images/cppblog_com/ck985/Direct3D_2D_2/pic8.jpg" width=216 border=0>&nbsp;
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span>DT_TOP:</span><span>指定纵向在矩形顶部绘制</span></p>
<span>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><font face=Calibri>graphEngine-&gt;DrawTexts(L"Sumreen",MakeRect(0,0,200,200),DT_TOP);</font></span></p>
<img height=243 alt="" src="http://www.cppblog.com/images/cppblog_com/ck985/Direct3D_2D_2/pic9.jpg" width=225 border=0>&nbsp;
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span>DT_VCENTER:</span><span>指定纵向在矩形中间绘制</span></p>
<p><span>graphEngine-&gt;DrawTexts(L"Sumreen",MakeRect(0,0,200,200),DT_VCENTER);</span></p>
<img height=241 alt="" src="http://www.cppblog.com/images/cppblog_com/ck985/Direct3D_2D_2/pic10.jpg" width=224 border=0>&nbsp;
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span>DT_WORDBREAK:</span><span>指定在矩形中自动换行绘制，还可以智能换行以不切断单词</span></p>
<p><span>graphEngine-&gt;DrawTexts(L"Sumreen Sumreen Sumreen Sumreen Sumreen Sumreen Sumreen Sumreen",MakeRect(0,0,200,200),DT_WORDBREAK);</span></p>
<img height=241 alt="" src="http://www.cppblog.com/images/cppblog_com/ck985/Direct3D_2D_2/pic11.jpg" width=219 border=0>&nbsp;
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span>以上为常用的一些标示符，如果需要更多信息请参考</span><span>DirectX SDK</span><span>。</span></p>
<p><span>其中汝觉得标示符不冲突就可以用或运算同时使用：</span></p>
<p>&nbsp;</p>
<p><span>graphEngine-&gt;DrawTexts(L"Sumreen",MakeRect(0,0,200,200),DT_RIGHT|DT_BOTTOM);</span></p>
<img height=239 alt="" src="http://www.cppblog.com/images/cppblog_com/ck985/Direct3D_2D_2/pic12.jpg" width=218 border=0>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p><font face=Calibri>&nbsp;</font></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p><font face=Calibri>&nbsp;</font></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><font face=Calibri>graphEngine-&gt;DrawTexts(L"Sumreen",MakeRect(0,0,200,200),DT_CENTER|DT_VCENTER);</font></span></p>
<img height=241 alt="" src="http://www.cppblog.com/images/cppblog_com/ck985/Direct3D_2D_2/pic13.jpg" width=220 border=0>&nbsp;
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span>其中常用的就是</span><span>DT_NOCLIP</span><span>了，即不作任何限制</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span>最后要注意的是因为<span>ID3DXFont</span>是用<span>Sprite</span>在绘制内存中的纹理式的文字，也就是相当于普通的绘制纹理，于是一定要在<span>Device</span>和<span>Sprite</span>的<span>Begin</span>以及<span>End</span>之间再调用<span>DrawText</span>。</span></p>
<p>&nbsp;</p>
<p><span>以上就是利用<span>ID3DXFont</span>绘制文字的基础内容。虽然说是基础，却也提供了非常多的实用的效果。对于制作<span>GALGAME</span>来说已经足够了。</span></p>
<p>&nbsp;</p>
<p><span>顺便再说一个经常用到的效果：阴影以及边框</span></p>
<p><span>其实这个也不复杂，就只是平移一两个单位像素按阴影颜色再绘制一下就行了：</span></p>
<p><span>graphEngine-&gt;DrawTexts(L"Sumreen",MakeRect(0,1,200,200),D3DCOLOR_ARGB(255,255,0,0),DT_NOCLIP);</span></p>
<p><span>graphEngine-&gt;DrawTexts(L"Sumreen",MakeRect(1,0,200,200),D3DCOLOR_ARGB(255,255,0,0),DT_NOCLIP);</span></p>
<p><span>graphEngine-&gt;DrawTexts(L"Sumreen",MakeRect(-1,0,200,200),D3DCOLOR_ARGB(255,255,0,0),DT_NOCLIP);</span></p>
<p><span>graphEngine-&gt;DrawTexts(L"Sumreen",MakeRect(0,-1,200,200),D3DCOLOR_ARGB(255,255,0,0),DT_NOCLIP);</span></p>
<p><span>graphEngine-&gt;DrawTexts(L"Sumreen",MakeRect(0,0,200,200),D3DCOLOR_ARGB(255,0,255,0),DT_NOCLIP);</span></p>
<img height=243 alt="" src="http://www.cppblog.com/images/cppblog_com/ck985/Direct3D_2D_2/pic14.jpg" width=219 border=0>&nbsp;
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span>graphEngine-&gt;DrawTexts(L"Sumreen",MakeRect(1,1,200,200),D3DCOLOR_ARGB(255,0,0,0),DT_NOCLIP);</span></p>
<p><span>graphEngine-&gt;DrawTexts(L"Sumreen",MakeRect(0,0,200,200),D3DCOLOR_ARGB(255,0,255,0),DT_NOCLIP);</span></p>
<img height=241 alt="" src="http://www.cppblog.com/images/cppblog_com/ck985/Direct3D_2D_2/pic15.jpg" width=226 border=0>&nbsp;
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span>嘛，文字的绘制就是这样了。现在绘制东西已经不成问题了，于是下一次便开始讲整个引擎的框架。</span></p>
<p>&nbsp;</p>
<p><span>文章中可能会有疏忽和错误之处，也请大家不吝赐教。</span></p>
<br>代码工程下载（VS2008）：<br><a href="http://www.cppblog.com/Files/CK985/Direct3D_2D.rar">/Files/CK985/Direct3D_2D.rar</a></span>
<img src ="http://www.cppblog.com/CK985/aggbug/95820.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/CK985/" target="_blank">CK</a> 2009-09-10 17:29 <a href="http://www.cppblog.com/CK985/archive/2009/09/10/95820.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Direct3D中的简单2D绘制（上）——纹理的绘制</title><link>http://www.cppblog.com/CK985/archive/2009/08/10/92747.html</link><dc:creator>CK</dc:creator><author>CK</author><pubDate>Sun, 09 Aug 2009 16:35:00 GMT</pubDate><guid>http://www.cppblog.com/CK985/archive/2009/08/10/92747.html</guid><wfw:comment>http://www.cppblog.com/CK985/comments/92747.html</wfw:comment><comments>http://www.cppblog.com/CK985/archive/2009/08/10/92747.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cppblog.com/CK985/comments/commentRss/92747.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/CK985/services/trackbacks/92747.html</trackback:ping><description><![CDATA[<p>上一次已经讲了DXUT的基本工作模式，汝在DirectX SDK里面把EmptyProject找出来，然后把工程建立好，把include和lib等也配置，可能有的不知道怎么配置，咱这里还是说一下吧</p>
<br>若汝使用的是Visual Sutdio，那么 工具-&gt;选项-&gt;项目和解决方案-&gt;VC++目录。右边在&#8220;包含文件&#8221;里加上DirectX SDK目录底下的include目录，&#8220;库文件&#8221;里加上DirectX SDK目录底下的lib/xXX目录，若汝使用的是32位机，就选x86，64位机选择x64。<span style="COLOR: #000000"><font color=#ff0000>若是其他IDE，在系统环境变量里配置就好。</font><br></span><br><br>现在汝按下F5，就会出现一个640*480的黑色的窗口。这个就是DXUT底层完全准备好了，就等汝干事儿了。<br><br>接下来咱们要干嘛？很容易想到的就是画图。于是给汝介绍一下在Direct3D中处理2D图像的核心内容——Sprite<br><br>Sprite是Direct3D中处理2D图像的十分便利的一个武器。它的用处就是绘制某张指定的纹理，并且可以加上简单的颜色化渲染。<br><br><strong>HRESULT Draw(</strong><br>&nbsp; <strong>LPDIRECT3DTEXTURE9</strong> <em>pTexture</em><strong>,</strong><br>&nbsp; <strong>CONST RECT *</strong> <em>pSrcRect</em><strong>,</strong><br>&nbsp; <strong>CONST D3DXVECTOR3 *</strong> <em>pCenter</em><strong>,</strong><br>&nbsp; <strong>CONST D3DXVECTOR3 *</strong> <em>pPosition</em><strong>,</strong><br>&nbsp; <strong>D3DCOLOR</strong> <em>Color</em><br><strong>);<br><br></strong>Sprite::Draw函数的原型就是这样。不过这个函数必须在Sprite::Begin()和Sprite::End()这两个函数之间才能使用。这个Begin和End便是加在OnFrameRender()这个回调函数里面。那么下来我们细说这些参数。<br>pTexture 这个要传入需要绘制的纹理对象的指针<br>pSrcRect 这个传入需要绘制纹理pTexture的哪一部分，就是一个矩形限定框<br>pCenter 以pCenter为中心绘制纹理<br>pPosition 以pPosition为左上角为起始点绘制<br>Color 用Color颜色来渲染此次绘制<br><br>利用这个函数咱就可以创造一个世界了~有图就有真相。那么咱是如何创造这个世界呢？<br>咱可以将这个函数封装一下，让咱可以非常方便的使用它。<br>平常绘制图片，因为不存在3D，所以咱需要的也就这几个<br>texture 需要绘制的纹理<br>srcRect 绘制纹理的srcRect<br>darwRect 将纹理的srcRect部分拉伸绘制在屏幕的drawRect部分<br>color 用color颜色来渲染此次绘制<br><br>于是咱就可以计划咱的简单的图形引擎（虽然很简陋）了。总结出下列的封装后的接口，咱们将它们封装进咱们的图像引擎，也就是GraphEngine:<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;GraphEngine<br><img id=Codehighlighter1_18_892_Open_Image onclick="this.style.display='none'; Codehighlighter1_18_892_Open_Text.style.display='none'; Codehighlighter1_18_892_Closed_Image.style.display='inline'; Codehighlighter1_18_892_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_18_892_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_18_892_Closed_Text.style.display='none'; Codehighlighter1_18_892_Open_Image.style.display='inline'; Codehighlighter1_18_892_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_18_892_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_18_892_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">-------------------------绘制接口----------------------------------------</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Draw(</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;whichone,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;dx,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;dy);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">在(dx,dy)处绘制路径名为whichone的整个纹理</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Draw(</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;whichone,&nbsp;RECT&nbsp;drawRect);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">在drawRect内绘制整个纹理</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Draw(</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;whichone,&nbsp;RECT&nbsp;srcRect,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;dx,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;dy);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">在(dx,dy)处绘制纹理的srcRect部分</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Draw(</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;whichone,&nbsp;RECT&nbsp;srcRect,&nbsp;RECT&nbsp;drawRect);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">在drawRect内绘制纹理的srcRect部分<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">---------------------这四个就是前面的接口加上一个渲染的颜色------------------------</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Draw(</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;whichone,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;dx,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;dy,&nbsp;D3DCOLOR&nbsp;color);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Draw(</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;whichone,&nbsp;RECT&nbsp;drawRect,&nbsp;D3DCOLOR&nbsp;color);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Draw(</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;whichone,&nbsp;RECT&nbsp;srcRect,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;dx,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;dy,&nbsp;D3DCOLOR&nbsp;color);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Draw(</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;whichone,&nbsp;RECT&nbsp;srcRect,&nbsp;RECT&nbsp;drawRect,&nbsp;D3DCOLOR&nbsp;color);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//</span><span style="COLOR: #008000">------------------------------------------------------------------------------------</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top></span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000">;</span></div>
<br>具体实现咱们先放一放。规划一个程序千万不要直接从底层开始想。虽然我们这个是面向对象编程，但是&#8220;自顶向下，逐步求精&#8221;依然对我们很有帮助。<br><br>以上的那些接口如果实现了，那么我们就可以真真正正地开始绘图了。<br><br>大概汝也发现了，需要画的是一个纹理的指针，可是我这里传入的是一个路径名。为什么呢？这是因为每次绘制的时候，汝要是每次都以&#8220;纹理的指针&#8221;方式代表一个纹理，那么可以想见不是很好管理。于是我们就引入纹理池的概念。纹理池正如其名，是用来管理纹理的一个池子。Direct3D中有专门的东西来管理，可是咱这里用不到里面的复杂的东西，只用手动模拟一个便可。咱的代码里是直接用数组存的，也对应存了那纹理的路径名。查找一个纹理就直接for过去，是O(n)级别的。要是汝追求效率的话可以写棵平衡树，用map也可以。<br><br>汝说汝没看见代码，不信？好吧，咱可是贤狼赫罗啊！给汝解析Draw(string whichone,RECT srcRect,RECT drawRect,D3DCOLOR color);这个函数吧，解析了汝明白了后，其他的也就不在话下。<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id=Codehighlighter1_0_122_Open_Image onclick="this.style.display='none'; Codehighlighter1_0_122_Open_Text.style.display='none'; Codehighlighter1_0_122_Closed_Image.style.display='inline'; Codehighlighter1_0_122_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_0_122_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_0_122_Closed_Text.style.display='none'; Codehighlighter1_0_122_Open_Image.style.display='inline'; Codehighlighter1_0_122_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top><span id=Codehighlighter1_0_122_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id=Codehighlighter1_0_122_Open_Text><span style="COLOR: #808080">///</span><span style="COLOR: #008000">-------------------------------------<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">在矩形drawRect内伸缩绘制纹理的srcRect部分，并用制定颜色渲染<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top></span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">-------------------------------------</span><span style="COLOR: #808080"></span></span><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;GraphEngine::Draw(</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;whichone,RECT&nbsp;srcRect,RECT&nbsp;drawRect,&nbsp;D3DCOLOR&nbsp;color)<br><img id=Codehighlighter1_206_876_Open_Image onclick="this.style.display='none'; Codehighlighter1_206_876_Open_Text.style.display='none'; Codehighlighter1_206_876_Closed_Image.style.display='inline'; Codehighlighter1_206_876_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_206_876_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_206_876_Closed_Text.style.display='none'; Codehighlighter1_206_876_Open_Image.style.display='inline'; Codehighlighter1_206_876_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_206_876_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_206_876_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;D3DXMATRIX&nbsp;ptransform,ptransform2,ptransform3,ptransform4;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;pSprite</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">GetTransform(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">ptransform);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;fx&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">)(drawRect.right</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">drawRect.left)</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">)(srcRect.right</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">srcRect.left);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;fy&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">)(drawRect.bottom</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">drawRect.top)</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">)(srcRect.bottom</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">srcRect.top);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;D3DXMatrixTranslation(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">ptransform2,drawRect.left</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">fx,drawRect.top</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">fy,</span><span style="COLOR: #000000">0.0f</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;D3DXMatrixScaling(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">ptransform3,&nbsp;fx,&nbsp;fy,&nbsp;</span><span style="COLOR: #000000">1.0f</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;D3DXMatrixMultiply(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">ptransform4,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">ptransform2,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">ptransform3);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;D3DXMatrixMultiply(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">ptransform4,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">ptransform4,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">ptransform);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;pSprite</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">SetTransform(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">ptransform4);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;pSprite</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Draw(TexturePool[findTexture(whichone)],</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">srcRect,NULL,NULL,color);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;pSprite</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">SetTransform(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">ptransform);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<br>D3DXMATRIX 申明了几个变换矩阵（什么是变换矩阵？一会儿咱会解释，汝先继续看）。在Direct3D中，坐标系以矩阵形式存储，并且可以通过矩阵变换来变换坐标系。<br>我们要吧图画在drawRect部分里，于是我们首先把坐标系原点变换到drawRect矩形的左上角。因为后面还会伸缩坐标系，所以不能直接移动过去，而要以drawRect和srcRect的比例移动过去。<br>pSprite-&gt;GetTransform(&amp;ptransform);这句将原本的坐标系存储下来，好一会儿还原回去。fx记录了X轴方向的比例，fy记录了Y轴方向的比例。<br>D3DXMatrixTranslation(&amp;ptransform2,drawRect.left/fx,drawRect.top/fy,0.0f);这句将ptransform2这个矩阵改变成记录了&#8220;在X轴方向平移drawRect.left/fx，在Y轴方向平移drawRect.top/fy，在Z轴方向平移0（因为我们不涉及3D）&#8221;的变换信息的矩阵。<br>D3DXMatrixScaling(&amp;ptransform3,fx,fy,1.0f);这句将ptransform3这个矩阵改变成记录了&#8220;X轴拉伸比例为fx,Y轴拉伸比例为fy,Z轴拉伸比例为1.0（因为我们不涉及3D）&#8221;的变换信息的矩阵。<br>D3DXMatrixMultiply(&amp;ptransform4,&amp;ptransform2,&amp;ptransform3);这句便是矩阵乘法了，将ptransform2*ptransform3的结果存入ptransform4中。<br>接下来的一句就是将目前的和原始的变换矩阵相乘。<br>pSprite-&gt;SetTransform(&amp;ptransform4);这句将ptransform4变换矩阵设置成坐标系。<br>pSprite-&gt;Draw(TexturePool[findTexture(whichone)],&amp;srcRect,NULL,NULL,color);Draw函数的原型已经介绍过了，其中的pCenter参数传入NULL，因为pCenter大多用到的地方是在3D里，咱不用关心。而pPosition传入NULL是因为咱们前面已经变换过了坐标系，只用直接在原点绘制出来就好了。findTexture(whichone)是一个需要自己写的函数，具体就是传入文件名路径，然后返回值是这个文件在纹理池中的索引。若此纹理不存在于纹理池中便重新加载一张纹理然后返回索引。<br>最后一句将坐标系还原。<br><br>于是这个就解释完了。那么留下的问题就是所谓的变换矩阵。矩阵就不解释了。变换矩阵就是可以通过矩阵乘法来将你的坐标变换至目标坐标，这样利用矩阵乘法十分方便快捷，效率很高。<br>3D里的矩阵变换是由一个1行4列矩阵（点(x0,x1,x2)），以及一个4行4行矩阵（变换矩阵）的矩阵乘法组成，是这样的（这里矩阵只以3*3为例，意在表现矩阵乘法）：<br><img height=80 alt="" src="http://www.cppblog.com/images/cppblog_com/ck985/Direct3D_2D1.jpg" width=399 border=0><br><br>其中(x0,x1,x2)是原始点，(y0,y1,y2)是最终得出的目标点。变换信息存储于矩阵中，由矩阵乘法得出结果。而实际根据变换不同需要的变换矩阵也不同。下面介绍一下3D中常用的变换矩阵（请注意矩阵表示方法，上面那图是从上到下，下面的是从左往右）：<br>1、平移变换<br><img height=110 alt="" src="http://www.cppblog.com/images/cppblog_com/ck985/Direct3D_2D2.jpg" width=241 border=0><br>这个变换需要4乘4的变换矩阵，如上图所示，其得出的结果便是(x,y,z)平移(Tx,Ty,Tz)得到的坐标。<br>过程名：D3DXMatrixTranslation<br><br>2、伸缩变换<br><img height=114 alt="" src="http://www.cppblog.com/images/cppblog_com/ck985/Direct3D_2D3.jpg" width=237 border=0><br>结果是(x,y,z)在X轴方向伸缩比例Sx，Y轴方向伸缩比例Sy，Z轴方向伸缩比例Sz得到的坐标。<br>过程名：D3DXMatrixScaling<br><br>3、旋转变换<br><br>旋转变换分为3种：绕X轴，绕Y轴，绕Z轴。图示分别如下：<br>X轴：<img height=105 alt="" src="http://www.cppblog.com/images/cppblog_com/ck985/Direct3D_2D4.jpg" width=275 border=0><br>Y轴：<img height=104 alt="" src="http://www.cppblog.com/images/cppblog_com/ck985/Direct3D_2D5.jpg" width=275 border=0><br>Z轴：<img height=105 alt="" src="http://www.cppblog.com/images/cppblog_com/ck985/Direct3D_2D6.jpg" width=274 border=0><br>结果是(x,y,z)绕X轴或Y轴或Z轴旋转角度&#952;（弧度制）<br>过程名：D3DXMatrixRotationX D3DXMatrixRotationY D3DXMatrixRotationZ<br><br>咱使用中只要忽略Z轴，便可达到想达到的变换效果。<br><br>再说一下所谓的渲染颜色<br>D3DCOLOR是由4个部分组成的：A(alpha,透明值)以及RGB(Red,Green&amp;Blue)，<br>这个值指定了纹理中A、R、G、B的表现程度<br>下面我们用半透明的灰色来遮住一张图看看效果：<br>原图：<br><img height=400 alt="" src="http://www.cppblog.com/images/cppblog_com/ck985/Direct3D_2D7.jpg" width=171 border=0><br><br>用color (255,50,50,50)绘制了以后的效果：<br><img height=399 alt="" src="http://www.cppblog.com/images/cppblog_com/ck985/Direct3D_2D8.jpg" width=169 border=0><br>也就是所有颜色的&#8220;表现力&#8221;从255变成50了<br><br>若用(255,0,255,255)绘制了以后，红色部分就无法表现出来了：<br><img height=400 alt="" src="http://www.cppblog.com/images/cppblog_com/ck985/Direct3D_2D9.jpg" width=170 border=0><br><br>若是ALPHA值低一点，会变得透明。<br><br>这些所有的了解了后，你就可以画图了！注意，因为Direct3D中存储的纹理长宽必须是2的方幂的。因为这样对硬件加速方面很有帮助（咱不需要了解）。咱把到目前为止的代码全部打包发出来一下，代码里也有注释的，汝研究一下便可以领会透彻。<br><br>代码下载地址（工程文件属于Visual Sutio 2008，若汝的VS版本过低，请网上百度一下VS工程转换器）：<br><a href="http://www.cppblog.com/Files/CK985/Direct3D_2D.rar">/Files/CK985/Direct3D_2D.rar</a><br><br>里面的工程咱都是调制出来的，编译运行没问题，会在800*600的窗口里画出上面那张原图。代码里面除了今天讲的绘制纹理方面，也有文字的绘制，还有一些其他的东西，都是为了使之运行更完美。汝可对比一下空的EmptyProject和咱写的。<br><br>那今天就到这里了。有不懂的可以回帖，也可以单独联系我QQ670188680。<br>下篇：Direct3D中的简单2D绘制（下）——文字的绘制以及为了GAL GAME而完善的框架。 
<img src ="http://www.cppblog.com/CK985/aggbug/92747.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/CK985/" target="_blank">CK</a> 2009-08-10 00:35 <a href="http://www.cppblog.com/CK985/archive/2009/08/10/92747.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DXUT工作模式的简单解析-底层框架</title><link>http://www.cppblog.com/CK985/archive/2009/06/07/86989.html</link><dc:creator>CK</dc:creator><author>CK</author><pubDate>Sun, 07 Jun 2009 07:43:00 GMT</pubDate><guid>http://www.cppblog.com/CK985/archive/2009/06/07/86989.html</guid><wfw:comment>http://www.cppblog.com/CK985/comments/86989.html</wfw:comment><comments>http://www.cppblog.com/CK985/archive/2009/06/07/86989.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/CK985/comments/commentRss/86989.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/CK985/services/trackbacks/86989.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: DXUT工作模式的简单解析。即Direct3D的一个底层框架。因为是现成的东西，所以适合入门的朋友。看了后，肯定会跃跃欲试地做点东西出来吧。&nbsp;&nbsp;<a href='http://www.cppblog.com/CK985/archive/2009/06/07/86989.html'>阅读全文</a><img src ="http://www.cppblog.com/CK985/aggbug/86989.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/CK985/" target="_blank">CK</a> 2009-06-07 15:43 <a href="http://www.cppblog.com/CK985/archive/2009/06/07/86989.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Air.</title><link>http://www.cppblog.com/CK985/archive/2009/06/07/86979.html</link><dc:creator>CK</dc:creator><author>CK</author><pubDate>Sun, 07 Jun 2009 06:02:00 GMT</pubDate><guid>http://www.cppblog.com/CK985/archive/2009/06/07/86979.html</guid><wfw:comment>http://www.cppblog.com/CK985/comments/86979.html</wfw:comment><comments>http://www.cppblog.com/CK985/archive/2009/06/07/86979.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/CK985/comments/commentRss/86979.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/CK985/services/trackbacks/86979.html</trackback:ping><description><![CDATA[Key社的催泪作品之一-《AIR》<br>不需要更多的语言。只是想放在这里提起一下<br><br>里面的一首歌《青空》，LIA唱的，更不需要语言了，歌词贴出来吧<br><br>[ti:青空(蓝天)]<br>[ar: L i a]<br>[al:KEY-AIR]<br>[00:00.01]「青空（蓝天）」<br>[00:00.03]作词：KEY<br>[00:00.05]作曲：KEY<br>[00:00.07]编曲：折户伸治<br>[00:00.09]演唱：Lia<br>[00:00.11]<br>[00:00.62]あの海<br>[00:01.12](那片海洋)<br>[00:03.65]どこまでも<br>[00:04.15](无边无际)<br>[00:07.28]青かった<br>[00:07.78](深远湛蓝)<br>[00:10.94]遠くまで<br>[00:11.44](直到远方)<br>[00:14.98]あの道<br>[00:15.48](那条道路)<br>[00:18.40]どこまでも<br>[00:18.90](无限延伸)<br>[00:22.31]つづいてた<br>[00:22.81](笔直延续)<br>[00:25.59]まっすぐに<br>[00:26.09](直到远方)<br>[00:29.69]一番早く素直に笑った者胜ち<br>[00:30.10](『最早老實笑的人贏』 )<br>[00:44.07]一番　好きな　あの人<br>[00:44.57](我最 喜歡 的人)<br>[00:52.78]笑ってる<br>[00:53.28](笑著說)<br>[01:03.01]出れよりも&nbsp; 遠くに行っても<br>[01:03.51](即使我比任何人都远离这儿)<br>[01:09.89]ここからまた&nbsp; 笑って切れる<br>[01:10.39](他仍会在这里对我微笑)<br>[01:17.82]瞳を閉じれば<br>[01:18.32](闭上双眼)<br>[01:23.13]ふっと夏の日&nbsp; のにおい<br>[01:23.63](就能闻到夏天 阳光的气息)<br>[01:36.37]あの川<br>[01:36.87](那条小河)<br>[01:39.51]遊んでる<br>[01:40.01](嬉戏的)<br>[01:43.19]二人きり<br>[01:43.69](两人)<br>[01:46.93]泥だらけ<br>[01:47.43](满身泥巴)<br>[01:51.06]あの雲<br>[01:51.56](那朵云彩)<br>[01:54.23]追っている<br>[01:54.73](只要追到)<br>[01:57.90]届いたら<br>[01:58.40](就会得到)<br>[02:01.62]幸せと<br>[02:02.12](幸福)<br>[02:05.63]一番早くこの坂　のぼった　もの勝ち<br>[02:06.13](『最早登上那座山的人贏』)<br>[02:19.88]一番好きなあの場所<br>[02:20.38](向我最喜欢的地方)<br>[02:28.53]目指して<br>[02:29.50](前进)<br>[02:38.83]たくさんの思い出がある<br>[02:39.33](有着太多太多的回忆)<br>[02:45.70]ほかには 何もいらないぐらい<br>[02:46.20](不需要其它的任何东西)<br>[02:53.45]瞳を閉じれば<br>[02:53.95](闭上双眼)<br>[02:58.96]すぐあの海&nbsp; のにおい<br>[02:59.46](就能闻到海洋 的气息)<br>[03:09.23]また夏が来る<br>[03:09.73](夏天再次到来)<br>[03:16.99]銀色に光る<br>[03:17.49](银色的光芒)<br>[03:24.52]水面に映す<br>[03:25.02](映照在水面)<br>[03:32.03]二人ぶんの影<br>[03:32.53](两人的倒影)<br>[03:42.55]出れよりも&nbsp; 遠くに行っても<br>[03:43.05](即使我比任何人都远离这儿)<br>[03:49.28]ここからまた&nbsp; 笑って切れる<br>[03:49.78](他仍会在这里对我微笑)<br>[03:57.28]瞳を閉じれば<br>[03:57.78](闭上双眼)<br>[04:02.76]ふっとあの日の青空<br>[04:03.26](就能见到当日的 那片蓝天)<br>[05:10.36]『END』
<img src ="http://www.cppblog.com/CK985/aggbug/86979.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/CK985/" target="_blank">CK</a> 2009-06-07 14:02 <a href="http://www.cppblog.com/CK985/archive/2009/06/07/86979.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CTSC、APIO以及四川省信息学省队选拔赛总结</title><link>http://www.cppblog.com/CK985/archive/2009/05/30/86190.html</link><dc:creator>CK</dc:creator><author>CK</author><pubDate>Sat, 30 May 2009 10:30:00 GMT</pubDate><guid>http://www.cppblog.com/CK985/archive/2009/05/30/86190.html</guid><wfw:comment>http://www.cppblog.com/CK985/comments/86190.html</wfw:comment><comments>http://www.cppblog.com/CK985/archive/2009/05/30/86190.html#Feedback</comments><slash:comments>16</slash:comments><wfw:commentRss>http://www.cppblog.com/CK985/comments/commentRss/86190.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/CK985/services/trackbacks/86190.html</trackback:ping><description><![CDATA[&nbsp;
<p><span>在五月份里我们参加了三场大比赛——</span><span>CTSC</span><span>、</span><span>APIO</span><span>以及省选。在这段时间里，我学到了很多东西，也意识到自己还有很多不足。以下是我对自己这三场比赛的总结。</span></p>
<p><strong><span>CTSC</span></strong><strong><span>：</span></strong><strong></strong></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>传说中的中国信息学国家队选拔赛，果然不是一般的难。在北大的未名湖畔，认识了许多传说中的神牛——漆子超、高逸涵、金斌，还有很多很多。跟各个省的选手们交流后，交了许多新的朋友，也发现自己与他们的差距还有很大，还需要很多的努力才行。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>具体来说试题的话，确实难度对于我来说，太大了，没有一道题能够想出正确的算法。于是只能骗分。一试中第二题提交答案用了很歪的模拟退火算法拿到了很低的分数——</span><span>8</span><span>分，第一题的裸搜拿了</span><span>20</span><span>分，第三题裸搜都不会写，于是一试就只有</span><span>28</span><span>分了，这与其它人的差距实在是太大了。第二试状态更是低迷，拿到第二题的游戏题就开始深入思考，浪费了大量的时间，结果也只用效果很不好的</span><span>A*</span><span>算法拿到了可怜的</span><span>20</span><span>分，而一、三题已经没有时间做了。于是最后，与</span><span>CTSC</span><span>奖牌无缘。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>总的来说，要找借口的话，</span><span>CTSC</span><span>对于现在的我来说实在是太难了。但是客观来说，自己的不足已经得到充分的体现。我要走的路还有很远很远。</span></p>
<p>&nbsp;</p>
<p><strong><span>APIO</span></strong><strong><span>：</span></strong><strong></strong></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>APIO</span><span>在天大举行。因为</span><span>CTSC</span><span>的失利，自己也不怎么提劲。到了后的那个晚上，跟同学们也谈了很多话，意识到自己懊恼也不行，还不如认真准备下一堂考试。于是第二天早上就匆匆上场了。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>回头看来，考试中我策略失误非常大。第一题知道的动态规划，可是就是想不出来，于是看到了第二题，发现第一问自己会做，便匆匆开始写代码。解决第一问以后，突然发现自己的算法还不能解决第二个问题，这时便着了慌，还是沿着以前的思路往下想，结果越想越糊涂，到最后只剩一个小时的时候也没解决，才匆忙裸了第一题和第三题。考完了下来，心情极度郁闷，就在宿舍里呆着。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>成绩下来后，发现自己居然爆了零。虽然后来才知道是因为自己没有把程序放在本地文件夹里导致本地评测失败，不过那时还是十分沮丧。后来虽然得知自己是铜牌，不过也没有多少价值了。总之</span><span>APIO</span><span>还是以失败收场了。</span></p>
<p>&nbsp;</p>
<p><strong><span>省选：</span></strong><strong></strong></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>经过两场大赛后，严重意识到了自己的不足，于是回来后还是认真地学习。不过留给我的时间也不多了，</span><span>23</span><span>号就省选了。成功意味着我可以继续搞</span><span>OI</span><span>，冲高端。可是失败也意味着，我的</span><span>OI</span><span>生涯到</span><span>8</span><span>月份就结束了。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>比赛中，我也非常紧张。连第一题的算法也只是第四小时想出来的，而后面两道题就根本没有头绪。第二题是数学题，数学不好的我也挂掉了。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>于是，加上冬令营的分数，我以和第五名</span><span>105</span><span>分的分差华丽地排在了第七名，被淘汰了，差点连正式观摩队也无法进入。这也意味着，在</span><span>8</span><span>月份点招了后，就光荣地退役了。回顾短暂的以</span><span>OIer</span><span>的身份而努力的时间，发现自己其实也有很多进步与收获，而更多的，是自己的不足。</span></p>
<p>&nbsp;</p>
<p><strong><span>今后：</span></strong><strong></strong></p>
<span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>最后两个月的</span><span>OI</span><span>生涯，我会规范自己的行为，认真努力地学习，弥补自己的不足。具体的不足是数学、代码的熟练度、以及灵活的数学建模。今后，我会在老师和骆可强的帮助下，提高自己的能力，在最后的</span><span>6</span><span>题中拿下辉煌的成绩，然后光荣退役。<br></span>
<img src ="http://www.cppblog.com/CK985/aggbug/86190.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/CK985/" target="_blank">CK</a> 2009-05-30 18:30 <a href="http://www.cppblog.com/CK985/archive/2009/05/30/86190.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>省选前一天</title><link>http://www.cppblog.com/CK985/archive/2009/05/22/85330.html</link><dc:creator>CK</dc:creator><author>CK</author><pubDate>Fri, 22 May 2009 00:42:00 GMT</pubDate><guid>http://www.cppblog.com/CK985/archive/2009/05/22/85330.html</guid><wfw:comment>http://www.cppblog.com/CK985/comments/85330.html</wfw:comment><comments>http://www.cppblog.com/CK985/archive/2009/05/22/85330.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/CK985/comments/commentRss/85330.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/CK985/services/trackbacks/85330.html</trackback:ping><description><![CDATA[四川省信息学省队选拔赛明天就要开始了<br><br>虽然从进入省集训队以来感觉没什么进展，不过不可思议的是自己居然不怎么紧张。<br><br>反正现在想的是，只要跨进省队就好了，管它踩门槛还是第一名<br><br>本想写篇稍微看得过去的随笔，不过还是等省选完了再来JJYY吧
<img src ="http://www.cppblog.com/CK985/aggbug/85330.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/CK985/" target="_blank">CK</a> 2009-05-22 08:42 <a href="http://www.cppblog.com/CK985/archive/2009/05/22/85330.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>