﻿<?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++博客-小明思考-随笔分类-Game Development</title><link>http://www.cppblog.com/sandy/category/769.html</link><description>高性能服务器端计算</description><language>zh-cn</language><lastBuildDate>Thu, 13 Apr 2017 01:19:39 GMT</lastBuildDate><pubDate>Thu, 13 Apr 2017 01:19:39 GMT</pubDate><ttl>60</ttl><item><title>黑白棋算法设计</title><link>http://www.cppblog.com/sandy/archive/2012/09/20/191377.html</link><dc:creator>小明</dc:creator><author>小明</author><pubDate>Thu, 20 Sep 2012 04:50:00 GMT</pubDate><guid>http://www.cppblog.com/sandy/archive/2012/09/20/191377.html</guid><wfw:comment>http://www.cppblog.com/sandy/comments/191377.html</wfw:comment><comments>http://www.cppblog.com/sandy/archive/2012/09/20/191377.html#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://www.cppblog.com/sandy/comments/commentRss/191377.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sandy/services/trackbacks/191377.html</trackback:ping><description><![CDATA[<div><h2>介绍</h2>黑白棋，又叫反棋（Reversi）、奥赛罗棋（Othello）、苹果棋或翻转棋。黑白棋在西方和日本很流行。游戏通过相互翻转对方的棋子，最后以棋盘 上谁的棋子多来判断胜负。它的游戏规则简单，因此上手很容易，但是它的变化又非常复杂。有一种说法是：只需要几分钟学会它，却需要一生的时间去精通它。</div><br /><div>黑白棋的棋盘是一个有8*8方格的棋盘。下棋时将棋下在空格中间，而不是像<a target="_blank" href="http://baike.baidu.com/view/1534.htm">围棋</a>一样下在交叉点上。开始时在棋盘正中有两白两黑四个棋子交叉放置，黑棋总是先下子。 　　<strong><br /><br />下子的方法：</strong>把自己颜色的棋子放在棋盘的空格上，而当自己放下的棋子在横、竖、斜八个方向内有一个自己的棋子，则被夹在中间的全部翻转会成为自己的棋子。并且，只有在可以翻转棋子的地方才可以下子。<br /><br /><h2>估价函数</h2><div>黑白棋中最重要的是电脑对局势的判断，如何写好这样的估价函数是黑白棋人工智能程序的重点。<br /><br />所谓的&#8220;金角银边草肚皮&#8221;,说明了子的位置的重要性是不同的。最最要的点是四个角，而和角相邻的三个点，则是不应该占领的，其次是四条边，占领后的好处也很多。<br /><br />当然了除了子的位置，自由度也比较重要。<div>你的目标是限制对手的自由度（即棋步数量），同时增加自己的自由度</div></div></div><br /><div><img src="data:image/png;base64,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" alt="" /><br /><br /><br /><h2>搜索算法</h2><p>如果只是凭估价函数来走棋，是很难赢的，好的AI必须能够向前看几步，看得越深，棋力就越强。</p><p>这就涉及到博弈树搜索了，最经典是极大极小算法。</p><p>&nbsp;</p><div>Minimax算法常用于棋类等由两方较量的游戏和程序。该算法是一个零总和算法，即一方要在可选的选项中选择将其优势最大化的选择，另一方则选择令对手优势最小化的方法。而开始的时候总和为0。</div>伪代码：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">function</span><span style="color: #000000; ">&nbsp;minimax(node,&nbsp;depth)<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;node&nbsp;is&nbsp;a&nbsp;terminal&nbsp;node&nbsp;or&nbsp;depth&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;the&nbsp;heuristic&nbsp;value&nbsp;of&nbsp;node<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;the&nbsp;adversary&nbsp;is&nbsp;to&nbsp;play&nbsp;at&nbsp;node<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;&#945;&nbsp;:</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&#8734;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;child&nbsp;of&nbsp;node<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#945;&nbsp;:</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;min(&#945;,&nbsp;minimax(child,&nbsp;depth</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">))<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;{we&nbsp;are&nbsp;to&nbsp;play&nbsp;at&nbsp;node}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;&#945;&nbsp;:</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&#8734;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;child&nbsp;of&nbsp;node<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#945;&nbsp;:</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;max(&#945;,&nbsp;minimax(child,&nbsp;depth</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">))<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;&#945;</span></div><p>&nbsp;</p><p><br /></p><h2>实现<br /></h2><p>&nbsp;</p><div>用javascript和html5写了一个黑白棋，实现了人机对战，有还不错的智能， 我自己已经很难下赢了。<br /> <br /> 请用chrome或者firefox打开，chrome的javascript性能更好～<br /> <br /> 演示地址: &nbsp;<a href="https://yshan.github.io/othello/"><span style="font-size: 18pt; color: red;">https://yshan.github.io/othello/</span></a></div><br /><p>&nbsp;</p><p><br /></p></div><img src ="http://www.cppblog.com/sandy/aggbug/191377.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sandy/" target="_blank">小明</a> 2012-09-20 12:50 <a href="http://www.cppblog.com/sandy/archive/2012/09/20/191377.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>D3D练习---动态铁轨</title><link>http://www.cppblog.com/sandy/archive/2007/05/05/23426.html</link><dc:creator>小明</dc:creator><author>小明</author><pubDate>Fri, 04 May 2007 23:55:00 GMT</pubDate><guid>http://www.cppblog.com/sandy/archive/2007/05/05/23426.html</guid><wfw:comment>http://www.cppblog.com/sandy/comments/23426.html</wfw:comment><comments>http://www.cppblog.com/sandy/archive/2007/05/05/23426.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/sandy/comments/commentRss/23426.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sandy/services/trackbacks/23426.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: D3D的摄像机动画&nbsp;&nbsp;<a href='http://www.cppblog.com/sandy/archive/2007/05/05/23426.html'>阅读全文</a><img src ="http://www.cppblog.com/sandy/aggbug/23426.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sandy/" target="_blank">小明</a> 2007-05-05 07:55 <a href="http://www.cppblog.com/sandy/archive/2007/05/05/23426.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>D3d实现2d效果(2)--鼠标画线</title><link>http://www.cppblog.com/sandy/archive/2007/05/04/23398.html</link><dc:creator>小明</dc:creator><author>小明</author><pubDate>Fri, 04 May 2007 05:33:00 GMT</pubDate><guid>http://www.cppblog.com/sandy/archive/2007/05/04/23398.html</guid><wfw:comment>http://www.cppblog.com/sandy/comments/23398.html</wfw:comment><comments>http://www.cppblog.com/sandy/archive/2007/05/04/23398.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sandy/comments/commentRss/23398.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sandy/services/trackbacks/23398.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: D3D的画线能力&nbsp;&nbsp;<a href='http://www.cppblog.com/sandy/archive/2007/05/04/23398.html'>阅读全文</a><img src ="http://www.cppblog.com/sandy/aggbug/23398.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sandy/" target="_blank">小明</a> 2007-05-04 13:33 <a href="http://www.cppblog.com/sandy/archive/2007/05/04/23398.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>D3d实现2d效果(1)--动态星空</title><link>http://www.cppblog.com/sandy/archive/2007/05/04/23395.html</link><dc:creator>小明</dc:creator><author>小明</author><pubDate>Fri, 04 May 2007 04:19:00 GMT</pubDate><guid>http://www.cppblog.com/sandy/archive/2007/05/04/23395.html</guid><wfw:comment>http://www.cppblog.com/sandy/comments/23395.html</wfw:comment><comments>http://www.cppblog.com/sandy/archive/2007/05/04/23395.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sandy/comments/commentRss/23395.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sandy/services/trackbacks/23395.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: D3D的画点能力&nbsp;&nbsp;<a href='http://www.cppblog.com/sandy/archive/2007/05/04/23395.html'>阅读全文</a><img src ="http://www.cppblog.com/sandy/aggbug/23395.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sandy/" target="_blank">小明</a> 2007-05-04 12:19 <a href="http://www.cppblog.com/sandy/archive/2007/05/04/23395.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>五子连珠</title><link>http://www.cppblog.com/sandy/archive/2006/05/12/7029.html</link><dc:creator>小明</dc:creator><author>小明</author><pubDate>Fri, 12 May 2006 08:19:00 GMT</pubDate><guid>http://www.cppblog.com/sandy/archive/2006/05/12/7029.html</guid><wfw:comment>http://www.cppblog.com/sandy/comments/7029.html</wfw:comment><comments>http://www.cppblog.com/sandy/archive/2006/05/12/7029.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/sandy/comments/commentRss/7029.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sandy/services/trackbacks/7029.html</trackback:ping><description><![CDATA[很久以前写的五子棋代码(Use MFC)，支持人机对战，发上来玩玩<br /><br />source:   <a href="/Files/sandy/Five_src.rar">http://www.cppblog.com/Files/sandy/Five_src.rar</a><br /><br />bin:   <a href="/Files/sandy/Five_bin.rar">http://www.cppblog.com/Files/sandy/Five_bin.rar</a><br /><br /><br />picture:<br /><br /><img height="552" alt="chess.jpg" src="http://www.cppblog.com/images/cppblog_com/sandy/chess.jpg" width="512" border="0" /><img src ="http://www.cppblog.com/sandy/aggbug/7029.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sandy/" target="_blank">小明</a> 2006-05-12 16:19 <a href="http://www.cppblog.com/sandy/archive/2006/05/12/7029.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用SDL写游戏</title><link>http://www.cppblog.com/sandy/archive/2005/12/28/2219.html</link><dc:creator>小明</dc:creator><author>小明</author><pubDate>Wed, 28 Dec 2005 13:32:00 GMT</pubDate><guid>http://www.cppblog.com/sandy/archive/2005/12/28/2219.html</guid><wfw:comment>http://www.cppblog.com/sandy/comments/2219.html</wfw:comment><comments>http://www.cppblog.com/sandy/archive/2005/12/28/2219.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.cppblog.com/sandy/comments/commentRss/2219.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sandy/services/trackbacks/2219.html</trackback:ping><description><![CDATA[<STRONG>SDL(</STRONG><FONT face=Verdana><STRONG>Simple DirectMedia Layer)是</STRONG>一个跨平台的multimedia library ,包含了对video,audio,keyboard,mouse的支持。<BR>它的接口比较简洁，你甚至不需要知道Win32 API,就可以写出游戏来。它封装了跟<BR>平台相关的部分。它使我想起了TC下面的graphics BGI<BR><BR>官方地址:&nbsp;&nbsp;&nbsp;<A href="http://www.libsdl.org/">http://www.libsdl.org/</A><BR><BR>下面是我用SDL写的一个小游戏<BR><IMG height=505 alt=run.jpg src="http://www.cppblog.com/images/cppblog_com/sandy/run.jpg" width=406 border=0><BR><BR><BR><STRONG>1.骨架程序</STRONG><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"><SPAN style="COLOR: #000000">#include&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">sdl.h</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000"><BR>#pragma&nbsp;comment(lib,</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">sdl.lib</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">)<BR>#pragma&nbsp;comment(lib,</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">sdlmain.lib</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">)<BR><BR></SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;main(</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;argc,</SPAN><SPAN style="COLOR: #0000ff">char</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">**</SPAN><SPAN style="COLOR: #000000">&nbsp;argv)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">Init&nbsp;SDL</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;SDL_Init(&nbsp;SDL_INIT_VIDEO&nbsp;);<BR>&nbsp;&nbsp;&nbsp;&nbsp;atexit(SDL_Quit);<BR>&nbsp;&nbsp;&nbsp;&nbsp;screen&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;SDL_SetVideoMode(</SPAN><SPAN style="COLOR: #000000">400</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">480</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">,SDL_SWSURFACE);<BR>&nbsp;&nbsp;&nbsp;&nbsp;SDL_WM_SetCaption(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">RUN</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,NULL);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">load&nbsp;resource<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000"><IMG src="http://www.cppblog.com/images/dot.gif"></SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">bool</SPAN><SPAN style="COLOR: #000000">&nbsp;pause&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">false</SPAN><SPAN style="COLOR: #000000">;<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">bool</SPAN><SPAN style="COLOR: #000000">&nbsp;gone&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">true</SPAN><SPAN style="COLOR: #000000">;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;SDL_Event&nbsp;</SPAN><SPAN style="COLOR: #0000ff">event</SPAN><SPAN style="COLOR: #000000">;<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">while</SPAN><SPAN style="COLOR: #000000">(gone)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">(SDL_PollEvent(</SPAN><SPAN style="COLOR: #000000">&amp;</SPAN><SPAN style="COLOR: #0000ff">event</SPAN><SPAN style="COLOR: #000000">)</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #0000ff">event</SPAN><SPAN style="COLOR: #000000">.type&nbsp;</SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000">&nbsp;SDL_QUIT)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">break</SPAN><SPAN style="COLOR: #000000">;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">else</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #0000ff">event</SPAN><SPAN style="COLOR: #000000">.type&nbsp;</SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000">&nbsp;SDL_KEYDOWN)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">handle&nbsp;event<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000"><IMG src="http://www.cppblog.com/images/dot.gif"></SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">else</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #0000ff">event</SPAN><SPAN style="COLOR: #000000">.type&nbsp;</SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000">&nbsp;SDL_KEYUP)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">handle&nbsp;event<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000"><IMG src="http://www.cppblog.com/images/dot.gif"></SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">else</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #000000">!</SPAN><SPAN style="COLOR: #000000">pause)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;run();&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">release&nbsp;resource<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000"><IMG src="http://www.cppblog.com/images/dot.gif"></SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">;<BR>}<BR><BR></SPAN></DIV></FONT><BR>SDL_Init : 初始化子系统<BR>SDL_SetVideoMode：设置分辨率<BR>SDL_WM_SetCaption: 设置窗口标题<BR>SDL_PollEvent：查询事件，用户的输入<BR><BR><STRONG>2.表面的概念</STRONG><BR><BR>表面(SDL_Surface)是SDL中一个重要的概念，精灵都是保存在表面中<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"><SPAN style="COLOR: #000000">SDL_Surface&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">&nbsp;temp&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;SDL_CreateRGBSurface(SDL_SRCCOLORKEY,&nbsp;w,&nbsp;h,&nbsp;</SPAN><SPAN style="COLOR: #000000">32</SPAN><SPAN style="COLOR: #000000">,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>rc.x&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;x&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">&nbsp;w&nbsp;;<BR>rc.y&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;y&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">&nbsp;h;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>SDL_BlitSurface(surf,</SPAN><SPAN style="COLOR: #000000">&amp;</SPAN><SPAN style="COLOR: #000000">rc,temp,</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>SDL_SetColorKey(temp,SDL_SRCCOLORKEY,transcolor);</SPAN></DIV><BR>SDL_CreateRGBSurface 创建一个表面<BR>SDL_BlitSurface 表面之间的copy<BR>SDL_SetColorKey 设定表面的透明色<BR><BR>ps:主表面是由SDL_SetVideoMode返回的，也可以通过<A href="file:///D:/SDL-1.2.8/docs/html/sdlgetvideosurface.html">SDL_GetVideoSurface</A>查询到<BR><BR><STRONG>3. 声音的使用</STRONG><BR><BR>游戏离不开声音,SDL也提供了支持<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"><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;play_sound(</SPAN><SPAN style="COLOR: #0000ff">const</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">char</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">file)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;index;<BR>&nbsp;&nbsp;&nbsp;&nbsp;SDL_AudioSpec&nbsp;wave;<BR>&nbsp;&nbsp;&nbsp;&nbsp;Uint8&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">data;<BR>&nbsp;&nbsp;&nbsp;&nbsp;Uint32&nbsp;dlen;<BR>&nbsp;&nbsp;&nbsp;&nbsp;SDL_AudioCVT&nbsp;cvt;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000">&nbsp;寻找一个空的（或者完成了的）音频口&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">for</SPAN><SPAN style="COLOR: #000000">&nbsp;(&nbsp;index</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">;&nbsp;index</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">NUM_SOUNDS;&nbsp;</SPAN><SPAN style="COLOR: #000000">++</SPAN><SPAN style="COLOR: #000000">index&nbsp;)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(&nbsp;sounds[index].dpos&nbsp;</SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000">&nbsp;sounds[index].dlen&nbsp;)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">break</SPAN><SPAN style="COLOR: #000000">;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(&nbsp;index&nbsp;</SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000">&nbsp;NUM_SOUNDS&nbsp;)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000">&nbsp;加载声音文件，并转换成16位、立体声、22kHz格式&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(&nbsp;SDL_LoadWAV(file,&nbsp;</SPAN><SPAN style="COLOR: #000000">&amp;</SPAN><SPAN style="COLOR: #000000">wave,&nbsp;</SPAN><SPAN style="COLOR: #000000">&amp;</SPAN><SPAN style="COLOR: #000000">data,&nbsp;</SPAN><SPAN style="COLOR: #000000">&amp;</SPAN><SPAN style="COLOR: #000000">dlen)&nbsp;</SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000">&nbsp;NULL&nbsp;)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">无法加载&nbsp;%s:&nbsp;%s\n</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,&nbsp;file,&nbsp;SDL_GetError());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;SDL_BuildAudioCVT(</SPAN><SPAN style="COLOR: #000000">&amp;</SPAN><SPAN style="COLOR: #000000">cvt,&nbsp;wave.format,&nbsp;wave.channels,&nbsp;wave.freq,<BR>&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;AUDIO_S16,&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">2</SPAN><SPAN style="COLOR: #000000">,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">22050</SPAN><SPAN style="COLOR: #000000">);<BR>&nbsp;&nbsp;&nbsp;&nbsp;cvt.buf&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;(unsigned&nbsp;</SPAN><SPAN style="COLOR: #0000ff">char</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">)malloc(dlen</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">cvt.len_mult);<BR>&nbsp;&nbsp;&nbsp;&nbsp;memcpy(cvt.buf,&nbsp;data,&nbsp;dlen);<BR>&nbsp;&nbsp;&nbsp;&nbsp;cvt.len&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;dlen;<BR>&nbsp;&nbsp;&nbsp;&nbsp;SDL_ConvertAudio(</SPAN><SPAN style="COLOR: #000000">&amp;</SPAN><SPAN style="COLOR: #000000">cvt);<BR>&nbsp;&nbsp;&nbsp;&nbsp;SDL_FreeWAV(data);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000">&nbsp;将音频数据放入音频口（立刻开始回放了）&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(&nbsp;sounds[index].data&nbsp;)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;free(sounds[index].data);<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;SDL_LockAudio();<BR>&nbsp;&nbsp;&nbsp;&nbsp;sounds[index].data&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;cvt.buf;<BR>&nbsp;&nbsp;&nbsp;&nbsp;sounds[index].dlen&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;cvt.len_cvt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;sounds[index].dpos&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">;<BR>&nbsp;&nbsp;&nbsp;&nbsp;SDL_UnlockAudio();<BR>}</SPAN></DIV><BR><STRONG>4.一些有用的模块</STRONG><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"><SPAN style="COLOR: #000000">#include&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">sdl_image.h</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000"><BR><BR></SPAN><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000"><BR>&nbsp;*&nbsp;Return&nbsp;the&nbsp;pixel&nbsp;value&nbsp;at&nbsp;(x,&nbsp;y)<BR>&nbsp;*&nbsp;NOTE:&nbsp;The&nbsp;surface&nbsp;must&nbsp;be&nbsp;locked&nbsp;before&nbsp;calling&nbsp;this!<BR>&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN><SPAN style="COLOR: #000000"><BR>Uint32&nbsp;getpixel(SDL_Surface&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">surface,&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;x,&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;y)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;bpp&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;surface</SPAN><SPAN style="COLOR: #000000">-&gt;</SPAN><SPAN style="COLOR: #000000">format</SPAN><SPAN style="COLOR: #000000">-&gt;</SPAN><SPAN style="COLOR: #000000">BytesPerPixel;<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000">&nbsp;Here&nbsp;p&nbsp;is&nbsp;the&nbsp;address&nbsp;to&nbsp;the&nbsp;pixel&nbsp;we&nbsp;want&nbsp;to&nbsp;retrieve&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;&nbsp;&nbsp;Uint8&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">p&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;(Uint8&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">)surface</SPAN><SPAN style="COLOR: #000000">-&gt;</SPAN><SPAN style="COLOR: #000000">pixels&nbsp;</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">&nbsp;y&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">&nbsp;surface</SPAN><SPAN style="COLOR: #000000">-&gt;</SPAN><SPAN style="COLOR: #000000">pitch&nbsp;</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">&nbsp;x&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">&nbsp;bpp;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">switch</SPAN><SPAN style="COLOR: #000000">(bpp)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">case</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">p;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">case</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">2</SPAN><SPAN style="COLOR: #000000">:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">(Uint16&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">)p;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">case</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">3</SPAN><SPAN style="COLOR: #000000">:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">(SDL_BYTEORDER&nbsp;</SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000">&nbsp;SDL_BIG_ENDIAN)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;p[</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">]&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;&lt;</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">16</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">|</SPAN><SPAN style="COLOR: #000000">&nbsp;p[</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">]&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;&lt;</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">8</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">|</SPAN><SPAN style="COLOR: #000000">&nbsp;p[</SPAN><SPAN style="COLOR: #000000">2</SPAN><SPAN style="COLOR: #000000">];<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">else</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;p[</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">]&nbsp;</SPAN><SPAN style="COLOR: #000000">|</SPAN><SPAN style="COLOR: #000000">&nbsp;p[</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">]&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;&lt;</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">8</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">|</SPAN><SPAN style="COLOR: #000000">&nbsp;p[</SPAN><SPAN style="COLOR: #000000">2</SPAN><SPAN style="COLOR: #000000">]&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;&lt;</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">16</SPAN><SPAN style="COLOR: #000000">;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">case</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">4</SPAN><SPAN style="COLOR: #000000">:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">(Uint32&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">)p;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">default</SPAN><SPAN style="COLOR: #000000">:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000">&nbsp;shouldn't&nbsp;happen,&nbsp;but&nbsp;avoids&nbsp;warnings&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>}<BR><BR><BR></SPAN><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000"><BR>&nbsp;*&nbsp;Set&nbsp;the&nbsp;pixel&nbsp;at&nbsp;(x,&nbsp;y)&nbsp;to&nbsp;the&nbsp;given&nbsp;value<BR>&nbsp;*&nbsp;NOTE:&nbsp;The&nbsp;surface&nbsp;must&nbsp;be&nbsp;locked&nbsp;before&nbsp;calling&nbsp;this!<BR>&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;putpixel(SDL_Surface&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">surface,&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;x,&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;y,&nbsp;Uint32&nbsp;pixel)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;bpp&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;surface</SPAN><SPAN style="COLOR: #000000">-&gt;</SPAN><SPAN style="COLOR: #000000">format</SPAN><SPAN style="COLOR: #000000">-&gt;</SPAN><SPAN style="COLOR: #000000">BytesPerPixel;<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000">&nbsp;Here&nbsp;p&nbsp;is&nbsp;the&nbsp;address&nbsp;to&nbsp;the&nbsp;pixel&nbsp;we&nbsp;want&nbsp;to&nbsp;set&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;&nbsp;&nbsp;Uint8&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">p&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;(Uint8&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">)surface</SPAN><SPAN style="COLOR: #000000">-&gt;</SPAN><SPAN style="COLOR: #000000">pixels&nbsp;</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">&nbsp;y&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">&nbsp;surface</SPAN><SPAN style="COLOR: #000000">-&gt;</SPAN><SPAN style="COLOR: #000000">pitch&nbsp;</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">&nbsp;x&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">&nbsp;bpp;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">switch</SPAN><SPAN style="COLOR: #000000">(bpp)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">case</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">p&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;pixel;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">break</SPAN><SPAN style="COLOR: #000000">;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">case</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">2</SPAN><SPAN style="COLOR: #000000">:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">(Uint16&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">)p&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;pixel;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">break</SPAN><SPAN style="COLOR: #000000">;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">case</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">3</SPAN><SPAN style="COLOR: #000000">:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">(SDL_BYTEORDER&nbsp;</SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000">&nbsp;SDL_BIG_ENDIAN)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p[</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">]&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;(pixel&nbsp;</SPAN><SPAN style="COLOR: #000000">&gt;&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">16</SPAN><SPAN style="COLOR: #000000">)&nbsp;</SPAN><SPAN style="COLOR: #000000">&amp;</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">0xff</SPAN><SPAN style="COLOR: #000000">;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p[</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">]&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;(pixel&nbsp;</SPAN><SPAN style="COLOR: #000000">&gt;&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">8</SPAN><SPAN style="COLOR: #000000">)&nbsp;</SPAN><SPAN style="COLOR: #000000">&amp;</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">0xff</SPAN><SPAN style="COLOR: #000000">;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p[</SPAN><SPAN style="COLOR: #000000">2</SPAN><SPAN style="COLOR: #000000">]&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;pixel&nbsp;</SPAN><SPAN style="COLOR: #000000">&amp;</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">0xff</SPAN><SPAN style="COLOR: #000000">;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</SPAN><SPAN style="COLOR: #0000ff">else</SPAN><SPAN style="COLOR: #000000">&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p[</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">]&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;pixel&nbsp;</SPAN><SPAN style="COLOR: #000000">&amp;</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">0xff</SPAN><SPAN style="COLOR: #000000">;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p[</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">]&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;(pixel&nbsp;</SPAN><SPAN style="COLOR: #000000">&gt;&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">8</SPAN><SPAN style="COLOR: #000000">)&nbsp;</SPAN><SPAN style="COLOR: #000000">&amp;</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">0xff</SPAN><SPAN style="COLOR: #000000">;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p[</SPAN><SPAN style="COLOR: #000000">2</SPAN><SPAN style="COLOR: #000000">]&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;(pixel&nbsp;</SPAN><SPAN style="COLOR: #000000">&gt;&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">16</SPAN><SPAN style="COLOR: #000000">)&nbsp;</SPAN><SPAN style="COLOR: #000000">&amp;</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">0xff</SPAN><SPAN style="COLOR: #000000">;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">break</SPAN><SPAN style="COLOR: #000000">;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">case</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">4</SPAN><SPAN style="COLOR: #000000">:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">(Uint32&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">)p&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;pixel;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">break</SPAN><SPAN style="COLOR: #000000">;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>}<BR><BR></SPAN><SPAN style="COLOR: #0000ff">bool</SPAN><SPAN style="COLOR: #000000">&nbsp;showpic(SDL_Surface&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">surface,</SPAN><SPAN style="COLOR: #0000ff">const</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">char</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">filename)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;SDL_Surface&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">image;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000">&nbsp;Load&nbsp;the&nbsp;BMP&nbsp;file&nbsp;into&nbsp;a&nbsp;surface&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;&nbsp;&nbsp;image&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;IMG_Load(filename);<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(image&nbsp;</SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000">&nbsp;NULL)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Couldn't&nbsp;load&nbsp;%s:&nbsp;%s\n</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,filename,SDL_GetError());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">false</SPAN><SPAN style="COLOR: #000000">;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000">&nbsp;Blit&nbsp;onto&nbsp;the&nbsp;screen&nbsp;surface&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">(SDL_BlitSurface(image,&nbsp;NULL,&nbsp;surface,&nbsp;NULL)&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">BlitSurface&nbsp;error:&nbsp;%s\n</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,&nbsp;SDL_GetError());<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;SDL_UpdateRect(surface,&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">,&nbsp;image</SPAN><SPAN style="COLOR: #000000">-&gt;</SPAN><SPAN style="COLOR: #000000">w,&nbsp;image</SPAN><SPAN style="COLOR: #000000">-&gt;</SPAN><SPAN style="COLOR: #000000">h);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000">&nbsp;Free&nbsp;the&nbsp;allocated&nbsp;BMP&nbsp;surface&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;&nbsp;&nbsp;SDL_FreeSurface(image);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">true</SPAN><SPAN style="COLOR: #000000">;<BR>}<BR><BR>SDL_Surface</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">&nbsp;createsurf(</SPAN><SPAN style="COLOR: #0000ff">const</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">char</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">&nbsp;filename)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;SDL_Surface&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">image;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000">&nbsp;Load&nbsp;the&nbsp;BMP&nbsp;file&nbsp;into&nbsp;a&nbsp;surface&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;&nbsp;&nbsp;image&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;IMG_Load(filename);<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(image&nbsp;</SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000">&nbsp;NULL)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Couldn't&nbsp;load&nbsp;%s:&nbsp;%s\n</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,filename,SDL_GetError());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;image;<BR>}</SPAN></DIV><BR>getpixel 取得像素的颜色<BR>putpixel 画点<BR>showpic 加载一个图片到某个表面<BR>createsurf 从文件中创造表面<BR><BR>SDL有大量的示例和第三方库可以使用，非常的不错<BR>最后推荐一个SDL写的超级玛丽游戏<BR><A href="http://smclone.sourceforge.net/">http://smclone.sourceforge.net/</A><BR><BR><BR><BR><img src ="http://www.cppblog.com/sandy/aggbug/2219.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sandy/" target="_blank">小明</a> 2005-12-28 21:32 <a href="http://www.cppblog.com/sandy/archive/2005/12/28/2219.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>为英雄无敌3写个游戏修改器</title><link>http://www.cppblog.com/sandy/archive/2005/12/19/1872.html</link><dc:creator>小明</dc:creator><author>小明</author><pubDate>Mon, 19 Dec 2005 03:37:00 GMT</pubDate><guid>http://www.cppblog.com/sandy/archive/2005/12/19/1872.html</guid><wfw:comment>http://www.cppblog.com/sandy/comments/1872.html</wfw:comment><comments>http://www.cppblog.com/sandy/archive/2005/12/19/1872.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cppblog.com/sandy/comments/commentRss/1872.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sandy/services/trackbacks/1872.html</trackback:ping><description><![CDATA[我是比较铁杆的英雄无敌3的fans,在网上看到这样的文章：<A href="http://game.china.com/zh_cn/play/10002765/20021113/11362720.html">http://game.china.com/zh_cn/play/10002765/20021113/11362720.html</A><BR><BR>就是让我方英雄学会所有技能，真的蛮爽的<BR>学会28项技能修改法<BR><IMG height=644 alt=heroes3.jpg src="http://www.cppblog.com/images/cppblog_com/sandy/heroes3.jpg" width=806 border=0><BR><BR>　　<FONT size=2>首先，把你的英雄的士兵调到前面几格来，接着用FPE来搜索。例如你的士兵数：第一格3，第二格14，第三格4，那么就用 3，0，14，0，4，0 来搜索，就可以找到地址。显示为： <BR>　　士兵种类－ FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF<BR>　　 FF FF FF FF FF FF FF FF FF FF FF FF 03 00 00 00－士兵数量<BR>　　 0E 00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 <BR>　　 00 00 00 00 00 00 00 00 01 02 03 04 05 06 07 08<BR>　　 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 <BR>　　 25 26 27 28 01 02 03 04 05 06 07 08 00 00 00 00<BR>　　 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <BR>　　 04 00 00 00 00 00 00 00 FF FF FF FF FF FF FF FF<BR>　　 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF<BR>　　 FF或00作为一格，每4格是代表一种属性，物品， 状态等等。前面28格是士兵的种类，接下来28格是士兵的数量。例如: 英雄可带7种士兵，你要每种都是天使，那么把<BR>　　 03 00 00 00 前面的FF FF FF FF 改为0D 00 00 00。 如果你要数量100， 那么把<BR>　　 03 00 00 00 改为64 00 00 00。 士兵的种类是这样分的：00 00 00 00 是枪兵，<BR>　　 01 00 00 00 是 进化一级的枪兵，02 00 00 00 是弓箭手，03 00 00 00 是神箭手。<BR>　　 如此类推。<BR>　　 <BR>　　 从03那一格开始数，28格后就是英雄的技能等级，接着的28格是英雄的技能，<BR>　　 也就是从01到28代表的是英雄的技能等级，技能等级最多只能是3。<BR>　　 01 箭术等级 02 寻路术等级 03 后勤学等级<BR>　　 04 侦察术等级 05 外交术等级 06 航海术等级<BR>　　 07 领导术等级 08 智慧术等级 09 神秘术等级<BR>　　 10 幸运术等级 11 弹道术等级 12 鹰眼术等级<BR>　　 13 招魂术等级 14 理财术等级 15 火系魔法等级<BR>　　 16 气系魔法等级 17 水系魔法等级 18 土系魔法等级<BR>　　 19 学术等级 20 战术等级 21 炮术等级<BR>　　 22 学习能力等级 23 进攻术等级 24 防御术等级 <BR></FONT><BR>但是每次使用FPE真的很麻烦，我又是很懒的人。FPE可以做到的事情，我也可以做到。<BR>其实游戏修改不过是使用<STRONG><FONT color=#0000ff>ReadProcessMemory</FONT></STRONG>和<STRONG><FONT color=#0000ff>WriteProcessMemory</FONT></STRONG><BR><BR>花了半天不断的试验，终于写出一个可以用于英雄无敌3.1版的修改器，没有写界面（I'm lazy-:)），运行之后就是让我方英雄学会所有技能。<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"><SPAN style="COLOR: #000000">#include&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">windows.h</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000"><BR>#include&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">tlhelp32.h</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000"><BR>#include&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">cstdio</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><BR></SPAN><SPAN style="COLOR: #0000ff">const</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">char</SPAN><SPAN style="COLOR: #000000">&nbsp;MODULE_NAME[]&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Heroes3.exe</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;<BR><BR></SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;printError(&nbsp;TCHAR</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">&nbsp;msg&nbsp;)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;eNum;<BR>&nbsp;&nbsp;&nbsp;&nbsp;TCHAR&nbsp;sysMsg[</SPAN><SPAN style="COLOR: #000000">256</SPAN><SPAN style="COLOR: #000000">];<BR>&nbsp;&nbsp;&nbsp;&nbsp;TCHAR</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">&nbsp;p;<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;eNum&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;GetLastError(&nbsp;);<BR>&nbsp;&nbsp;&nbsp;&nbsp;FormatMessage(&nbsp;FORMAT_MESSAGE_FROM_SYSTEM&nbsp;</SPAN><SPAN style="COLOR: #000000">|</SPAN><SPAN style="COLOR: #000000">&nbsp;FORMAT_MESSAGE_IGNORE_INSERTS,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL,&nbsp;eNum,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MAKELANGID(LANG_NEUTRAL,&nbsp;SUBLANG_DEFAULT),&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;Default&nbsp;language</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sysMsg,&nbsp;</SPAN><SPAN style="COLOR: #000000">256</SPAN><SPAN style="COLOR: #000000">,&nbsp;NULL&nbsp;);<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;Trim&nbsp;the&nbsp;end&nbsp;of&nbsp;the&nbsp;line&nbsp;and&nbsp;terminate&nbsp;it&nbsp;with&nbsp;a&nbsp;null</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;sysMsg;<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">while</SPAN><SPAN style="COLOR: #000000">(&nbsp;(&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">p&nbsp;</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">31</SPAN><SPAN style="COLOR: #000000">&nbsp;)&nbsp;</SPAN><SPAN style="COLOR: #000000">||</SPAN><SPAN style="COLOR: #000000">&nbsp;(&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">p&nbsp;</SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">9</SPAN><SPAN style="COLOR: #000000">&nbsp;)&nbsp;)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">++</SPAN><SPAN style="COLOR: #000000">p;<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">do</SPAN><SPAN style="COLOR: #000000">&nbsp;{&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">p</SPAN><SPAN style="COLOR: #000000">--</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">;&nbsp;}&nbsp;</SPAN><SPAN style="COLOR: #0000ff">while</SPAN><SPAN style="COLOR: #000000">(&nbsp;(&nbsp;p&nbsp;</SPAN><SPAN style="COLOR: #000000">&gt;=</SPAN><SPAN style="COLOR: #000000">&nbsp;sysMsg&nbsp;)&nbsp;</SPAN><SPAN style="COLOR: #000000">&amp;&amp;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(&nbsp;(&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">p&nbsp;</SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">.</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">&nbsp;)&nbsp;</SPAN><SPAN style="COLOR: #000000">||</SPAN><SPAN style="COLOR: #000000">&nbsp;(&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">p&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">33</SPAN><SPAN style="COLOR: #000000">&nbsp;)&nbsp;)&nbsp;);<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;Display&nbsp;the&nbsp;message</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;printf(&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">WARNING:&nbsp;%s&nbsp;failed&nbsp;with&nbsp;error&nbsp;%d&nbsp;(%s)\n</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,&nbsp;msg,&nbsp;eNum,&nbsp;sysMsg&nbsp;);<BR>}<BR><BR><BR>DWORD&nbsp;findProcessId(</SPAN><SPAN style="COLOR: #0000ff">const</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">char</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">module)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;result&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">-</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">;<BR>&nbsp;&nbsp;&nbsp;&nbsp;HANDLE&nbsp;hProcessSnap;<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;Take&nbsp;a&nbsp;snapshot&nbsp;of&nbsp;all&nbsp;processes&nbsp;in&nbsp;the&nbsp;system.</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;hProcessSnap&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;CreateToolhelp32Snapshot(&nbsp;TH32CS_SNAPPROCESS,&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">&nbsp;);<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">(&nbsp;hProcessSnap&nbsp;</SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000">&nbsp;INVALID_HANDLE_VALUE&nbsp;)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printError(&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">CreateToolhelp32Snapshot&nbsp;(of&nbsp;processes)</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;result;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;PROCESSENTRY32&nbsp;pe32;<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;Set&nbsp;the&nbsp;size&nbsp;of&nbsp;the&nbsp;structure&nbsp;before&nbsp;using&nbsp;it.</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;pe32.dwSize&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">sizeof</SPAN><SPAN style="COLOR: #000000">(&nbsp;PROCESSENTRY32&nbsp;);<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;Retrieve&nbsp;information&nbsp;about&nbsp;the&nbsp;first&nbsp;process,<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;and&nbsp;exit&nbsp;if&nbsp;unsuccessful</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">(&nbsp;</SPAN><SPAN style="COLOR: #000000">!</SPAN><SPAN style="COLOR: #000000">Process32First(&nbsp;hProcessSnap,&nbsp;</SPAN><SPAN style="COLOR: #000000">&amp;</SPAN><SPAN style="COLOR: #000000">pe32&nbsp;)&nbsp;)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printError(&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Process32First</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;);&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;Show&nbsp;cause&nbsp;of&nbsp;failure</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(&nbsp;hProcessSnap&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;Must&nbsp;clean&nbsp;up&nbsp;the&nbsp;snapshot&nbsp;object!</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;result;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;Now&nbsp;walk&nbsp;the&nbsp;snapshot&nbsp;of&nbsp;processes,&nbsp;and<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;display&nbsp;information&nbsp;about&nbsp;each&nbsp;process&nbsp;in&nbsp;turn</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">do</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">(stricmp(pe32.szExeFile,module)</SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">find&nbsp;process:&nbsp;&nbsp;%s\n</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,&nbsp;module&nbsp;);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;pe32.th32ProcessID;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">break</SPAN><SPAN style="COLOR: #000000">;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</SPAN><SPAN style="COLOR: #0000ff">while</SPAN><SPAN style="COLOR: #000000">(&nbsp;Process32Next(&nbsp;hProcessSnap,&nbsp;</SPAN><SPAN style="COLOR: #000000">&amp;</SPAN><SPAN style="COLOR: #000000">pe32&nbsp;)&nbsp;);<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(&nbsp;hProcessSnap&nbsp;);<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;result;<BR>}<BR><BR></SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;main(</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;argc,</SPAN><SPAN style="COLOR: #0000ff">char</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">argv[])<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;h3pid&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">-</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">;<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;h3pid&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;findProcessId(MODULE_NAME);<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">(h3pid&nbsp;</SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">-</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">can't&nbsp;find&nbsp;%s&nbsp;in&nbsp;memory,please&nbsp;make&nbsp;sure&nbsp;the&nbsp;program&nbsp;started!\n</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,MODULE_NAME);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;HANDLE&nbsp;h3&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;OpenProcess(&nbsp;PROCESS_ALL_ACCESS,&nbsp;FALSE,&nbsp;h3pid&nbsp;);<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">(&nbsp;h3&nbsp;</SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000">&nbsp;NULL&nbsp;)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printError(&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">OpenProcess</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</SPAN><SPAN style="COLOR: #0000ff">long</SPAN><SPAN style="COLOR: #000000">&nbsp;sideOffset</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">0x824994</SPAN><SPAN style="COLOR: #000000">;<BR>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</SPAN><SPAN style="COLOR: #0000ff">char</SPAN><SPAN style="COLOR: #000000">&nbsp;side&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">0xff</SPAN><SPAN style="COLOR: #000000">;<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #000000">!</SPAN><SPAN style="COLOR: #000000">ReadProcessMemory(h3,(LPCVOID)sideOffset,</SPAN><SPAN style="COLOR: #000000">&amp;</SPAN><SPAN style="COLOR: #000000">side,</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">)) //查找我方的颜色<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printError(&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">ReadProcessMemory</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">(side</SPAN><SPAN style="COLOR: #000000">!=</SPAN><SPAN style="COLOR: #000000">0xff</SPAN><SPAN style="COLOR: #000000">)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">find&nbsp;current&nbsp;side:%d\n</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,(</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">)side);<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">else</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">can't&nbsp;find&nbsp;current&nbsp;side\n</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;side&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</SPAN><SPAN style="COLOR: #0000ff">long</SPAN><SPAN style="COLOR: #000000">&nbsp;heroBaseAddress&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">0x15216ab</SPAN><SPAN style="COLOR: #000000">;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">hero&nbsp;name&nbsp;start</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</SPAN><SPAN style="COLOR: #0000ff">char</SPAN><SPAN style="COLOR: #000000">&nbsp;name[</SPAN><SPAN style="COLOR: #000000">20</SPAN><SPAN style="COLOR: #000000">]</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">{</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">};<BR>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</SPAN><SPAN style="COLOR: #0000ff">long</SPAN><SPAN style="COLOR: #000000">&nbsp;temp&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;heroBaseAddress</SPAN><SPAN style="COLOR: #000000">-</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">char</SPAN><SPAN style="COLOR: #000000">&nbsp;b[</SPAN><SPAN style="COLOR: #000000">28</SPAN><SPAN style="COLOR: #000000">]; //28种技能<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;size&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">sizeof</SPAN><SPAN style="COLOR: #000000">(b);<BR>&nbsp;&nbsp;&nbsp;&nbsp;memset(b,</SPAN><SPAN style="COLOR: #000000">3</SPAN><SPAN style="COLOR: #000000">,size);<BR>&nbsp;&nbsp;&nbsp;&nbsp;b[</SPAN><SPAN style="COLOR: #000000">12</SPAN><SPAN style="COLOR: #000000">]</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">;//不学招魂术<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">for</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;i</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">;i</SPAN><SPAN style="COLOR: #000000">&lt;=</SPAN><SPAN style="COLOR: #000000">155</SPAN><SPAN style="COLOR: #000000">;</SPAN><SPAN style="COLOR: #000000">++</SPAN><SPAN style="COLOR: #000000">i) //一共156个Hero<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #000000">!</SPAN><SPAN style="COLOR: #000000">ReadProcessMemory(h3,(LPCVOID)temp,name,</SPAN><SPAN style="COLOR: #0000ff">sizeof</SPAN><SPAN style="COLOR: #000000">(name),</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printError(&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">ReadProcessMemory</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">(name[</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">]</SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000">side)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">find:%s\t</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,name</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #000000">!</SPAN><SPAN style="COLOR: #000000">WriteProcessMemory(h3,(LPVOID)(temp</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">0xA7</SPAN><SPAN style="COLOR: #000000">),b,size,</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printError(&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">WriteProcessMemory</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">else</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">update&nbsp;skill&nbsp;sucess!\n</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp&nbsp;</SPAN><SPAN style="COLOR: #000000">+=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">0x492</SPAN><SPAN style="COLOR: #000000">;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(h3);<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">;<BR>}</SPAN></DIV>
<P><BR>附加:<BR>让我方英雄所有英雄学会除了招魂术的以外的27种技能的小程序</P>
<P>以前英雄世界也有一个这样的程序，但是版本太老，不能用了。</P>
<P>使用版本:中文版3.1,其他版本没有测试</P>
<P>使用方法:进入游戏后，运行程序</P>
<P>Download: http://www.cppblog.com/Files/sandy/h3c.zip</P><img src ="http://www.cppblog.com/sandy/aggbug/1872.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sandy/" target="_blank">小明</a> 2005-12-19 11:37 <a href="http://www.cppblog.com/sandy/archive/2005/12/19/1872.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ogre的Singleton实现以及改进</title><link>http://www.cppblog.com/sandy/archive/2005/11/30/1436.html</link><dc:creator>小明</dc:creator><author>小明</author><pubDate>Wed, 30 Nov 2005 03:38:00 GMT</pubDate><guid>http://www.cppblog.com/sandy/archive/2005/11/30/1436.html</guid><wfw:comment>http://www.cppblog.com/sandy/comments/1436.html</wfw:comment><comments>http://www.cppblog.com/sandy/archive/2005/11/30/1436.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/sandy/comments/commentRss/1436.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sandy/services/trackbacks/1436.html</trackback:ping><description><![CDATA[<FONT color=#008000 size=2>www.<B>ogre</B>3d.org<BR></FONT><FONT size=2><FONT color=#000000>OGRE: A 3D library for OpenGL and/or Direct3D<BR></FONT><BR></FONT>
<P>&nbsp;</P>
<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"><SPAN style="COLOR: #000000">template&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">typename&nbsp;T</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;Singleton<BR>{<BR></SPAN><SPAN style="COLOR: #0000ff">protected</SPAN><SPAN style="COLOR: #000000">:<BR></SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;T</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">&nbsp;ms_Singleton;<BR><BR></SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">:<BR>Singleton(&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;assert(&nbsp;</SPAN><SPAN style="COLOR: #000000">!</SPAN><SPAN style="COLOR: #000000">ms_Singleton&nbsp;);<BR>&nbsp;&nbsp;&nbsp;&nbsp;ms_Singleton&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;static_cast</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">&nbsp;T</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000">(&nbsp;</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">&nbsp;);<BR>}<BR></SPAN><SPAN style="COLOR: #000000">~</SPAN><SPAN style="COLOR: #000000">Singleton(&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;assert(&nbsp;ms_Singleton&nbsp;);&nbsp;&nbsp;ms_Singleton&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">;&nbsp;&nbsp;}<BR></SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;T</SPAN><SPAN style="COLOR: #000000">&amp;</SPAN><SPAN style="COLOR: #000000">&nbsp;getSingleton(&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;assert(&nbsp;ms_Singleton&nbsp;);&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;(&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">ms_Singleton&nbsp;);&nbsp;&nbsp;}<BR></SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;T</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">&nbsp;getSingletonPtr(&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;(&nbsp;ms_Singleton&nbsp;);&nbsp;&nbsp;}<BR>};<BR><BR></SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">client端的代码<BR></SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">Singleton的类<BR></SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">Root.h</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;Root:</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;Singleton</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">Root</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000"><BR>{<BR>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;Use();<BR>};<BR><BR></SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">初始化<BR></SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">Root.cpp</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #000000">Root&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">&nbsp;Singleton</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">Root</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000">::ms_Singleton&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">;<BR>Root&nbsp;g_root;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">must&nbsp;declare&nbsp;once&nbsp;only<BR><BR></SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">使用<BR></SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">Test.Cpp</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #000000">Root::getSingleton().Use();<BR></SPAN></DIV>
<P><STRONG>很简单，使用的技巧是template&nbsp;base&nbsp;class<BR>这种实现方法的好处是复用性好。<BR>不过使用者要声明Root&nbsp;*&nbsp;Singleton&lt;Root&gt;::ms_Singleton&nbsp;=0;挺讨厌的</STRONG></P>
<P><STRONG>改进方法：template&nbsp;static&nbsp;member&nbsp;function<BR>也就是改变声明一个static T*在template class，换成使用静态成员函数取出instance<BR></STRONG><BR></P>
<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"><SPAN style="COLOR: #000000">template&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">typename&nbsp;T</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;Singleton<BR>{<BR></SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">:<BR></SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;T</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">&amp;</SPAN><SPAN style="COLOR: #000000">&nbsp;ms_Singleton()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;T</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">&nbsp;ms_Singleton_&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">&nbsp;;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;ms_Singleton_;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR></SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">:<BR>Singleton(&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;assert(&nbsp;</SPAN><SPAN style="COLOR: #000000">!</SPAN><SPAN style="COLOR: #000000">ms_Singleton()&nbsp;);<BR>&nbsp;&nbsp;&nbsp;&nbsp;ms_Singleton()&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;static_cast</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">&nbsp;T</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000">(&nbsp;</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">&nbsp;);<BR>}<BR></SPAN><SPAN style="COLOR: #000000">~</SPAN><SPAN style="COLOR: #000000">Singleton(&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;assert(&nbsp;ms_Singleton()&nbsp;);&nbsp;&nbsp;ms_Singleton()&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">;&nbsp;&nbsp;}<BR></SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;T</SPAN><SPAN style="COLOR: #000000">&amp;</SPAN><SPAN style="COLOR: #000000">&nbsp;getSingleton(&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;assert(&nbsp;ms_Singleton()&nbsp;);&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;(&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">ms_Singleton()&nbsp;);&nbsp;&nbsp;}<BR></SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;T</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">&nbsp;getSingletonPtr(&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;(&nbsp;ms_Singleton()&nbsp;);&nbsp;&nbsp;}<BR>};<BR></SPAN></DIV>
<P><BR><BR>&nbsp;</P><img src ="http://www.cppblog.com/sandy/aggbug/1436.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sandy/" target="_blank">小明</a> 2005-11-30 11:38 <a href="http://www.cppblog.com/sandy/archive/2005/11/30/1436.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>