<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>        <title><![CDATA[3D線上遊戲製作軟體 - 玩家版（MMOGC3D）]]></title>
        <link><![CDATA[http://tw.myblog.yahoo.com/mmogc3d-mmogc3d]]></link>
        <description><![CDATA[這是一個充滿夢想的地方！致力於創造簡單易用、媲美商業遊戲等級的玩家版３Ｄ線上遊戲創作平台！！！（研發中）]]></description>
  <lastBuildDate>Thu, 29 Oct 2009 23:10:19 +0800</lastBuildDate>
        <language>zh-tw</language>         <item>
            <title><![CDATA[勇者大人早期的遊戲室內場景圖上色效果.]]></title>
            <link><![CDATA[http://tw.myblog.yahoo.com/mmogc3d-mmogc3d/article?mid=2450]]></link>
            <description><![CDATA[<img src="http://tw.blog.yahoo.com/photo/photo.php?id=OQMkgNiTBhY7.INyl6N1stA-&amp;photo=tn_F23_20091029120411832.jpg"/><br>這室內場景圖是多年前同事用3dsmax做的，然後我在用photoshop改色,上光影效果來後製.<br><br> <img src="http://tw.blog.yahoo.com/photo/photo.php?id=OQMkgNiTBhY7.INyl6N1stA-&amp;photo=tn_F23_20091029120410202.jpg"/><br> 這張也是我上色的喔...而未改時的原始色真的很難看...<br><br>我是寫程式的，為何會輪到我來上色呢。。。很奇怪吧！<br>呵～因為當時正在制定美術風格，而我又是leader，<br>所以風格是我來挑選的，但美術同事一直抓不到感覺。。。<br>我只好放下手邊程式工作，上一次色給他們看。（因為我是讀美工科啊～）<br>並要求他們說，我是業餘的，這只有６０分，你們職業的要上色的比我好喔！^^<br><br><br><br><br>下述是大圖尺寸：<br><div style="overflow:scroll;width:640px;height:700px;background-color:rgb(0, 0, 0);"><img src="http://avatar996.myweb.hinet.net/stage3-2.jpg"/></div><br><div style="overflow:scroll;width:640px;height:700px;background-color:rgb(0, 0, 0);"><img src="http://avatar996.myweb.hinet.net/stage2-2.jpg"/></div><br><br><br><br>延伸閱讀：<br><a href="http://tw.myblog.yahoo.com/mmogc3d-mmogc3d/article?mid=150&amp;prev=2450&amp;next=108&amp;l=f&amp;fid=22">勇者大人的遊戲最愛系列 - 勇者鬥惡龍三代</a><br>]]></description>
            <pubDate>Thu, 29 Oct 2009 12:07:01 +0800</pubDate>
            <guid><![CDATA[http://tw.myblog.yahoo.com/mmogc3d-mmogc3d/article?mid=2450]]></guid>
         </item>         <item>
            <title><![CDATA[3D線上遊戲製作軟體 - 我的自製圖檔格式介紹(繪圖速度快/記憶體低/檔案小)]]></title>
            <link><![CDATA[http://tw.myblog.yahoo.com/mmogc3d-mmogc3d/article?mid=2416]]></link>
            <description><![CDATA[<img src="http://tw.blog.yahoo.com/photo/photo.php?id=OQMkgNiTBhY7.INyl6N1stA-&amp;photo=tn_F23_20091016094105204.jpg"/><br>此圖是我約8,9年前在遊戲公司製作的戰鬥系統, 動態效果魄力十足喔. ^^<br><br>在以前２Ｄ遊戲當道的年代，２Ｄ繪圖技術一直都是製作遊戲的重點之一。<br>而且有點技術水準的遊戲，通常都不會直接使用BMP/TGA/PNG等等格式，<br>而是都會將之擷取圖形資料後，再包裝成遊戲專屬的自製圖檔格式。<br><br>我以前就有自己設計遊戲專用圖檔格式，但為什麼要這麼做呢？<br>我的設計優點：<br>[1]經過此最佳化的格式後，捨去不必要的資訊，繪圖的速度可以更快。<br>[2]捨去不必要的資訊後，相對的記憶體佔用量會更低。（記憶體是很寶貴的）<br>[3]捨去不必要的資訊後，相對的檔案空間佔用量會更少。（遊戲資源佔最大的是圖形）<br>[4]自然形成一種圖形壓縮格式，在未加密的情況下就有基礎的保護。<br>[5]將一系列的圖片合併到一個檔案中，便於管理大量同類圖形。（如角色動畫）<br>[6]動態讀取馬上要用到的某一張圖片，沒用到的則跳過不讀取。（大大提昇啟動遊戲時的順暢度）<br>[7]圖形混色方面採用顏色查表法和ＭＭＸ混色計算，混色繪圖效率更佳。<br>[8]圖形有檔頭資訊，紀錄各尺寸和位置偏移座標，可更方便的用於實務中。<br>[9]若圖形顏色是相同色的色塊，則會使用長度壓縮法，更省檔案和記憶體資源，<br>　到時直接由程式中繪出色塊即可。<br><br>此種格式是我『聽』我以前主管的設計理念後，再自己研究實作並加強其設計。<br>所謂...師父領進門，修行在個人，就是這個道理。<br><br>設計好圖檔格式後，也得製作一個圖形轉檔工具，此工具要設計成能自動的將所有圖檔轉換完成。<br>不要讓操作者一個一個的轉檔，因為做一個ＲＰＧ遊戲，圖檔真的是太多了。<br>最理想的情況下，是美術人員依圖檔類型分門別類的放置到各自的資料夾中，<br>然後此工具一使用時，即會自動搜尋相關所有資料夾，然後逐一轉檔，做到自動化的境界。<br><br>同時還得製作一個專屬的看圖工具，才能瀏覽自己的自製圖檔格式嚕～<br><br>關於圖檔格式的轉換流程：<br>1.原圖假設是用BMP格式，此圖檔尺寸我會用大範圍的尺寸，<br>例如640x480或是1024x768。(通常依遊戲的解析度而定)<br>因為這樣才能讓轉檔工具自動計算圖形位置和指定圖形的中心點座標。<br>而中心點座標是什麼呢？例如人物秀圖時，都是從腳下位置開始計算，然後偏移到此圖的左上角後，<br>在開始繪圖，這樣能保證所有圖都不會亂跳動，因為都是從腳下偏移出去的。。。<br>還不瞭解的話，就得自己拿一組角色動畫圖來理解看看了。<br><br>2.然後開始解析圖素時，要跳過透明色（摟空色），並紀錄到底跳過了多長的圖素距離。<br>這點把他做好，可以減少非常多的檔案空間和記憶體空間喔。<br><br>3.當遇到非透明色時，也就是到時要繪出的顏色，<br>就要將此顏色 24bit RGB 轉換成 16bit RGB，因為人的肉眼中很難分辨細微的顏色差異，<br>所以將顏色降到16bit後，能減少約三分之一的圖形量，這點可是節省資源的重點喔。<br><br>我的圖檔秀圖虛擬碼，原始圖形從BMP格式轉換而來。<br>範例如下：<span style="font-family:NSimSun;color:blue;" lang="EN-US"></span><br><div style="overflow:scroll;width:645px;height:725px;background-color:rgb(250, 250, 250);"><pre><!--[if gte mso 9]&gt;     Normal   0      0   2                                                     MicrosoftInternetExplorer4   --><style><!--/* Font Definitions */filtered {font-family:新細明體;panose-1:2 2 3 0 0 0 0 0 0 0;}filtered {font-family:NSimSun;panose-1:2 1 6 9 3 1 1 1 1 1;line-height:12pt;}filtered {panose-1:2 1 6 9 3 1 1 1 1 1;}filtered {panose-1:2 2 3 0 0 0 0 0 0 0;}/* Style Definitions */p.MsoNormal, li.MsoNormal, div.MsoNormal 	{margin:0cm;margin-bottom:.0001pt;font-size:12.0pt;font-family:"Times New Roman";}/* Page Definitions */filtered {}filtered {margin:72.0pt 90.0pt 72.0pt 90.0pt;}div.Section1 	{}--></style><!--[if gte mso 10]&gt; <style>table.MsoNormalTable 	{font-size:10.0pt;font-family:"Times New Roman";}</style> --></pre><div class="Section1" style=""><div class="ArwC7c ckChnd">  <div class="Section1">  <span style="font-family:NSimSun;" lang="EN-US"></span><span style="font-family:NSimSun;color:blue;" lang="EN-US"></span>  <div class="Section1">    <span style="font-size:10pt;font-family:細明體;color:blue;" lang="EN-US">void</span><span style="font-size:10pt;font-family:細明體;" lang="EN-US"> AVDraw::sAVADraw( WORD *dest, WORD *src, DWORD dest_pitch )</span><br> <span style="font-size:10pt;font-family:細明體;" lang="EN-US">{</span><br> <span style="font-size:10pt;font-family:細明體;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:green;">// 無裁切貼圖 - 自製格式</span></span><br>&nbsp; <span style="font-size:10pt;font-family:細明體;color:green;" lang="EN-US"> <br></span> <span style="font-size:10pt;font-family:細明體;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size:10pt;font-family:細明體;" lang="EN-US">WORD tag =&nbsp;</span><span style="font-size:10pt;font-family:細明體;color:rgb(255, 0, 0);" lang="EN-US">0</span>, <span style="font-size:10pt;font-family:細明體;" lang="EN-US">length = <span style="color:rgb(255, 0, 0);">0</span>;</span><br><br> <span style="font-size:10pt;font-family:細明體;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">while</span>( <span style="color:red;">1</span> )</span><br> <span style="font-size:10pt;font-family:細明體;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span><br> <span style="font-size:10pt;font-family:細明體;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>tag = *src++;</span><br> <span style="font-size:10pt;font-family:細明體;" lang="EN-US"> &nbsp;</span><br> <span style="font-size:10pt;font-family:細明體;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">if</span>( tag == AVA_JUMP_TRANSPARENT_COLOR ) <span style="color:green;">// 跳躍透明色</span></span><br> <span style="font-size:10pt;font-family:細明體;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<span style="">&nbsp;&nbsp;&nbsp; </span></span><br> <span style="font-size:10pt;font-family:細明體;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>dest += *src++;</span><br> <span style="font-size:10pt;font-family:細明體;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span><br> <span style="font-size:10pt;font-family:細明體;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">else</span> <span style="color:blue;">if</span>( tag == AVA_DRAW_16BIT_COLOR ) <span style="color:green;">// 真實16 bit 影像資料</span></span><br> <span style="font-size:10pt;font-family:細明體;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span><br> <span style="font-size:10pt;font-family:細明體;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>length = *src++;</span><br><span style="font-size:10pt;font-family:細明體;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>memcpy( dest, src, length );</span> <span style="font-size:10pt;font-family:細明體;" lang="EN-US"><span style="color:green;">// 超高效率的圖素複製方式</span></span><br> <span style="font-size:10pt;font-family:細明體;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>src<span style="">&nbsp; </span>+= length;</span><br> <span style="font-size:10pt;font-family:細明體;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>dest += length;</span><br> <span style="font-size:10pt;font-family:細明體;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span><br> <span style="font-size:10pt;font-family:細明體;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">else</span> <span style="color:blue;">if</span>( tag == AVA_NEXT_LINE ) <span style="color:green;">// 換下一行</span></span><br> <span style="font-size:10pt;font-family:細明體;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span><br> <span style="font-size:10pt;font-family:細明體;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>dest += dest_pitch;</span><br> <span style="font-size:10pt;font-family:細明體;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span><br> <span style="font-size:10pt;font-family:細明體;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">else</span> <span style="color:blue;">if</span>( tag == AVA_EXIT ) <span style="color:green;">// 結束</span></span><br> <span style="font-size:10pt;font-family:細明體;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span><br> <span style="font-size:10pt;font-family:細明體;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">break</span>;</span><br> <span style="font-size:10pt;font-family:細明體;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span><br> <span style="font-size:10pt;font-family:細明體;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">else</span></span><br> <span style="font-size:10pt;font-family:細明體;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span><br> <span style="font-size:10pt;font-family:細明體;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Debug::WBox( <span style="color:rgb(163, 21, 21);">&quot;AVDraw::sAVADraw<span style="">&nbsp;&nbsp; </span>ERROR ==&gt; else tag = %d&quot;</span>, tag );</span><br> <span style="font-size:10pt;font-family:細明體;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">break</span>;</span><br> <span style="font-size:10pt;font-family:細明體;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span><br> <span style="font-size:10pt;font-family:細明體;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span><br> <span style="font-size:10pt;font-family:細明體;" lang="EN-US">}</span><span style="font-size:10pt;font-family:細明體;" lang="EN-US"></span><!--[if gte mso 9]&gt;     Normal   0      0   2                                                     MicrosoftInternetExplorer4   --><style><!--/* Font Definitions */filtered {font-family:新細明體;panose-1:2 2 3 0 0 0 0 0 0 0;}filtered {font-family:細明體;panose-1:2 2 3 9 0 0 0 0 0 0;}filtered {panose-1:2 2 3 9 0 0 0 0 0 0;}filtered {panose-1:2 2 3 0 0 0 0 0 0 0;}/* Style Definitions */p.MsoNormal, li.MsoNormal, div.MsoNormal 	{margin:0cm;margin-bottom:.0001pt;font-size:12.0pt;font-family:"Times New Roman";}/* Page Definitions */filtered {}filtered {margin:72.0pt 90.0pt 72.0pt 90.0pt;}div.Section1 	{}--></style><!--[if gte mso 10]&gt; <style>table.MsoNormalTable 	{font-size:10.0pt;font-family:"Times New Roman";}</style> -->                                                                        <br><br><span style="font-family:NSimSun;" lang="EN-US"></span><span style="font-family:NSimSun;color:green;" lang="EN-US">// eof<br><br></span></div></div></div></div></div>上述只是個簡易貼圖範例..所以並<span style="color:rgb(255, 127, 0);">無裁切／無混色／無alpha／無色塊複製</span>.<br><br><br>實際測試：<br><img src="http://avatar996.myweb.hinet.net/M006-05-07-0001.png"/><br>我用來轉檔的格式是用TGA-32bit。<br>但因網頁上無法顯示此格式，所以我就轉成PNG來顯示到網頁上。<br>ps: 此圖有透明色和柔邊alpha資訊，而且尺寸是640x480，圖也置中放置。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 各位可以將圖框選起來，即可知道圖形範圍。<br><br>檔案大小的測試結果為...<br>TGA原圖檔案大小：22,521 bytes<br>PNG原圖檔案大小：18,463 bytes<br>我的格式檔案大小：<span style="color:rgb(255, 0, 0);">8,906 bytes<br><br><br><br><br></span>enjoy it ~ ^^<br><br><br><br>延伸閱讀：<br><a href="http://tw.myblog.yahoo.com/mmogc3d-mmogc3d/article?mid=2166&prev=2280&next=2105">3D線上遊戲製作軟體 - 如何實作一個強大的動畫腳本語言！(Animation Script)</a><br>]]></description>
            <pubDate>Fri, 16 Oct 2009 21:38:12 +0800</pubDate>
            <guid><![CDATA[http://tw.myblog.yahoo.com/mmogc3d-mmogc3d/article?mid=2416]]></guid>
         </item>         <item>
            <title><![CDATA[勇者大人之台北小巨蛋NBA朝聖之旅 - 金塊VS溜馬 (熱身賽)]]></title>
            <link><![CDATA[http://tw.myblog.yahoo.com/mmogc3d-mmogc3d/article?mid=2402]]></link>
            <description><![CDATA[<img src="http://tw.blog.yahoo.com/photo/photo.php?id=OQMkgNiTBhY7.INyl6N1stA-&amp;photo=tn_F23_20091009124312608.jpg"/><br>今天10月8日，很開心的和朋友去台北小巨蛋，<br>觀賞NBA成立63年來首度在台灣舉辦的原汁原味的熱身賽。<br>主角當然是上屆和湖人爭西區冠軍的『金塊』對決戰績不佳的『溜馬』～ ^^<br>開賽前，大家一致看好金塊會拿下熱身賽的首勝...結果呢...<br><br><img src="http://tw.blog.yahoo.com/photo/photo.php?id=OQMkgNiTBhY7.INyl6N1stA-&amp;photo=tn_F23_20091009124311399.jpg"/><br>這是我啦～在小巨蛋外圍和金塊巨星們合影～<br><br><img src="http://tw.blog.yahoo.com/photo/photo.php?id=OQMkgNiTBhY7.INyl6N1stA-&amp;photo=tn_F23_20091009124310986.jpg"/><br>我站在中間，顯得很小隻！？<br><br><img src="http://tw.blog.yahoo.com/photo/photo.php?id=OQMkgNiTBhY7.INyl6N1stA-&amp;photo=tn_F23_20091009125239720.jpg"/><br>又是我～<br><br><img src="http://tw.blog.yahoo.com/photo/photo.php?id=OQMkgNiTBhY7.INyl6N1stA-&amp;photo=tn_F23_20091009124309936.jpg"/><br>後面當然是NBA空運來台的全套比賽設備嚕～呵呵～大開眼界啦～<br><br><img src="http://tw.blog.yahoo.com/photo/photo.php?id=OQMkgNiTBhY7.INyl6N1stA-&amp;photo=tn_F23_20091009124312291.jpg"/><br>我們很早就先入場，所以看到都還沒啥人來。。。<br><br><img src="http://tw.blog.yahoo.com/photo/photo.php?id=OQMkgNiTBhY7.INyl6N1stA-&amp;photo=tn_F23_20091009124308551.jpg"/><br>溜馬球員先行練球～不錯喔～夠認真～<br><br><img src="http://tw.blog.yahoo.com/photo/photo.php?id=OQMkgNiTBhY7.INyl6N1stA-&amp;photo=tn_F23_20091009124307709.jpg"/><br>鳥人出現啦～好耀眼的刺青喔～^^<br><br><img src="http://tw.blog.yahoo.com/photo/photo.php?id=OQMkgNiTBhY7.INyl6N1stA-&amp;photo=tn_F23_20091009124306932.jpg"/><br>鳥人...你在看哪～<br><br><img src="http://tw.blog.yahoo.com/photo/photo.php?id=OQMkgNiTBhY7.INyl6N1stA-&amp;photo=tn_F23_20091009125751497.jpg"/><br>快～趕快練球啊～<br><br><img src="http://tw.blog.yahoo.com/photo/photo.php?id=OQMkgNiTBhY7.INyl6N1stA-&amp;photo=tn_F23_20091009125750645.jpg"/><br>練習時，大家命中率都蠻低的～<br><br><img src="http://tw.blog.yahoo.com/photo/photo.php?id=OQMkgNiTBhY7.INyl6N1stA-&amp;photo=tn_F23_20091009125749656.jpg"/><br>鳥人～來個灌籃吧～<br><br><img src="http://tw.blog.yahoo.com/photo/photo.php?id=OQMkgNiTBhY7.INyl6N1stA-&amp;photo=tn_F23_20091009125748233.jpg"/><br>鳥人真的很大隻～雙手張開更是了得～<br><br><img src="http://tw.blog.yahoo.com/photo/photo.php?id=OQMkgNiTBhY7.INyl6N1stA-&amp;photo=tn_F23_20091009125749240.jpg"/><br>這球該投進嚕吧！？<br><br><img src="http://tw.blog.yahoo.com/photo/photo.php?id=OQMkgNiTBhY7.INyl6N1stA-&amp;photo=tn_F23_20091009124305641.jpg"/><br>觀眾陸續進場了...<br><br><img src="http://tw.blog.yahoo.com/photo/photo.php?id=OQMkgNiTBhY7.INyl6N1stA-&amp;photo=tn_F23_20091009125240713.jpg"/><br>等嚕好久～準備開賽嚕～金塊球員先行入場！<br><br><img src="http://tw.blog.yahoo.com/photo/photo.php?id=OQMkgNiTBhY7.INyl6N1stA-&amp;photo=tn_F23_20091009124304455.jpg"/><br>雙方繼續熱身～準備開硍～ ^^<br><br><img src="http://tw.blog.yahoo.com/photo/photo.php?id=OQMkgNiTBhY7.INyl6N1stA-&amp;photo=tn_F23_20091009125241631.jpg"/><br>我們的座位在3樓，很高很遠。。。所以是高空拍攝...　幸好我視力算正常...^^&quot;<br><br><img src="http://tw.blog.yahoo.com/photo/photo.php?id=OQMkgNiTBhY7.INyl6N1stA-&amp;photo=tn_F23_20091009123442358.jpg"/><br>金塊啦啦隊也很棒喔～非常有女人味～ ^^ 也是全場的焦點之一<br><br><img src="http://tw.blog.yahoo.com/photo/photo.php?id=OQMkgNiTBhY7.INyl6N1stA-&amp;photo=tn_F23_20091009123441214.jpg"/><br>比賽開始！！！跳球～～～～～是誰會先撥到球呢！？<br><br><img src="http://tw.blog.yahoo.com/photo/photo.php?id=OQMkgNiTBhY7.INyl6N1stA-&amp;photo=tn_F23_20091009123441935.jpg"/><br>開賽後，金塊仍在沒睡飽狀態=.=，而溜馬的三分砲卻不斷開火～＠＠<br><br><img src="http://tw.blog.yahoo.com/photo/photo.php?id=OQMkgNiTBhY7.INyl6N1stA-&amp;photo=tn_F23_20091009123440794.jpg"/><br>金塊一路被壓著打～到底是怎麼回事！？~_~<br>溜馬卻節奏明快，以超過四成五的高命中率投進16個三分球～＠＠<br><br><img src="http://tw.blog.yahoo.com/photo/photo.php?id=OQMkgNiTBhY7.INyl6N1stA-&amp;photo=tn_F23_20091009123439210.jpg"/><br>比賽結束～溜馬一路領先，終場以126比104擊敗金塊，拿下今年熱身賽的第一勝。^^y<br>此位溜馬球員發表感言！Y_Y<br><br><img src="http://tw.blog.yahoo.com/photo/photo.php?id=OQMkgNiTBhY7.INyl6N1stA-&amp;photo=tn_F23_20091009123304402.jpg"/><br>媒體大陣仗的湧入拍攝中...<br><br><img src="http://tw.blog.yahoo.com/photo/photo.php?id=OQMkgNiTBhY7.INyl6N1stA-&amp;photo=tn_F23_20091009123302162.jpg"/><br>NBA球員很感謝台灣的眾多球迷...大力支持！Y_Y<br><br><img src="http://tw.blog.yahoo.com/photo/photo.php?id=OQMkgNiTBhY7.INyl6N1stA-&amp;photo=tn_F23_20091009123301757.jpg"/><br>比賽在歡呼中結束了！球員陸續回到休息室。。。而大家都還捨不得走呢^^<br><br><br><br>加油～希望明年還有台北ＮＢＡ可以看喔～　耶～ ^^y<br><br><br><br><br><br><img src="http://www.ltsports.com.tw/pic_news/71482-1.jpg"/><br><br>延伸閱讀：<br><a href="http://tw.sports.yahoo.com/article/aurl/d/a/091009/5/3x48.html" target="_new">YAHOO-NBA新聞-NBA溜馬126：104踹金塊　NBA台北賽奪勝</a><br><a href="http://tw.sports.yahoo.com/article/aurl/d/a/091009/10/3x6d.html" target="_new">YAHOO-NBA新聞-台灣瘋NBA 一步步來</a><br><a href="http://tw.sports.yahoo.com/nba/blog/basketball_chen/1397.html" target="_new">YAHOO-NBA名家專欄-台北賽觀戰推薦－Chris Andersen</a><br><br>]]></description>
            <pubDate>Fri, 09 Oct 2009 00:46:32 +0800</pubDate>
            <guid><![CDATA[http://tw.myblog.yahoo.com/mmogc3d-mmogc3d/article?mid=2402]]></guid>
         </item>         <item>
            <title><![CDATA[3D線上遊戲製作軟體 - 3D空間中的移動演算法]]></title>
            <link><![CDATA[http://tw.myblog.yahoo.com/mmogc3d-mmogc3d/article?mid=2328]]></link>
            <description><![CDATA[<img src="http://tw.blog.yahoo.com/photo/photo.php?id=OQMkgNiTBhY7.INyl6N1stA-&amp;photo=tn_F23_20090807093158893.jpg"/><br><br><br>最近，在自己的簡易３Ｄ引擎中，需要一個功能，<br>就是『移動模型從起點ｘ、ｙ、ｚ座標到終點ｘ、ｙ、ｚ座標』。<br>這個移動算法就讓我想好久耶～T_T<br><br>以前在２Ｄ遊戲中，我也需要做射出魔法的移動效果，<br>我就想不出要如何線性移動圖形到指定的ｘ、ｙ座標，<br>但我還是有完成此功能，就是去拿別人的畫線程式碼來改成這樣的需求。<br>但我還是不懂他的演算原理為何～<br>而且網路上我也沒找到正確的移動範例教學可以參考。<br><br>沒想到最近又稍微想嚕一下這演算問題，竟突然『頓悟』了。＠＠<br>想通嚕演算原理，然後趕快來實作驗證，<br>呵呵，沒錯，直接達陣～<br><br>此ｘ、ｙ、ｚ移動原理其實很簡單。。。（之前想不出來時卻認為很難 &gt;_&lt;）<br>首先，取得起點ｘ、ｙ、ｚ座標到終點ｘ、ｙ、ｚ座標的各距離（dx、dy、dz），<br>然後再從 dx、dy、dz 中找出哪一個是最大的距離數值（dist_max），<br>再將此 dist_max 除以 一次要移動的距離（once_move_value），<br>這就能算出移動次數（move_count_max），<br>然後，再將剛剛算出的 dx、dy、dz 各自都除以 move_count_max，<br>就會得到每次要移動的距離加值（ox、oy、oz），<br>最後，就可以拿此 ox、oy、oz 和 move_count_max 來進行移動了！<br>這樣就完成啦～（啊～聽不懂我在說什麼嗎＠＠，那看程式碼吧^^&quot;）<br><br><br>3D空間中的移動演算法 - 移動物件宣告&nbsp; 範例如下：<span style="font-family:NSimSun;color:blue;" lang="EN-US"></span><br><div style="overflow:scroll;width:645px;height:725px;background-color:rgb(250, 250, 250);"><pre><!--[if gte mso 9]&gt;     Normal   0      0   2                                                     MicrosoftInternetExplorer4   --><style><!--/* Font Definitions */_filtered {font-family:新細明體;panose-1:2 2 3 0 0 0 0 0 0 0;}_filtered {font-family:NSimSun;panose-1:2 1 6 9 3 1 1 1 1 1;line-height:12pt;}_filtered {panose-1:2 1 6 9 3 1 1 1 1 1;}_filtered {panose-1:2 2 3 0 0 0 0 0 0 0;}/* Style Definitions */p.MsoNormal, li.MsoNormal, div.MsoNormal 	{margin:0cm;margin-bottom:.0001pt;font-size:12.0pt;font-family:"Times New Roman";}/* Page Definitions */_filtered {}_filtered {margin:72.0pt 90.0pt 72.0pt 90.0pt;}div.Section1 	{}--></style><!--[if gte mso 10]&gt; <style>table.MsoNormalTable 	{font-size:10.0pt;font-family:"Times New Roman";}</style> --></pre><div class="Section1" style=""><div class="ArwC7c ckChnd">  <div class="Section1">  <span style="font-family:NSimSun;" lang="EN-US"></span><span style="font-family:NSimSun;color:blue;" lang="EN-US"></span>  <div class="Section1">  <span style="font-family:NSimSun;color:green;" lang="EN-US">//==========================================================================================================================================================</span><br> <span style="font-family:NSimSun;color:blue;" lang="EN-US"></span><span style="font-family:NSimSun;color:blue;" lang="EN-US">struct</span><span style="font-family:NSimSun;" lang="EN-US"> POINT3D</span><br> <span style="font-family:NSimSun;" lang="EN-US">{</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">float</span> x, y, z;</span><br> <span style="font-family:NSimSun;" lang="EN-US">};</span><br> <span style="font-family:NSimSun;color:blue;" lang="EN-US"></span><span style="font-family:NSimSun;color:blue;" lang="EN-US"> </span><br> <span style="font-family:NSimSun;color:blue;" lang="EN-US">class</span><span style="font-family:NSimSun;" lang="EN-US"> Line3DNode</span><br> <span style="font-family:NSimSun;" lang="EN-US">{</span><br> <span style="font-family:NSimSun;color:blue;" lang="EN-US">protected</span><span style="font-family:NSimSun;" lang="EN-US"> :</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span><span style="color:green;">//------------------------------------------------------------</span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">float</span><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>MoveAddValue;<span style="">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:green;">// </span></span><span style="font-family:NSimSun;" lang="EN-US"><span style="color:green;">一次移動</span></span><span style="font-family:NSimSun;" lang="EN-US"><span style="color:green;">累加值</span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>DWORD<span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>OnceMoveCountMax; <span style="color:green;">// 一次移動次數計數器最大值</span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>ClockInfo<span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Delay;<span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:green;">// 延遲時間(此時間物件未附上程式碼)</span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>BOOL<span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>ToEndFlag;<span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:green;">// 到達終點旗標</span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span><span style="color:green;">//---------------</span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>POINT3D<span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>PosMoveAddValue;</span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; <span style="font-family:NSimSun;" lang="EN-US"><span style="color:green;">// </span></span><span style="font-family:NSimSun;" lang="EN-US"><span style="color:green;">移動時的每次加值</span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>DWORD<span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>PosMoveAddValueCount;</span> <span style="font-family:NSimSun;" lang="EN-US"><span style="color:green;">// </span></span><span style="font-family:NSimSun;" lang="EN-US"><span style="color:green;">移動總次數</span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span><span style="color:green;">//------------------------------------------------------------</span></span><br> <span style="font-family:NSimSun;color:blue;" lang="EN-US">public</span><span style="font-family:NSimSun;" lang="EN-US"> :</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span><span style="color:green;">//------------------------------------------------------------</span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>POINT3D<span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>NowPos;<span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:green;">// 現在位置</span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>POINT3D<span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>EndPos;<span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:green;">// 目標位置</span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span><span style="color:green;">//------------------------------------------------------------</span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>Line3DNode();</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span><span style="color:green;">//------------------------------------------------------------</span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">void</span><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Create();</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span><span style="color:green;">// 設定直線斜移動初始化資訊</span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">void</span><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>SetLineMoveCreateInfo( </span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&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 style="color:blue;">float</span> now_x, <span style="color:blue;">float</span> now_y, <span style="color:blue;">float</span> now_z, </span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&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 style="color:blue;">float</span> end_x, <span style="color:blue;">float</span> end_y, <span style="color:blue;">float</span> end_z, </span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&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>DWORD delay_time, DWORD once_move_count_max = <span style="color:red;">1</span>, </span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&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 style="color:blue;">float</span> move_add_value = <span style="color:red;">1.0f</span> );</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span><span style="color:green;">//------------------------------------------------------------</span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span><span style="color:green;">// 直斜線移動( 移動到終點為止)( 絕對命中目標)</span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">void</span><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>LineMoveToEnd();</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span><span style="color:green;">//------------------------------------------------------------</span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>BOOL<span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>GetToEndFlag(){ <span style="color:blue;">return</span> ToEndFlag; }</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span><span style="color:green;">//------------------------------------------------------------</span></span><br> <span style="font-family:NSimSun;" lang="EN-US">};</span><span lang="EN-US"></span><br><br><span style="font-family:NSimSun;" lang="EN-US"></span><span style="font-family:NSimSun;color:green;" lang="EN-US">// eof<br><br></span></div></div></div></div></div><font face="simsun"><br><br></font>3D空間中的移動演算法 - 移動物件定義&nbsp;  範例如下：<span style="font-family:NSimSun;color:blue;" lang="EN-US"></span><br> <div style="overflow:scroll;width:645px;height:725px;background-color:rgb(250, 250, 250);"><pre><!--[if gte mso 9]&gt;     Normal   0      0   2                                                     MicrosoftInternetExplorer4   --><style><!--/* Font Definitions */_filtered {font-family:新細明體;panose-1:2 2 3 0 0 0 0 0 0 0;}_filtered {font-family:NSimSun;panose-1:2 1 6 9 3 1 1 1 1 1;line-height:12pt;}_filtered {panose-1:2 1 6 9 3 1 1 1 1 1;}_filtered {panose-1:2 2 3 0 0 0 0 0 0 0;}/* Style Definitions */p.MsoNormal, li.MsoNormal, div.MsoNormal 	{margin:0cm;margin-bottom:.0001pt;font-size:12.0pt;font-family:"Times New Roman";}/* Page Definitions */_filtered {}_filtered {margin:72.0pt 90.0pt 72.0pt 90.0pt;}div.Section1 	{}--></style><!--[if gte mso 10]&gt; <style>table.MsoNormalTable 	{font-size:10.0pt;font-family:"Times New Roman";}</style> --></pre><div class="Section1" style=""><div class="ArwC7c ckChnd">  <div class="Section1">  <span style="font-family:NSimSun;" lang="EN-US"></span><span style="font-family:NSimSun;color:blue;" lang="EN-US"></span>  <div class="Section1"><span style="font-size:10pt;font-family:NSimSun;color:green;" lang="EN-US"></span>  <span style="font-family:NSimSun;color:green;" lang="EN-US">//==========================================================================================================================================================</span><br> <span style="font-family:NSimSun;" lang="EN-US">Line3DNode::Line3DNode()</span><br> <span style="font-family:NSimSun;" lang="EN-US">{</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>Create();</span><br> <span style="font-family:NSimSun;" lang="EN-US">}</span><br> <span style="font-family:NSimSun;" lang="EN-US"> &nbsp;</span><br> <span style="font-family:NSimSun;color:green;" lang="EN-US">//==========================================================================================================================================================</span><br> <span style="font-family:NSimSun;color:blue;" lang="EN-US">void</span><span style="font-family:NSimSun;" lang="EN-US"> Line3DNode::Create()</span><br> <span style="font-family:NSimSun;" lang="EN-US">{</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>MoveAddValue = <span style="color:red;">1.0f</span>;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>OnceMoveCountMax = <span style="color:red;">1</span>;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>Delay.Clear();</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>ToEndFlag = FALSE;<span style="">&nbsp; </span></span><br> <span style="font-family:NSimSun;" lang="EN-US"> &nbsp;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>ZeroMemory( &amp;NowPos, <span style="color:blue;">sizeof</span>( NowPos ) );<span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>ZeroMemory( &amp;EndPos, <span style="color:blue;">sizeof</span>( EndPos ) );</span><br> <span style="font-family:NSimSun;" lang="EN-US"> &nbsp;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span></span><span style="font-family:NSimSun;" lang="EN-US">ZeroMemory( &amp;</span><span style="font-family:NSimSun;" lang="EN-US"><span style=""></span>PosMoveAddValue</span><span style="font-family:NSimSun;" lang="EN-US">, <span style="color:blue;">sizeof</span>( </span><span style="font-family:NSimSun;" lang="EN-US"><span style=""></span>PosMoveAddValue </span><span style="font-family:NSimSun;" lang="EN-US">) );</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span></span><span style="font-family:NSimSun;" lang="EN-US"><span style=""></span>PosMoveAddValueCount</span><span style="font-family:NSimSun;" lang="EN-US"><span style=""></span>= <span style="color:red;">0</span>;</span><br> <span style="font-family:NSimSun;" lang="EN-US">}</span><br> <span style="font-family:NSimSun;" lang="EN-US"> &nbsp;</span><br> <span style="font-family:NSimSun;color:green;" lang="EN-US">//==========================================================================================================================================================</span><br> <span style="font-family:NSimSun;color:blue;" lang="EN-US">static</span><span style="font-family:NSimSun;" lang="EN-US"> <span style="color:blue;">float</span> gGetDistance( <span style="color:blue;">float</span> x1, <span style="color:blue;">float</span> x2, <span style="color:blue;">float</span> &amp;add_value )</span><br> <span style="font-family:NSimSun;" lang="EN-US">{</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">if</span>( x1 == x2 )</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>{</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>add_value = <span style="color:red;">0.0f</span>;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">return</span> add_value;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>}</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">else</span> <span style="color:blue;">if</span>( x1 &lt; x2 )</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>{</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>add_value = x2 - x1;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">return</span> add_value;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>}</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">else</span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>{</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>add_value = -(x1 - x2);</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">return</span> -add_value;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>}</span><br> <span style="font-family:NSimSun;" lang="EN-US">}</span><br> <span style="font-family:NSimSun;" lang="EN-US"> &nbsp;</span><br> <span style="font-family:NSimSun;color:blue;" lang="EN-US">void</span><span style="font-family:NSimSun;" lang="EN-US"> Line3DNode::SetLineMoveCreateInfo( </span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&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:blue;">float</span> now_x, <span style="color:blue;">float</span> now_y, <span style="color:blue;">float</span> now_z, </span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&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:blue;">float</span> end_x, <span style="color:blue;">float</span> end_y, <span style="color:blue;">float</span> end_z, </span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>DWORD delay_time, DWORD once_move_count_max, <span style="color:blue;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; float</span> move_add_value )</span><br> <span style="font-family:NSimSun;" lang="EN-US">{</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>NowPos.x<span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>= now_x;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>NowPos.y<span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>= now_y;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>NowPos.z<span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>= now_z;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>EndPos.x<span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>= end_x;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>EndPos.y<span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>= end_y;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>EndPos.z<span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>= end_z;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>Delay.DelayTime<span style="">&nbsp; </span>= delay_time;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>OnceMoveCountMax = once_move_count_max;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>MoveAddValue<span style="">&nbsp;&nbsp;&nbsp;&nbsp; </span>= move_add_value;</span><br> <span style="font-family:NSimSun;" lang="EN-US"> &nbsp;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span><span style="color:green;">//-----------------</span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">float</span> value = <span style="color:red;">0.0f</span>, max_value = <span style="color:red;">0.0f</span>;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">float</span> add_x = <span style="color:red;">0.0f</span>, add_y = <span style="color:red;">0.0f</span>, add_z = <span style="color:red;">0.0f</span>;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>value = gGetDistance( NowPos.x, EndPos.x, add_x );</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">if</span>( max_value &lt; value )</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>max_value = value;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>value = gGetDistance( NowPos.y, EndPos.y, add_y );</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">if</span>( max_value &lt; value )</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>max_value = value;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>value = gGetDistance( NowPos.z, EndPos.z, add_z );</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">if</span>( max_value &lt; value )</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>max_value = value;</span><br> <span style="font-family:NSimSun;" lang="EN-US"> &nbsp;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">float</span> move_count = max_value / MoveAddValue;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>PosMoveAddValueCount = (DWORD)move_count;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>PosMoveAddValue.x = add_x / move_count;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>PosMoveAddValue.y = add_y / move_count;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>PosMoveAddValue.z = add_z / move_count;</span><br> <span style="font-family:NSimSun;" lang="EN-US">}</span><br> <span style="font-family:NSimSun;" lang="EN-US"> &nbsp;</span><br> <span style="font-family:NSimSun;color:green;" lang="EN-US">//==========================================================================================================================================================</span><br> <span style="font-family:NSimSun;color:blue;" lang="EN-US">void</span><span style="font-family:NSimSun;" lang="EN-US"> Line3DNode::LineMoveToEnd()</span><br> <span style="font-family:NSimSun;" lang="EN-US">{<span style="">&nbsp;&nbsp; </span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style=""></span></span><span style="font-family:NSimSun;color:green;" lang="EN-US"></span><span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">if</span>( ToEndFlag )</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">return</span>;</span><br> <span style="font-family:NSimSun;" lang="EN-US"> &nbsp;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">if</span>( ! Delay.WhileDelayTimeFunc() )</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">return</span>;</span><br> <span style="font-family:NSimSun;" lang="EN-US"> &nbsp;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">long</span> max = OnceMoveCountMax;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">while</span>( max &gt; <span style="color:red;">0</span> )</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>{</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>--max;</span><br> <span style="font-family:NSimSun;" lang="EN-US"> &nbsp;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>NowPos.x += PosMoveAddValue.x;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>NowPos.y += PosMoveAddValue.y;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>NowPos.z += PosMoveAddValue.z;</span><br> <span style="font-family:NSimSun;" lang="EN-US"> &nbsp;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">if</span>( --PosMoveAddValueCount &lt;= <span style="color:red;">0</span> )</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>NowPos = EndPos;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>ToEndFlag = TRUE;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">break</span>;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>}</span><br> <span style="font-family:NSimSun;" lang="EN-US">}</span><span lang="EN-US"></span><!--[if gte mso 9]&gt;     Normal   0      0   2                                                     MicrosoftInternetExplorer4   --><style><!--/* Font Definitions */_filtered {font-family:新細明體;panose-1:2 2 3 0 0 0 0 0 0 0;}_filtered {font-family:NSimSun;panose-1:2 1 6 9 3 1 1 1 1 1;}_filtered {panose-1:2 1 6 9 3 1 1 1 1 1;}_filtered {panose-1:2 2 3 0 0 0 0 0 0 0;}/* Style Definitions */p.MsoNormal, li.MsoNormal, div.MsoNormal 	{margin:0cm;margin-bottom:.0001pt;font-size:12.0pt;font-family:"Times New Roman";}/* Page Definitions */_filtered {}_filtered {margin:72.0pt 90.0pt 72.0pt 90.0pt;}div.Section1 	{}--></style><!--[if gte mso 10]&gt; <style>table.MsoNormalTable 	{font-size:10.0pt;font-family:"Times New Roman";}</style> -->                                                                                                                                                                                                                        <br><br> <span style="font-family:NSimSun;" lang="EN-US"></span><span style="font-family:NSimSun;color:green;" lang="EN-US">// eof<br> <br> </span></div></div></div></div></div> <font face="simsun"><br><br>我覺得，此</font>3D移動演算法還蠻有效率的耶，先初始化一些資訊並計算後，<br>在移動過程中都只用到『加法』『減法』，又能按照移動射線，正確的移動到終點。<br><br>由此可知，2D的移動演算原理也是相同，只要將z值拿掉即完成。＠＠<br>看來我數學雖不行，幸好靠邏輯自己想～還能想出解答！<br><br>耶～ ^_^y<br><br><br><br><br>]]></description>
            <pubDate>Fri, 07 Aug 2009 09:22:55 +0800</pubDate>
            <guid><![CDATA[http://tw.myblog.yahoo.com/mmogc3d-mmogc3d/article?mid=2328]]></guid>
         </item>         <item>
            <title><![CDATA[勇者大人的遊戲程式設計生涯大回顧！（一）（初出茅廬篇）]]></title>
            <link><![CDATA[http://tw.myblog.yahoo.com/mmogc3d-mmogc3d/article?mid=2280]]></link>
            <description><![CDATA[<font size="6"><strong style="background-color:rgb(0, 0, 0);color:rgb(255, 0, 0);">&nbsp; 基礎邏輯：A=B, B=C, A就會=C<span style="color:rgb(0, 0, 0);"></span></strong><strong style="background-color:rgb(0, 0, 0);color:rgb(255, 0, 0);">&nbsp;&nbsp; </strong><strong style="background-color:rgb(0, 0, 0);color:rgb(255, 0, 0);"></strong></font><br><strong style="background-color:rgb(0, 0, 0);color:rgb(255, 0, 0);"><span style="color:rgb(0, 0, 0);"><br></span></strong>程式設計，在多數人眼中可能是一門相當難以學習的技能。<br>大家會認為，學習這個，『頭腦』要很好，『數學』要不錯，『英文』也要可以。。。<br><br>抱歉！這些我都不太行，剛好我就是個例外！＠＠<br>在下的<span style="color:rgb(0, 0, 255);">『有志者，事竟成』</span>學習過程，可能就要打破大家這個迷思了。<br><br>講到學習過程，一定得提到為何我要學習『遊戲程式設計』。。。<br>話說，在我國小的時候，正是家用遊戲起飛的年代，<br>我也跟一般小朋友一樣，非常喜歡玩遊戲。<br>大家對於當時的大型機台遊戲，任天堂遊戲可是非常的著迷呢。。。<br>而我為了每天能玩到任天堂的遊戲，還跟媽媽拜託，說考試考得不錯的話，就買給我們。<br>當然啦，成績有達到要求，所以父母也只能掏腰包兌現支票啦～<br>（很賊吧，有獎品才願意讀書。。。=.=）<br>不過當時並不是買任天堂主機，因為很貴，而是買嚕一台較便宜，名叫『小天才』的兼容主機。<br>（還有一塊超級馬力歐的遊戲）<br>這主機一樣也可以玩任天堂的遊戲。不知道該公司製作這兼容主機，是否也需要得到任天堂<br>的授權呢？當時我對於智慧財產權也是搞不太清楚！＠＠<br><br>主機得手後，當然是日以繼夜的拼命玩各種遊戲，學校成績也不去管他了，不要到很差就好。<br>在學校可和同學一起討論遊戲怎麼玩，這才是上課的重點！（哈～～～）<br>那時腦袋想的就是為什麼怪物不能再增加更多隻，招式更多種，地圖再大一點，遊戲難度再高一點。。。<br>對於想要自己設計遊戲的想法已經逐漸開始萌芽了！<br><br>之後，因緣際會下，發現到一款『勇者鬥惡龍三代』的角色扮演遊戲，超級棒！<br><img src="http://tw.blog.yahoo.com/photo/photo.php?id=OQMkgNiTBhY7.INyl6N1stA-&amp;photo=tn_F23_20090719115141138.jpg"/><br>每一本遊戲雜誌都在歌頌他的史詩內容和創新設計。<br>而這款也是我最愛的任天堂遊戲了。（當然太空戰士三代也很棒）<br><br>到了國中時，我的好同學買了彩色的家用電腦，我看同學的電腦遊戲雜誌，看到一款名叫。。。<br>『創世紀六代 - 虛偽先知（ultima6）』的電腦遊戲。（英文版）<br><img src="http://tw.blog.yahoo.com/photo/photo.php?id=OQMkgNiTBhY7.INyl6N1stA-&amp;photo=tn_F23_20090719115142904.jpg"/><br>這讓我感到非常驚訝！怎麼電腦遊戲的畫面比任天堂遊戲好太多了！！！＠＠<br>此遊戲使用了２５６色來表現遊戲畫面～而任天堂主機只有６４色而已～<br>而且創新的高自由度設計，這是當時任天堂遊戲沒有去做的方向！<br>一般的任天堂遊戲都是以打魔王為最終目標，而創世紀六代則是你想怎麼玩，就可以怎麼玩！<br>你也可以不去按照劇情走，而用奇奇怪怪的方式用自己的想法，自己玩！<br>我的玩法都是玩『燒殺擄掠』！每到一個村莊就開始屠城！^_^b<br>搶走所有我想要的物品裝備！村民來追打我時，我就送他上西天！<br>警衛看到有人在犯法，會衝上前來制止我，我就趕快跑～<br>呵呵～因為他蠻強的，我打不贏。直到我有好裝備時，我就專門找警衛麻煩！哈哈～<br>然後呢，因為此遊戲的世界地圖非常龐大，而且是盡量照真實的比例，並不會像任天堂遊戲需要<br>從世界地圖切換到村莊地圖，所以更增加許多真實感。。。<br>哈～也因為此遊戲是英文版，我怎可能看懂英文，所以就不玩劇情，只照自己意思亂玩一通～<br>反而能玩到其他遊戲沒有的快感～哈哈～<br><br>另外，我國小國中的成績都是在全班中間，不好也不差！<br>而且上課都沒在聽，覺得很無聊時都在課本上畫圖，一直畫一直畫～<br>整本都畫的到處都是，連考試時，背後的空白我也給他塗上幾筆！哈～<br>不知道為什麼，就是喜歡畫東畫西，畫些可愛的角色。<br>所以，我的美學也是由此慢慢的開始培養。。。<br><br>國二暑假時，我還去我二叔叔的工廠打工，賺一點零用錢，<br>然後再跟媽媽說我想要學電腦，但是要買彩色的。XD（也剛好我姑姑是在賣電腦的）<br>就花了二萬六千元買一台２８６的彩色螢幕電腦～<br>此時，就開始了我的電腦專長學習之路！<br>我的人生要開始改變了～<br><br>有一天，我從好同學的電腦雜誌發現，電腦可以設計遊戲！＠＠<br>當時，國產電腦遊戲也正是萌芽的年代～<br>一些程式設計高手，陸續參加遊戲設計比賽，得獎的作品則有獎金獎盃和得到發行機會！<br>我感到很厲害又很羨慕，他們打一些看不懂的英文和數字，<br>這就是遊戲的內部嗎！？好神奇喔～～～<br>這時，我滿腔熱血的就開始自己學習電腦內建的ET-BASIC語言，期望能做點什麼東西出來。<br>看著雜誌學，看著電腦書學，發覺這語言功能似乎不強，<br>後來發現，原來很多人都是用Ｃ語言來寫遊戲啊～（也有用組合語言來寫的）<br>索性就再跑去我姑姑在光華商場的電腦店，跟他說我想學Ｃ語言，<br>就拿了一套Borland C++ 2.0程式語言編譯器，和幾本C/C++語言的書，回家自己研究！^_^b<br><br>說也神奇，我自己一個人在家看書摸索，竟然慢慢的也可以瞭解何謂程式語言。<br>瞭解如何寫程式，如何使用這套編譯工具。<br>我還記得，那本『快快樂樂學Borland C++ 2.0』我看完了好幾遍（正確書名忘了），<br>前三分之二是介紹Ｃ語言，後面則是介紹Ｃ＋＋語言。<br><span style="color:rgb(255, 0, 0);">每一個字，每一個範例我都仔細閱讀，不斷的思考為什麼是這樣，遇到看不懂的，</span><br style="color:rgb(255, 0, 0);"><span style="color:rgb(255, 0, 0);">就先跳過，繼續看下一章，之後再回來『不斷重讀</span><span style="color:rgb(255, 0, 0);">，</span><span style="color:rgb(255, 0, 0);">不斷重讀</span><span style="color:rgb(255, 0, 0);">，</span><span style="color:rgb(255, 0, 0);">不斷重讀</span><span style="color:rgb(255, 0, 0);">』。</span><br>哈～～～去學校上課都沒這麼認真耶～　真神奇～～～<br>當時心中有種奇怪的感覺，感覺到自己一個人悶在房間學一些周遭旁人看不懂的東西，<br>自己好像是個異類，我也很少去跟同學提起這種事。<br>學了點東西，心中也很有成就感，但是我的個性是很低調的～<br>那時腦袋就一直在想，這Ｃ語言，跟遊戲到底有什麼關聯呢？<br>遊戲是如何設計的呢，不斷的翻翻電腦書，看看我好同學的電腦雜誌，<br>逐漸的，竟也理出一點頭緒出來～<br>這段自我學習過程讓我發現，<span style="color:rgb(255, 0, 0);">『其實每一種知識，</span><br style="color:rgb(255, 0, 0);"><span style="color:rgb(255, 0, 0);">一開始一定都看不懂，但只要能不斷的不斷的去</span><span style="color:rgb(255, 0, 0);">思考</span><span style="color:rgb(255, 0, 0);">研究，</span><br style="color:rgb(255, 0, 0);"><span style="color:rgb(255, 0, 0);">總有一天一定可以理解這到底是什麼！』</span><br>藉由學習程式語言，也讓我的自信心無形之中強大了起來！<br>而且，此年代是家家戶戶幾乎沒有網路的年代，當然，我家絕對是沒有網路的～<br>但我有另一個朋友他有玩一種叫做ＢＢＳ，但是我覺得這東西很無聊，重點是。。。<br>玩這東西要花錢＠＠！！！而且只是和遠方不認識的朋友聊天，卻一直要花錢～<br>這對於當時的我，簡直是不可能的事～<br>所以，學電腦技術的知識都是封閉的，不像這年代，網路如此發達～<br>知識爆炸，『人人有功練』。<br>人人都可以透過網路學習到一輩子都學不完的知識！（只要自己願意學）<br><br>還有個怪事！自從我學習Ｃ語言後，慢慢的就不太想玩遊戲了。<br>反而喜歡看別人玩！然後我從旁觀察這遊戲是怎麼做的！？<br>他的動作圖片用了幾張！？畫面捲動是怎麼設計的！？角色移動跳躍是怎麼做的！？<br>腦袋中想的就是這些。。。而且是自發性的，無法控制～＠＠<br><br>之後，到了高中時，Ｃ語言已經學會了，也自己做了很多測驗題，<br>來不斷測試我是否理解程式語言和遊戲之間的關係～<br>其中做的一個最有趣的ｄｏｓ程式是...<br>在ｄｏｓ模式下表現出迷宮地圖捲動效果，要可以用上下左右來做角色移動。<br>也要有障礙物和終點判斷！<br>呵呵～這題就跟遊戲非常有關係了，若是做的出來，則也就能夠初步瞭解<br>遊戲中的地圖原理以及如何實做了。<br>當然，我有個書上範例可以參考，我不斷研讀後，就照自己意思做出來了，效果也很好喔！<br><br><br>待續。。。<br><br><br><br>延伸閱讀：<br><a target="_new" href="http://tw.myblog.yahoo.com/mmogc3d-mmogc3d/article?mid=280&amp;l=f&amp;fid=12">勇者大人童年製作的DOS遊戲 - 翔翔傳說</a><br>]]></description>
            <pubDate>Sun, 19 Jul 2009 23:33:54 +0800</pubDate>
            <guid><![CDATA[http://tw.myblog.yahoo.com/mmogc3d-mmogc3d/article?mid=2280]]></guid>
         </item>         <item>
            <title><![CDATA[3D線上遊戲製作軟體 - 如何實作一個強大的動畫腳本語言！(Animation Script)]]></title>
            <link><![CDATA[http://tw.myblog.yahoo.com/mmogc3d-mmogc3d/article?mid=2166]]></link>
            <description><![CDATA[<img src="http://tw.blog.yahoo.com/photo/photo.php?id=OQMkgNiTBhY7.INyl6N1stA-&amp;photo=tn_F23_20081004123942956.jpg"/><br><br><br><br>我的動畫腳本語言範例如下：<br><div style="overflow:scroll;width:645px;height:625px;background-color:rgb(250, 250, 230);"><pre><font><font><font><font face="simsun"><font color="#000000"><font size="3">;<span style="font-family:monospace;"><span style="font-family:simsun;">===============================================================================</span></span></font></font></font></font></font></font><font face="simsun"><font color="#000000"><font size="3"><br>; 腳本名稱 - 一般的顯示圖片</font></font></font><br><font><font><font><font face="simsun"><font color="#000000"><font size="3">;<span style="font-family:monospace;"><span style="font-family:simsun;">===============================================================================</span></span></font></font></font></font></font></font><font face="simsun"><font color="#000000"><font size="3"><br></font></font></font><br><font face="simsun"><font color="#000000"><font size="3">; 初始化一個動畫 (動畫編號, 圖檔編號, X, Y, 延遲, 每次的Alpha加值)<br>CREATE_ANI	0, 0, P0, P1, 10, 10<br><br>; 自動播放限定張數動畫 (動畫編號, 起始圖號, 終止圖號)<br>PLAY_ANI_RANGE	0, 0, 3<br><br>; 等待動畫播放完畢 (動畫編號)<br>WAIT_ANI	0<br><br>WAIT		350<br><br>; 淡出<br>FADE_OUT	10 (每次淡出的減值)<br><br>END<br><br><br><br><br><br></font></font></font><font><font><font><font face="simsun"><font color="#000000"><font size="3">;<span style="font-family:monospace;"><span style="font-family:simsun;">===============================================================================</span></span></font></font></font></font></font></font><font face="simsun"><font color="#000000"><font size="3"><br></font></font></font><font face="simsun"><font color="#000000"><font size="3">; 腳本名稱 - 單一腳本多動畫<br></font></font></font><font><font><font><font face="simsun"><font color="#000000"><font size="3">;<span style="font-family:monospace;"><span style="font-family:simsun;">===============================================================================</span></span></font></font></font></font></font></font><font face="simsun"><font color="#000000"><font size="3"><br></font></font></font><br><font face="simsun"><font color="#000000"><font size="3">; 初始化一個動畫 (動畫編號, 圖檔編號, X, Y, 延遲, 每次的Alpha加值)<br>CREATE_ANI	0, 1, 0, 0, 10, 10<br><br>; 自動播放限定張數動畫 (動畫編號, 起始圖號, 終止圖號)<br>PLAY_ANI_RANGE	0, 0, 3<br><br>; 等待動畫播放完畢 (動畫編號)<br>WAIT_ANI	0<br><br><br><br>; 初始化一個動畫 (動畫編號, 圖檔編號, X, Y, 延遲)<br>CREATE_ANI	1, 2, 508, 315, 10<br>CREATE_ANI	2, 2, 496, 330, 10<br>CREATE_ANI	3, 2, 527, 337, 10<br><br>; 自動播放限定張數動畫 (動畫編號, 起始圖號, 終止圖號)<br>PLAY_ANI_RANGE	1, P0, P0<br>PLAY_ANI_RANGE	2, P1, P1<br>PLAY_ANI_RANGE	3, P2, P2<br><br><br><br>WAIT		90<br><br>; 淡出<br>FADE_OUT	10 (每次淡出的減值)<br><br>END<br></font></font></font><font><font><font><font face="simsun"><font color="#000000"><font size="3"><br><br><br><br><br></font></font></font></font></font></font><font><font><font><font face="simsun"><font color="#000000"><font size="3">;<span style="font-family:monospace;"><span style="font-family:simsun;">===============================================================================</span></span></font></font></font></font></font></font><font face="simsun"><font color="#000000"><font size="3"><br></font></font></font><font face="simsun"><font color="#000000"><font size="3">; 腳本名稱 - 用腳本移動圖形位置<br></font></font></font><font><font><font><font face="simsun"><font color="#000000"><font size="3">;<span style="font-family:monospace;"><span style="font-family:simsun;">===============================================================================</span></span></font></font></font></font></font></font><font face="simsun"><font color="#000000"><font size="3"><br></font></font></font><font face="simsun"><font color="#000000"><font size="3"><br></font></font></font><font face="simsun"><font color="#000000"><font size="3">; 初始化一個動畫 (動畫編號, 圖檔編號, X, Y, 延遲)<br>CREATE_ANI	0, 1, 297, 177, 4<br><br>; (-1等於無限循環)<br>SET_COUNT	-1<br><br>; 自動播放限定張數動畫 (動畫編號, 起始圖號, 終止圖號)<br>PLAY_ANI_RANGE	0, P0, P0<br><br>SET_A		0<br>; 淡入<br>FADE_IN		30 (每次淡入的加值)<br><br>PLAY_SOUND	7<br><br>ADD_Y	2<br>WAIT	3<br>ADD_Y	2<br>WAIT	3<br>ADD_Y	2<br>WAIT	3<br>ADD_Y	2<br>WAIT	3<br>ADD_Y	-8<br>WAIT	3<br><br>ADD_Y	2<br>WAIT	3<br>ADD_Y	2<br>WAIT	3<br>ADD_Y	-4<br>WAIT	3<br><br>ADD_Y	2<br>WAIT	3<br>ADD_Y	-2<br>WAIT	3<br><br>CALL_FUNC	2 ; 通知內部移動已停止<br><br>; 等待動畫播放完畢 (動畫編號)<br>WAIT_ANI	0<br><br>; 淡出<br>FADE_OUT	10 (每次淡出的減值)<br><br>END<br></font></font></font></pre></div><font face="simsun"><br><br></font>下述二個連結是我的動畫腳本語言程式碼：<br><a target="_new" href="http://avatar996.myweb.hinet.net/AV_Script-h.htm">AV_Script-h.htm</a><br><a target="_new" href="http://avatar996.myweb.hinet.net/AV_Script-cpp.htm">AV_Script-cpp.htm</a><br><br><br><br>以前我寫動畫控制的方式，是在程式內用一種奇妙的方式來編排動畫控制。<br>這是用long的陣列來排列動畫流程。是以前我的主管使用的方式，我看到後，<br>覺得很棒，我就自己實作一個這樣的動畫控制類別。<br>動畫表格虛擬碼如下：<br>long ani_process_table[ ] = <br>{<br>&nbsp;&nbsp;&nbsp; ANI_COMMAND__CREATE_ANI, 0, 0, 100, 200, 10, 10,<br>&nbsp;&nbsp;&nbsp; ANI_COMMAND__PLAY_ANI_RANGE, 0, 0, 3,<br>&nbsp;&nbsp;&nbsp; ANI_COMMAND__WAIT_ANI, 0,<br>&nbsp;&nbsp;&nbsp; ANI_COMMAND__WAIT, 350,<br>&nbsp;&nbsp;&nbsp; ANI_COMMAND__CALL_FUNC, (long)gAniExtraFunc, // 重點：流程中可以呼叫函式喔<br>&nbsp;&nbsp;&nbsp; ANI_COMMAND__FADE_OUT, 10,<br>&nbsp;&nbsp;&nbsp; ANI_COMMAND__END,<br>};<br><br>而我現在設計的動畫腳本語言，其實也只是將原設計外移到腳本檔案中而已。<br>至於功能的多寡，則是需要多少功能就先實現多少功能。<br>還沒用到的功能。。。就留到以後需要時再做吧！<br><br><div style="overflow:scroll;width:645px;height:625px;background-color:rgb(250, 250, 230);"><pre>下述就是我已設計的動畫腳本命令簡介：<br>&nbsp;&nbsp;&nbsp; ANI_COMMAND__CREATE_ANI,     // 一開始一定得初始化一個動畫物件，之後才能控制它。<br>&nbsp;&nbsp;&nbsp; ANI_COMMAND__CREATE_RECT,    // 這是初始化一個矩形色塊物件。<br>&nbsp;&nbsp;&nbsp; ANI_COMMAND__CTRL_ANI_START, // 保留。(未完成)<br>&nbsp;&nbsp;&nbsp; ANI_COMMAND__CTRL_ANI_END,&nbsp;&nbsp; // 保留。(未完成)<br>&nbsp;&nbsp;&nbsp; ANI_COMMAND__SET_ANI_RANGE,&nbsp; // 設定動畫顯示圖片張數(動畫編號,圖片開始值,圖片結束值)<br>&nbsp;&nbsp;&nbsp; ANI_COMMAND__PLAY_ANI_RANGE, // 同ANI_COMMAND__SET_ANI_RANGE,但會立即播放。<br>&nbsp;&nbsp;&nbsp; ANI_COMMAND__PLAY_ANI,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 開始播放動畫，圖片開始值會歸0。<br>&nbsp;&nbsp;&nbsp; ANI_COMMAND__CONTINUE_PLAY_ANI, // 繼續播放動畫，圖片開始值不會歸0。<br>&nbsp;&nbsp;&nbsp; ANI_COMMAND__WAIT_ANI,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 等待一個動畫播放完畢，腳本才會往下移動。<br>&nbsp;&nbsp;&nbsp; ANI_COMMAND__WAIT_ALL_ANI,&nbsp;&nbsp; // 等待此腳本所有動畫播放完畢，腳本才會往下移動。<br>&nbsp;&nbsp;&nbsp; ANI_COMMAND__WAIT,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 單純的等待延遲。<br>&nbsp;&nbsp;&nbsp; ANI_COMMAND__BREAK,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 中斷腳本流程，並將流程往下移動。<br>&nbsp;&nbsp;&nbsp; ANI_COMMAND__PLAY_SOUND,&nbsp;&nbsp;&nbsp;&nbsp; // 播放音效。<br>&nbsp;&nbsp;&nbsp; ANI_COMMAND__SET_ANI,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 指定現在要單獨控制並設定參數的動畫物件。<br>&nbsp;&nbsp;&nbsp; ANI_COMMAND__SET_IMAGE,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 承上，用ANI_COMMAND__SET_XXX這一系列的功能來設定。<br>&nbsp;&nbsp;&nbsp; ANI_COMMAND__SET_POS,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 設定螢幕上的x,y座標。<br>&nbsp;&nbsp;&nbsp; ANI_COMMAND__SET_DELAY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 設定動畫換張延遲最大值。<br>&nbsp;&nbsp;&nbsp; ANI_COMMAND__SET_COLOR,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 設定R,G,B,A。<br>&nbsp;&nbsp;&nbsp; ANI_COMMAND__SET_R,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 設定Red<br>&nbsp;&nbsp;&nbsp; ANI_COMMAND__SET_G,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 設定Green<br>&nbsp;&nbsp;&nbsp; ANI_COMMAND__SET_B,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 設定Blue<br>&nbsp;&nbsp;&nbsp; ANI_COMMAND__SET_A,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 設定Alpha<br>&nbsp;&nbsp;&nbsp; ANI_COMMAND__SET_PIC_INDEX,&nbsp; // 設定現在顯示圖片張號<br>&nbsp;&nbsp;&nbsp; ANI_COMMAND__SET_COUNT,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 設定動畫播放重複次數<br>&nbsp;&nbsp;&nbsp; ANI_COMMAND__SET_LAYER,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 設定動畫所在階層。(上中下)<br>&nbsp;&nbsp;&nbsp; ANI_COMMAND__SHOW_PIC,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 設定現在顯示圖片張號，並馬上顯示。<br>&nbsp;&nbsp;&nbsp; ANI_COMMAND__ADD_X,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 增加X值。可設正負值，能讓動畫移動。<br>&nbsp;&nbsp;&nbsp; ANI_COMMAND__ADD_Y,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 增加Y值。可設正負值，能讓動畫移動。<br>&nbsp;&nbsp;&nbsp; ANI_COMMAND__FADE_IN,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 讓動畫淡入，慢慢顯示出來。<br>&nbsp;&nbsp;&nbsp; ANI_COMMAND__FADE_OUT,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 讓動畫淡出，慢慢消失不見。<br>&nbsp;&nbsp;&nbsp; ANI_COMMAND__CALL_FUNC,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 呼叫程式中指定的函式，以實現難以做到的功能。<br>&nbsp;&nbsp;&nbsp; ANI_COMMAND__CALL_SCRIPT,&nbsp;&nbsp;&nbsp; // 呼叫另一個腳本，可多腳本同時執行。(未完成)<br>&nbsp;&nbsp;&nbsp; ANI_COMMAND__END_ANI,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 直接刪除動畫。<br>&nbsp;&nbsp;&nbsp; ANI_COMMAND__END,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 腳本結束。</pre></div><font face="simsun"><br></font><span style="font-family:NSimSun;" lang="EN-US"><br>關於.H 檔中的 AniScriptEventInterface</span> ，是事件驅動介面。<br>動畫運行的過程，會呼叫相關的事件函式，使用者只要去虛擬他，然後，<br>根據收到的參數來做相對應的設計即可！<br><br>而 <span style="font-family:NSimSun;" lang="EN-US">AniScriptComponent 就是動畫腳本元件。<br>這元件的功能，各位看名稱應該也能知道用來做啥吧。<br></span> 不然就是去研讀程式碼，才能真正看懂個中精要！<br><br>我的 .H 檔寫的相當簡潔，都將複雜的設計隱藏到 .CPP 當中，<br>只公開必要的資訊而已，這也是一種『元件導向』的程式設計方式。<br>有著相當多的好處呢。<br>]]></description>
            <pubDate>Wed, 03 Jun 2009 00:50:40 +0800</pubDate>
            <guid><![CDATA[http://tw.myblog.yahoo.com/mmogc3d-mmogc3d/article?mid=2166]]></guid>
         </item>         <item>
            <title><![CDATA[3D線上遊戲製作軟體 - 封包傳送採用bit方式以節省傳輸量.]]></title>
            <link><![CDATA[http://tw.myblog.yahoo.com/mmogc3d-mmogc3d/article?mid=2105]]></link>
            <description><![CDATA[<img src="http://tw.blog.yahoo.com/photo/photo.php?id=OQMkgNiTBhY7.INyl6N1stA-&amp;photo=tn_20080103094023651.jpg"/><br><br><br><br>這次，來分享一下一個旗標(flag)資訊合成的小技巧。<br>也就是善用BYTE的每一個bit (總用有８bit可用)。<br>網路遊戲程式中，常常會傳輸各種資訊，尤其是旗標資訊也是一堆。<br>若是將各種旗標資訊都合成到一個BYTE中，再傳送給對方，<br>這樣就能大幅減少封包傳輸量。<br><br>下述，我就是將合成方法做成巨集，以方便使用喔。<br><div style="overflow:scroll;width:645px;height:825px;background-color:rgb(250, 250, 250);"><a>  <br> <font size="2"><span style="font-size:10pt;font-family:tahoma, sans-serif;color:green;" lang="EN-US">//#################################################################################</span></font><br> <font size="2"><span style="font-size:10pt;font-family:tahoma, sans-serif;color:green;" lang="EN-US">// bit control method.</span></font><br> <font size="2"><span style="font-size:10pt;font-family:tahoma, sans-serif;color:green;" lang="EN-US">//---------------------------------------------------------------------------------</span></font><br> <font size="2"><span style="font-size:10pt;font-family:tahoma, sans-serif;color:blue;" lang="EN-US">enum</span><span style="font-size:10pt;font-family:tahoma, sans-serif;" lang="EN-US"> _BIT_ONE_TYPE_</span></font><br> <font size="2"><span style="font-size:10pt;font-family:tahoma, sans-serif;" lang="EN-US">{</span></font><br> <font size="2"><span style="font-size:10pt;font-family:tahoma, sans-serif;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp; </span>BIT__0 = <span style="color:red;">0</span>,</span></font><br> <font size="2"><span style="font-size:10pt;font-family:tahoma, sans-serif;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp; </span>BIT__1,</span></font><br> <font size="2"><span style="font-size:10pt;font-family:tahoma, sans-serif;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp; </span>BIT__2,</span></font><br> <font size="2"><span style="font-size:10pt;font-family:tahoma, sans-serif;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp; </span>BIT__3,</span></font><br> <font size="2"><span style="font-size:10pt;font-family:tahoma, sans-serif;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp; </span>BIT__4,</span></font><br> <font size="2"><span style="font-size:10pt;font-family:tahoma, sans-serif;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp; </span>BIT__5,</span></font><br> <font size="2"><span style="font-size:10pt;font-family:tahoma, sans-serif;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp; </span>BIT__6,</span></font><br> <font size="2"><span style="font-size:10pt;font-family:tahoma, sans-serif;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp; </span>BIT__7,</span></font><br> <font size="2"><span style="font-size:10pt;font-family:tahoma, sans-serif;" lang="EN-US">};</span></font><br> <font size="2"><span style="font-size:10pt;font-family:tahoma, sans-serif;" lang="EN-US"> &nbsp;</span></font><br> <font size="2"><span style="font-size:10pt;font-family:tahoma, sans-serif;color:blue;" lang="EN-US">#define</span><span style="font-size:10pt;font-family:tahoma, sans-serif;" lang="EN-US"> SET_BITONE( dest_buff, src_bool_value, bit_one_type ) &#92;</span></font><br> <font size="2"><span style="font-size:10pt;font-family:tahoma, sans-serif;" lang="EN-US">{ &#92;</span></font><br> <font size="2"><span style="font-size:10pt;font-family:tahoma, sans-serif;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp; </span>dest_buff |= (_BYTE)src_bool_value &lt;&lt; bit_one_type; &#92;</span></font><br> <font size="2"><span style="font-size:10pt;font-family:tahoma, sans-serif;" lang="EN-US">}</span></font><br> <font size="2"><span style="font-size:10pt;font-family:tahoma, sans-serif;" lang="EN-US"> &nbsp;</span></font><br> <font size="2"><span style="font-size:10pt;font-family:tahoma, sans-serif;color:blue;" lang="EN-US">#define</span><span style="font-size:10pt;font-family:tahoma, sans-serif;" lang="EN-US"> GET_BITONE( dest_value, dest_type, src_buff, bit_one_type ) &#92;</span></font><br> <font size="2"><span style="font-size:10pt;font-family:tahoma, sans-serif;" lang="EN-US">{ &#92;</span></font><br> <font size="2"><span style="font-size:10pt;font-family:tahoma, sans-serif;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp; </span>dest_value = (dest_type)((_BYTE)(src_buff &lt;&lt; (BIT__7 - bit_one_type)) &gt;&gt; BIT__7); &#92;</span></font><br> <font size="2"><span style="font-size:10pt;font-family:tahoma, sans-serif;" lang="EN-US">}</span></font><br> <font size="2"><span style="font-size:10pt;font-family:tahoma, sans-serif;" lang="EN-US"> </span></font><font size="2"><span style="font-size:10pt;font-family:tahoma, sans-serif;color:green;" lang="EN-US"></span></font><font size="2"><span style="font-size:10pt;font-family:tahoma, sans-serif;color:green;" lang="EN-US"> </span></font><br> <font size="2"><span style="font-size:10pt;font-family:tahoma, sans-serif;color:green;" lang="EN-US">//====================================================</span></font><br> <font size="2"><span style="font-size:10pt;font-family:tahoma, sans-serif;color:blue;" lang="EN-US">enum</span><span style="font-size:10pt;font-family:tahoma, sans-serif;" lang="EN-US"> _BIT_FOUR_TYPE_</span></font><br> <font size="2"><span style="font-size:10pt;font-family:tahoma, sans-serif;" lang="EN-US">{</span></font><br> <font size="2"><span style="font-size:10pt;font-family:tahoma, sans-serif;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp; </span>BIT_FOUR__3210 = <span style="color:red;">0</span>,</span></font><br> <font size="2"><span style="font-size:10pt;font-family:tahoma, sans-serif;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp; </span>BIT_FOUR__7654,</span></font><br> <font size="2"><span style="font-size:10pt;font-family:tahoma, sans-serif;" lang="EN-US">};</span></font><br> <font size="2"><span style="font-size:10pt;font-family:tahoma, sans-serif;" lang="EN-US"> &nbsp;</span></font><br> <font size="2"><span style="font-size:10pt;font-family:tahoma, sans-serif;color:blue;" lang="EN-US">#define</span><span style="font-size:10pt;font-family:tahoma, sans-serif;" lang="EN-US"> SET_BITFOUR( dest_buff, src_value, bit_four_type ) &#92;</span></font><br> <font size="2"><span style="font-size:10pt;font-family:tahoma, sans-serif;" lang="EN-US">{ &#92;</span></font><br> <font size="2"><span style="font-size:10pt;font-family:tahoma, sans-serif;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">if</span>( src_value &gt; <span style="color:red;">15</span> ) &#92;</span></font><br> <font size="2"><span style="font-size:10pt;font-family:tahoma, sans-serif;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp; </span>{ &#92;</span></font><br> <font size="2"><span style="font-size:10pt;font-family:tahoma, sans-serif;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">char</span> buff[ <span style="color:red;">64</span> ]; &#92;</span></font><br> <font size="2"><span style="font-size:10pt;font-family:tahoma, sans-serif;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>sprintf( buff, <span style="color:rgb(163, 21, 21);">&quot;SET_BITFOUR<span style="">&nbsp;&nbsp; </span>error : if( src_value(%d) &gt; 15 )&quot;</span>, src_value ); &#92;</span></font><br> <font size="2"><span style="font-size:10pt;font-family:tahoma, sans-serif;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>MessageBox( NULL, buff, <span style="color:rgb(163, 21, 21);">&quot;AV Debug&quot;</span>, MB_OK ); &#92;</span></font><br> <font size="2"><span style="font-size:10pt;font-family:tahoma, sans-serif;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp; </span>} &#92;</span></font><br> <font size="2"><span style="font-size:10pt;font-family:tahoma, sans-serif;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp; </span>((_BYTE)dest_buff) |= (_BYTE)(src_value &lt;&lt; (<span style="color:red;">4</span> * bit_four_type)); &#92;</span></font><br> <font size="2"><span style="font-size:10pt;font-family:tahoma, sans-serif;" lang="EN-US">}</span></font><br> <font size="2"><span style="font-size:10pt;font-family:tahoma, sans-serif;" lang="EN-US"> &nbsp;</span></font><br> <font size="2"><span style="font-size:10pt;font-family:tahoma, sans-serif;color:blue;" lang="EN-US">#define</span><span style="font-size:10pt;font-family:tahoma, sans-serif;" lang="EN-US"> GET_BITFOUR( dest_value, dest_type, src_buff, bit_four_type ) &#92;</span></font><br> <font size="2"><span style="font-size:10pt;font-family:tahoma, sans-serif;" lang="EN-US">{ &#92;</span></font><br> <font size="2"><span style="font-size:10pt;font-family:tahoma, sans-serif;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">if</span>( bit_four_type == BIT_FOUR__3210 ) &#92;</span></font><br> <font size="2"><span style="font-size:10pt;font-family:tahoma, sans-serif;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>dest_value = (dest_type)(((_BYTE)(src_buff &lt;&lt; <span style="color:red;">4</span>)) &gt;&gt; <span style="color:red;">4</span>); &#92;</span></font><br> <font size="2"><span style="font-size:10pt;font-family:tahoma, sans-serif;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">else</span> &#92;</span></font><br> <font size="2"><span style="font-size:10pt;font-family:tahoma, sans-serif;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>dest_value = (dest_type)(((_BYTE)src_buff) &gt;&gt; <span style="color:red;">4</span>); &#92;</span></font><br> <font size="2"><span style="font-size:10pt;font-family:tahoma, sans-serif;" lang="EN-US">}</span></font><!--[if gte mso 9]&gt;     Normal   0      0   2                                                     MicrosoftInternetExplorer4   --><style><!--/* Font Definitions */_filtered {font-family:新細明體;panose-1:2 2 3 0 0 0 0 0 0 0;}_filtered {font-family:NSimSun;panose-1:2 1 6 9 3 1 1 1 1 1;}_filtered {panose-1:2 1 6 9 3 1 1 1 1 1;}_filtered {panose-1:2 2 3 0 0 0 0 0 0 0;}/* Style Definitions */p.MsoNormal, li.MsoNormal, div.MsoNormal 	{margin:0cm;margin-bottom:.0001pt;font-size:12.0pt;font-family:"Times New Roman";}/* Page Definitions */_filtered {}_filtered {margin:72.0pt 90.0pt 72.0pt 90.0pt;}div.Section1 	{}--></style><!--[if gte mso 10]&gt; <style>table.MsoNormalTable 	{font-size:10.0pt;font-family:"Times New Roman";}</style> -->                                                                                                                                <br></a></div><br><br><br>下述是bit使用範例：<br><br>BYTE test_flag = 1;<br>BYTE dest_flag = 0;<br>SET_BITONE( dest_flag, test_flag, BIT__2 );　// 將資訊合成到BIT__2的位置<br><br>BYTE src_flag = dest_flag;<br><br>BOOL get_a_flag = 0;<br>GET_BITONE( get_a_flag, BYTE, src_flag, BIT__0 ); // 取出合成資訊,將會取得 0<br>BOOL get_b_flag = 0;<br>GET_BITONE( get_b_flag, BYTE, src_flag, BIT__1 ); // 取出合成資訊,將會取得 0<br>BOOL get_c_flag = 0;<br>GET_BITONE( get_c_flag, BYTE, src_flag, BIT__2 ); // 取出合成資訊,將會取得 1<br><br><br><br>而關於下述這種呢，就是合成資訊時，能使用４個bit，也就是能表示0~15的數值喔。<br>enum _BIT_FOUR_TYPE_<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp; BIT_FOUR__3210 = 0,<br>&nbsp;&nbsp;&nbsp;&nbsp; BIT_FOUR__7654,<br>};<br>其使用方式都跟之前的類似，請各位仔細瞧瞧吧。<img src="http://l.yimg.com/f/i/tw/blog/smiley/1.gif"/><br><br><br><br>PS : 留言中, 有網友熱心的告訴我另一種用C語言語法來呈現的方式, 我竟然忘記還有此用法了...<br>感謝大家的留言和討論...<br>有興趣的人請看留言喔！<img src="http://l.yimg.com/f/i/tw/blog/smiley/4.gif"/><br><br><br><br>]]></description>
            <pubDate>Mon, 27 Apr 2009 21:14:35 +0800</pubDate>
            <guid><![CDATA[http://tw.myblog.yahoo.com/mmogc3d-mmogc3d/article?mid=2105]]></guid>
         </item>         <item>
            <title><![CDATA[3D線上遊戲製作軟體 - 研究OGRE如何複製關鍵動畫(KeyFrame)和骨骼動畫(Skeletal).]]></title>
            <link><![CDATA[http://tw.myblog.yahoo.com/mmogc3d-mmogc3d/article?mid=2044]]></link>
            <description><![CDATA[<img src="http://tw.blog.yahoo.com/photo/photo.php?id=OQMkgNiTBhY7.INyl6N1stA-&amp;photo=tn_F23_20081004123942956.jpg"/><br><br><div style="overflow:scroll;width:665px;height:825px;background-color:rgb(0, 0, 0);"><img src="http://farm4.static.flickr.com/3215/3383885109_2360cc4a65_o.png"/> </div>畫面中...單獨的身體、盾牌和一個紅色材質方塊，皆是在程式內動態複製動畫的方式產生的！<br><br>這段時間，我研究Ogre的進度有點慢...<br>當然，主因是工作繁忙嚕...不過我仍有找時間研究啦～<br>這次研究的是如何在程式中動態複製動畫！<br>我以為這些功能Ogre都會做的好好的，我只要找到使用的方式即可，<br>事實上呢，我測試的結果是... Ogre3D執行clone關鍵動畫後，卻播放不出動畫！？<br>只有clone骨骼動畫時，才能正確播放！　真奇怪...<br>難道是我的使用方式仍是不正確！？我研究了好久，真的是很悶～ (可能是我不懂Ogre的設計吧)<br><br>最後我想到一個方式，就是去繼承NodeAnimationTrack和Animation後，<br>就可以用新的物件介面來改寫一些功能，在不修改Ogre的SourceCode限度內，<br>來達到功能上的加強或是改變！<br>現在只好我自己來實做clone關鍵動畫了。<br><br>繼承後改寫的程式碼如下：<span style="font-family:NSimSun;color:blue;" lang="EN-US"></span><br><div style="overflow:scroll;width:645px;height:725px;background-color:rgb(250, 250, 250);"><pre><!--[if gte mso 9]&gt;     Normal   0      0   2                                                     MicrosoftInternetExplorer4   --><style><!--/* Font Definitions */filtered {font-family:新細明體;panose-1:2 2 3 0 0 0 0 0 0 0;}filtered {font-family:NSimSun;panose-1:2 1 6 9 3 1 1 1 1 1;line-height:12pt;}filtered {panose-1:2 1 6 9 3 1 1 1 1 1;}filtered {panose-1:2 2 3 0 0 0 0 0 0 0;}/* Style Definitions */p.MsoNormal, li.MsoNormal, div.MsoNormal 	{margin:0cm;margin-bottom:.0001pt;font-size:12.0pt;font-family:"Times New Roman";}/* Page Definitions */filtered {}filtered {margin:72.0pt 90.0pt 72.0pt 90.0pt;}div.Section1 	{}--></style><!--[if gte mso 10]&gt; <style>table.MsoNormalTable 	{font-size:10.0pt;font-family:"Times New Roman";}</style> --></pre><div class="Section1" style=""><div class="ArwC7c ckChnd"><a>  </a><div class="Section1"><a>  <span style="font-family:NSimSun;" lang="EN-US"></span><span style="font-family:NSimSun;color:blue;" lang="EN-US"></span><!--[if gte mso 9]&gt;     Normal   0      0   2                                                     MicrosoftInternetExplorer4   --><style><!--/* Font Definitions */filtered {font-family:新細明體;panose-1:2 2 3 0 0 0 0 0 0 0;}filtered {font-family:NSimSun;panose-1:2 1 6 9 3 1 1 1 1 1;}filtered {panose-1:2 1 6 9 3 1 1 1 1 1;}filtered {panose-1:2 2 3 0 0 0 0 0 0 0;}/* Style Definitions */p.MsoNormal, li.MsoNormal, div.MsoNormal 	{margin:0cm;margin-bottom:.0001pt;font-size:12.0pt;font-family:"Times New Roman";}/* Page Definitions */filtered {}filtered {margin:72.0pt 90.0pt 72.0pt 90.0pt;}div.Section1 	{}--></style><!--[if gte mso 10]&gt; <style>table.MsoNormalTable 	{font-size:10.0pt;font-family:"Times New Roman";}</style> --><span class="Apple-style-span" style="border-collapse:separate;color:rgb(0, 0, 0);font-family:'Times New Roman';font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;orphans:2;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;"><div style="margin:8px;font-family:arial;font-style:normal;font-variant:normal;font-weight:normal;font-size:small;line-height:normal;font-size-adjust:none;font-stretch:normal;"><span class="Apple-style-span" style="border-collapse:separate;color:rgb(0, 0, 0);font-family:'Times New Roman';font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;orphans:2;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;"><div style="margin:8px;font-family:arial;font-style:normal;font-variant:normal;font-weight:normal;font-size:small;line-height:normal;font-size-adjust:none;font-stretch:normal;"><p class="MsoNormal"><span class="Apple-style-span" style="color:rgb(0, 128, 0);"><span class="Apple-style-span" style="font-size:small;"><font class="Apple-style-span" face="tahoma, sans-serif">// programmer : ANDY</font></span></span><span class="Apple-style-span" style="font-size:small;"><font class="Apple-style-span" face="tahoma, sans-serif"><br></font></span><span class="Apple-style-span" style="color:rgb(0, 128, 0);"><span class="Apple-style-span" style="font-size:small;"><font class="Apple-style-span" face="tahoma, sans-serif">// website&nbsp;&nbsp;&nbsp;<span class="Apple-converted-space">&nbsp;</span>: http://tw.myblog.yahoo.com/mmogc3d-mmogc3d/</font></span></span><span class="Apple-style-span" style="font-size:small;"><font class="Apple-style-span" face="tahoma, sans-serif"><br></font></span><span class="Apple-style-span" style="color:rgb(0, 128, 0);"><span class="Apple-style-span" style="font-size:small;"><font class="Apple-style-span" face="tahoma, sans-serif">// last date&nbsp;<span class="Apple-converted-space">&nbsp;</span>: 2009.03.25</font></span></span><span class="Apple-style-span" style="font-size:small;"><font class="Apple-style-span" face="tahoma, sans-serif"><br></font></span><span class="Apple-style-span" style="border-collapse:separate;color:rgb(0, 0, 0);font-family:'Times New Roman';font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;orphans:2;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;"><div style="margin:8px;font-family:arial;font-style:normal;font-variant:normal;font-weight:normal;font-size:small;line-height:normal;font-size-adjust:none;font-stretch:normal;"><span style="font-size:10pt;color:blue;" lang="EN-US"><span class="Apple-style-span" style="color:rgb(0, 0, 0);"><span style="font-size:10pt;color:blue;" lang="EN-US"><font class="Apple-style-span" face="tahoma, sans-serif">class</font></span><span style="font-size:10pt;" lang="EN-US"><font class="Apple-style-span" face="tahoma, sans-serif"><span class="Apple-converted-space">&nbsp;</span>MyAnimationTrack :<span class="Apple-converted-space">&nbsp;</span></font><span style="color:blue;"><font class="Apple-style-span" face="tahoma, sans-serif">public</font></span><font class="Apple-style-span" face="tahoma, sans-serif"><span class="Apple-converted-space">&nbsp;</span>NodeAnimationTrack</font></span></span><br><span class="Apple-style-span" style="color:rgb(0, 0, 0);font-family:tahoma;">{</span><br><span class="Apple-style-span" style="color:rgb(0, 0, 0);"><span style="font-size:10pt;color:blue;" lang="EN-US"><font class="Apple-style-span" face="tahoma, sans-serif">public</font></span><span style="font-size:10pt;" lang="EN-US"><font class="Apple-style-span" face="tahoma, sans-serif"><span class="Apple-converted-space">&nbsp;</span>:</font></span></span><br><span class="Apple-style-span" style="color:rgb(0, 0, 0);"><font class="Apple-style-span" face="tahoma, sans-serif">&nbsp;&nbsp; &nbsp;&nbsp;</font><span style="color:blue;"><font class="Apple-style-span" face="tahoma, sans-serif">void</font></span><font class="Apple-style-span" face="tahoma, sans-serif"><span class="Apple-converted-space">&nbsp;</span>AddKeyFrame( KeyFrame *kf )</font></span><br><span class="Apple-style-span" style="color:rgb(0, 0, 0);font-family:tahoma;">&nbsp;&nbsp; &nbsp; {</span><br><span class="Apple-style-span" style="color:rgb(0, 0, 0);"><font class="Apple-style-span" face="tahoma, sans-serif">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</font><span style="color:blue;"><font class="Apple-style-span" face="tahoma, sans-serif">struct</font></span><font class="Apple-style-span" face="tahoma, sans-serif"><span class="Apple-converted-space">&nbsp;</span>KeyFrameTimeLess</font></span><br><span class="Apple-style-span" style="color:rgb(0, 0, 0);font-family:tahoma;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</span><br><span class="Apple-style-span" style="color:rgb(0, 0, 0);"><font class="Apple-style-span" face="tahoma, sans-serif">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</font><span style="color:blue;"><font class="Apple-style-span" face="tahoma, sans-serif">bool</font></span><font class="Apple-style-span" face="tahoma, sans-serif"><span class="Apple-converted-space">&nbsp;</span></font><span style="color:blue;"><font class="Apple-style-span" face="tahoma, sans-serif">operator</font></span><font class="Apple-style-span" face="tahoma, sans-serif">() (</font><span style="color:blue;"><font class="Apple-style-span" face="tahoma, sans-serif">const</font></span><font class="Apple-style-span" face="tahoma, sans-serif"><span class="Apple-converted-space">&nbsp;</span>KeyFrame* kf,<span class="Apple-converted-space">&nbsp;</span></font><span style="color:blue;"><font class="Apple-style-span" face="tahoma, sans-serif">const</font></span><font class="Apple-style-span" face="tahoma, sans-serif"><span class="Apple-converted-space">&nbsp;</span>KeyFrame* kf2)<span class="Apple-converted-space">&nbsp;</span></font><span style="color:blue;"><font class="Apple-style-span" face="tahoma, sans-serif">const</font></span></span><br><span class="Apple-style-span" style="color:rgb(0, 0, 0);font-family:tahoma;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</span><br><span class="Apple-style-span" style="color:rgb(0, 0, 0);"><font class="Apple-style-span" face="tahoma, sans-serif">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</font><span style="color:blue;"><font class="Apple-style-span" face="tahoma, sans-serif">return</font></span><font class="Apple-style-span" face="tahoma, sans-serif"><span class="Apple-converted-space">&nbsp;</span>kf-&gt;getTime() &lt; kf2-&gt;getTime();</font></span><br><span class="Apple-style-span" style="color:rgb(0, 0, 0);font-family:tahoma;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</span><br><span class="Apple-style-span" style="color:rgb(0, 0, 0);font-family:tahoma;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;};</span><br><span class="Apple-style-span" style="color:rgb(0, 0, 0);font-family:tahoma;">&nbsp;</span><br><span class="Apple-style-span" style="color:rgb(0, 0, 0);"><font class="Apple-style-span" face="tahoma, sans-serif">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</font><span style="color:green;"><font class="Apple-style-span" face="tahoma, sans-serif">// Insert just before upper bound</font></span></span><br><span class="Apple-style-span" style="color:rgb(0, 0, 0);font-family:tahoma;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; KeyFrameList::iterator i =</span><br><span class="Apple-style-span" style="color:rgb(0, 0, 0);font-family:tahoma;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;std::upper_bound(mKeyFrames.begin(), mKeyFrames.end(), kf, KeyFrameTimeLess());</span><br><span class="Apple-style-span" style="color:rgb(0, 0, 0);font-family:tahoma;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; mKeyFrames.insert(i, kf);</span><br><span class="Apple-style-span" style="color:rgb(0, 0, 0);font-family:tahoma;">&nbsp;</span><br><span class="Apple-style-span" style="color:rgb(0, 0, 0);font-family:tahoma;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; _keyFrameDataChanged();</span><br><span class="Apple-style-span" style="color:rgb(0, 0, 0);font-family:tahoma;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; mParent-&gt;_keyFrameListChanged();</span><br><span class="Apple-style-span" style="color:rgb(0, 0, 0);font-family:tahoma;">&nbsp;&nbsp; &nbsp; }</span><br><span class="Apple-style-span" style="color:rgb(0, 0, 0);font-family:tahoma;">&nbsp;&nbsp; &nbsp; DWORD GetKeyFrameCount()</span><br><span class="Apple-style-span" style="color:rgb(0, 0, 0);font-family:tahoma;">&nbsp;&nbsp; &nbsp; {</span><br><span class="Apple-style-span" style="color:rgb(0, 0, 0);"><font class="Apple-style-span" face="tahoma, sans-serif">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</font><span style="color:blue;"><font class="Apple-style-span" face="tahoma, sans-serif">return</font></span><font class="Apple-style-span" face="tahoma, sans-serif"><span class="Apple-converted-space">&nbsp;</span>mKeyFrames.size();</font></span><br><span class="Apple-style-span" style="color:rgb(0, 0, 0);font-family:tahoma;">&nbsp;&nbsp; &nbsp; }</span><br><span class="Apple-style-span" style="color:rgb(0, 0, 0);font-family:tahoma;">};<br><br></span></span><span class="Apple-style-span" style="border-collapse:separate;color:rgb(0, 0, 0);font-family:'Times New Roman';font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;orphans:2;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;"><span class="Apple-style-span" style="border-collapse:separate;color:rgb(0, 0, 0);font-family:'Times New Roman';font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;orphans:2;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;"><span style="color:green;"><span class="Apple-style-span" style="font-size:small;"><font class="Apple-style-span" face="tahoma, sans-serif">//------------------------------------------------------------</font></span></span></span></span><br><span style="font-size:10pt;color:blue;" lang="EN-US"><span class="Apple-style-span" style="color:rgb(0, 0, 0);"><span style="font-size:10pt;color:blue;" lang="EN-US"><font class="Apple-style-span" face="tahoma, sans-serif">class</font></span><span style="font-size:10pt;" lang="EN-US"><font class="Apple-style-span" face="tahoma, sans-serif"><span class="Apple-converted-space">&nbsp;</span>MyAnimation :<span class="Apple-converted-space">&nbsp;</span></font><span style="color:blue;"><font class="Apple-style-span" face="tahoma, sans-serif">public</font></span><font class="Apple-style-span" face="tahoma, sans-serif"><span class="Apple-converted-space">&nbsp;</span>Animation</font></span></span><br><span class="Apple-style-span" style="color:rgb(0, 0, 0);font-family:tahoma;">{</span><br><span class="Apple-style-span" style="color:rgb(0, 0, 0);"><span style="font-size:10pt;color:blue;" lang="EN-US"><font class="Apple-style-span" face="tahoma, sans-serif">public</font></span><span style="font-size:10pt;" lang="EN-US"><font class="Apple-style-span" face="tahoma, sans-serif"><span class="Apple-converted-space">&nbsp;</span>:</font></span></span><br><span class="Apple-style-span" style="color:rgb(0, 0, 0);"><font class="Apple-style-span" face="tahoma, sans-serif">&nbsp;&nbsp; &nbsp;&nbsp;</font><span style="color:blue;"><font class="Apple-style-span" face="tahoma, sans-serif">void</font></span><font class="Apple-style-span" face="tahoma, sans-serif"><span class="Apple-converted-space">&nbsp;</span>LinkSceneNode(<span class="Apple-converted-space">&nbsp;</span></font><span style="color:blue;"><font class="Apple-style-span" face="tahoma, sans-serif">unsigned</font></span><font class="Apple-style-span" face="tahoma, sans-serif"><span class="Apple-converted-space">&nbsp;</span></font><span style="color:blue;"><font class="Apple-style-span" face="tahoma, sans-serif">short</font></span><font class="Apple-style-span" face="tahoma, sans-serif"><span class="Apple-converted-space">&nbsp;</span>handle, SceneNode *new_scene_node )</font></span><br><span class="Apple-style-span" style="color:rgb(0, 0, 0);font-family:tahoma;">&nbsp;&nbsp; &nbsp; {</span><br><span class="Apple-style-span" style="color:rgb(0, 0, 0);"><font class="Apple-style-span" face="tahoma, sans-serif">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; NodeAnimationTrack *ret = getNodeTrack( handle +<span class="Apple-converted-space">&nbsp;</span></font><span style="color:red;"><font class="Apple-style-span" face="tahoma, sans-serif">1</font></span><font class="Apple-style-span" face="tahoma, sans-serif"><span class="Apple-converted-space">&nbsp;</span>);</font></span><br><span class="Apple-style-span" style="color:rgb(0, 0, 0);font-family:tahoma;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; ret-&gt;setAssociatedNode( new_scene_node );</span><br><span class="Apple-style-span" style="color:rgb(0, 0, 0);font-family:tahoma;">&nbsp;&nbsp; &nbsp; }</span><br><span class="Apple-style-span" style="color:rgb(0, 0, 0);"><font class="Apple-style-span" face="tahoma, sans-serif">&nbsp;&nbsp; &nbsp;&nbsp;</font><span style="color:blue;"><font class="Apple-style-span" face="tahoma, sans-serif">void</font></span><font class="Apple-style-span" face="tahoma, sans-serif"><span class="Apple-converted-space">&nbsp;</span>CloneAnimation( Animation *anim, SceneNode *scene_node )</font></span><br><span class="Apple-style-span" style="color:rgb(0, 0, 0);font-family:tahoma;">&nbsp;&nbsp; &nbsp; {</span><br><span class="Apple-style-span" style="color:rgb(0, 0, 0);font-family:tahoma;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; DWORD max = anim-&gt;getNumNodeTracks();</span><br><span class="Apple-style-span" style="color:rgb(0, 0, 0);font-family:tahoma;">&nbsp;&nbsp; &nbsp;</span><br><span class="Apple-style-span" style="color:rgb(0, 0, 0);"><font class="Apple-style-span" face="tahoma, sans-serif">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</font><span style="color:blue;"><font class="Apple-style-span" face="tahoma, sans-serif">for</font></span><font class="Apple-style-span" face="tahoma, sans-serif">( DWORD i =<span class="Apple-converted-space">&nbsp;</span></font><span style="color:red;"><font class="Apple-style-span" face="tahoma, sans-serif">0</font></span><font class="Apple-style-span" face="tahoma, sans-serif">; i &lt; max; ++i )</font></span><br><span class="Apple-style-span" style="color:rgb(0, 0, 0);font-family:tahoma;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; {</span><br><span class="Apple-style-span" style="color:rgb(0, 0, 0);"><font class="Apple-style-span" face="tahoma, sans-serif">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;MyAnimationTrack *track = (MyAnimationTrack*)anim-&gt;getNodeTrack( i +<span class="Apple-converted-space">&nbsp;</span></font><span style="color:red;"><font class="Apple-style-span" face="tahoma, sans-serif">1</font></span><font class="Apple-style-span" face="tahoma, sans-serif"><span class="Apple-converted-space">&nbsp;</span>);</font></span><br><span class="Apple-style-span" style="color:rgb(0, 0, 0);"><font class="Apple-style-span" face="tahoma, sans-serif">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;MyAnimationTrack *new_track = (MyAnimationTrack*)createNodeTrack( i +<span class="Apple-converted-space">&nbsp;</span></font><span style="color:red;"><font class="Apple-style-span" face="tahoma, sans-serif">1</font></span><font class="Apple-style-span" face="tahoma, sans-serif">, scene_node );</font></span><br><span class="Apple-style-span" style="color:rgb(0, 0, 0);font-family:tahoma;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DWORD key_frame_max = track-&gt;GetKeyFrameCount();</span><br><span class="Apple-style-span" style="color:rgb(0, 0, 0);"><font class="Apple-style-span" face="tahoma, sans-serif">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</font><span style="color:blue;"><font class="Apple-style-span" face="tahoma, sans-serif">for</font></span><font class="Apple-style-span" face="tahoma, sans-serif">( DWORD j =<span class="Apple-converted-space">&nbsp;</span></font><span style="color:red;"><font class="Apple-style-span" face="tahoma, sans-serif">0</font></span><font class="Apple-style-span" face="tahoma, sans-serif">; j &lt; key_frame_max; ++j )</font></span><br><span class="Apple-style-span" style="color:rgb(0, 0, 0);font-family:tahoma;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</span><br><span class="Apple-style-span" style="color:rgb(0, 0, 0);font-family:tahoma;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;TransformKeyFrame *key = track-&gt;getNodeKeyFrame( j );</span><br><span class="Apple-style-span" style="color:rgb(0, 0, 0);font-family:tahoma;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;KeyFrame *new_key = key-&gt;_clone( new_track );</span><br><span class="Apple-style-span" style="color:rgb(0, 0, 0);font-family:tahoma;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;new_track-&gt;AddKeyFrame( new_key );</span><br><span class="Apple-style-span" style="color:rgb(0, 0, 0);font-family:tahoma;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</span><br><span class="Apple-style-span" style="color:rgb(0, 0, 0);font-family:tahoma;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</span><br><span class="Apple-style-span" style="color:rgb(0, 0, 0);font-family:tahoma;">&nbsp;&nbsp; &nbsp; }</span><br><span class="Apple-style-span" style="color:rgb(0, 0, 0);font-family:tahoma;">};<br><br></span></span><span class="Apple-style-span" style="border-collapse:separate;color:rgb(0, 0, 0);font-family:'Times New Roman';font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;orphans:2;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;"><span class="Apple-style-span" style="border-collapse:separate;color:rgb(0, 0, 0);font-family:'Times New Roman';font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;orphans:2;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;"><span class="Apple-style-span" style="color:rgb(0, 128, 0);"><span class="Apple-style-span" style="font-size:small;"><font class="Apple-style-span" face="tahoma, sans-serif">// eof</font></span></span></span></span><br></div></span></div>
</span> </div> </span> </a> </div> </div> </div> </div>          <a> </a><a> </a><a> </a><a>                            <span class="Apple-style-span" style="font-family:NSimSun;"></span> </a><p class="MsoNormal" style=""><span style=""></span></p>
<br>上面這MyAnimationTrack和MyAnimation就是用來實作一個我的複製關鍵動畫的方式。<br>這是一個巧妙的小技巧，<br>能跳過編譯器檢查限制來直接存取Ogre3D裡面各物件的private和protected成員變數。<br><br>使用時只要用強制轉換型別即可：<br>Animation *anim = NULL;<br>anim = AV_Common::sGetSceneMgr()-&gt;getAnimation( ani_state_name );<br>MyAnimation *my_anim = (MyAnimation*)anim;<br><br><br>因yahoo blog的字數有限，故無法列出完整程式碼，所以我採用自行開網頁超連結的方式。<br>點選下列網址將列出完整程式碼：<br><br><a target="_new" href="http://avatar996.myweb.hinet.net/AV_Ogre3D-20090325.htm">AV_Ogre3D-20090325.htm</a><br><br>完整程式碼的最下面是...<br>CloneKeyFrameEntity這是複製關鍵動畫的函式.<br>CloneSkeletalEntity這是複製骨骼動畫的函式.<br>這是本文的主題重點喔。<br><br><br><a href="http://avatar996.myweb.hinet.net/AV_Ogre3D-20090325.7z">下載連結：我的Ogre3D研究程式碼下載連結</a><br><a href="http://avatar996.myweb.hinet.net/AV_Ogre3D_SkeletalAnimation_20090325.7z">下載連結：我的Ogre3D此範例執行檔下載連結</a><br><a href="http://avatar996.myweb.hinet.net/VC2005%20debug%20files%20-%20install.7z">下載連結：執行範例執行檔之前，請先安裝此檔案</a><br><br><br>延伸閱讀：<br><a href="http://tw.myblog.yahoo.com/mmogc3d-mmogc3d/article?mid=1823&amp;prev=2044&amp;next=1730&amp;l=f&amp;fid=31" target="_new">3D線上遊戲製作軟體 - 用OGRE搭配Ofusion，包裝出一個紙娃娃模型類別！</a><br><a href="http://tw.myblog.yahoo.com/mmogc3d-mmogc3d/article?mid=1714&amp;prev=1730&amp;next=1693&amp;l=f&amp;fid=31" target="_new">3D線上遊戲製作軟體 - 終於在OGRE3D中學會了將武器連結到手上！</a><br><a href="http://tw.myblog.yahoo.com/mmogc3d-mmogc3d/article?mid=1693&amp;prev=1700&amp;next=1647" target="_new">3D線上遊戲製作軟體 - 終於在Ogre3D中學會組合角色模型零件了.(換裝系統)</a><br><br>]]></description>
            <pubDate>Wed, 25 Mar 2009 15:17:07 +0800</pubDate>
            <guid><![CDATA[http://tw.myblog.yahoo.com/mmogc3d-mmogc3d/article?mid=2044]]></guid>
         </item>         <item>
            <title><![CDATA[勇者大人經驗分享 - 遊戲事件驅動框架實作 - 使用SDL]]></title>
            <link><![CDATA[http://tw.myblog.yahoo.com/mmogc3d-mmogc3d/article?mid=1975]]></link>
            <description><![CDATA[<img src="http://tw.blog.yahoo.com/photo/photo.php?id=OQMkgNiTBhY7.INyl6N1stA-&amp;photo=tn_F23_20080304082100637.jpg"/><br><br><br>最近翻出一個有價值的東西，可以給想朝專業遊戲程式設計的人參考的東西。<br>就是<span style="color:rgb(0, 0, 255);">遊戲事件驅動框架</span>！<br>當初這是要教我一個企劃朋友寫程式，所做的一個示範，讓他學習用的。<br>不過，沒多久...他仍是放棄嚕^_^b<br><br>萬丈高樓平地起，想要建構遊戲，則地基必須得穩固才行！<br>如果想急於撰寫有圖形效果的視窗遊戲，<br>可以先採用ＳＤＬ多媒體函式庫喔。<br><a href="http://www.libsdl.org/" target="_new"><img src="http://www.libsdl.org/images/SDL_logo.png" border="0" width="457" height="266"/></a><br>網址：<a target="_new" href="http://www.libsdl.org/">SDL官方網站</a>&nbsp; (或是點選上面的SDL圖示)<br>不過呢，最好得有一點基礎的英文文件閱讀能力才好＠＠<br>還好的是...網路上仍是有一些簡體的SDL介紹和使用的文章可以參考！<br>另外這是wiki上關於SDL的介紹： <a target="_new" href="http://zh.wikipedia.org/wiki/SDL">維基百科 - SDL</a><br><br><br>我示範的這個遊戲事件驅動框架類別就是以SDL<span style="color:rgb(0, 0, 255);"></span>為核心來製作的。<br>當然也可以用其他的核心來改寫，而框架設計理念仍是不變的。<br><br>此範例中，能簡單的初始化視窗，然後簡單的載入ｂｍｐ圖形。<br>主要目的則是示範什麼是<span style="color:rgb(255, 0, 0);">實務面上所使用到的遊戲事件驅動框架</span>！<br><br>以下則列出重點的程式碼！<br><br><br>下面這個是屬於引擎範圍的程式碼，我稱之為框架層。<br>遊戲事件驅動框架類別 - 框架層&nbsp; 範例如下：<span style="font-family:NSimSun;color:blue;" lang="EN-US"></span><br><div style="overflow:scroll;width:645px;height:725px;background-color:rgb(250, 250, 250);"><pre><!--[if gte mso 9]&gt;     Normal   0      0   2                                                     MicrosoftInternetExplorer4   --><style><!--/* Font Definitions */_filtered {font-family:新細明體;panose-1:2 2 3 0 0 0 0 0 0 0;}_filtered {font-family:NSimSun;panose-1:2 1 6 9 3 1 1 1 1 1;line-height:12pt;}_filtered {panose-1:2 1 6 9 3 1 1 1 1 1;}_filtered {panose-1:2 2 3 0 0 0 0 0 0 0;}/* Style Definitions */p.MsoNormal, li.MsoNormal, div.MsoNormal 	{margin:0cm;margin-bottom:.0001pt;font-size:12.0pt;font-family:"Times New Roman";}/* Page Definitions */_filtered {}_filtered {margin:72.0pt 90.0pt 72.0pt 90.0pt;}div.Section1 	{}--></style><!--[if gte mso 10]&gt; <style>table.MsoNormalTable 	{font-size:10.0pt;font-family:"Times New Roman";}</style> --></pre><div class="Section1" style=""><div class="ArwC7c ckChnd">  <div class="Section1">  <span style="font-family:NSimSun;" lang="EN-US"></span><span style="font-family:NSimSun;color:blue;" lang="EN-US">#include</span><span style="font-family:NSimSun;" lang="EN-US"> <span style="color:rgb(163, 21, 21);">&quot;GameFramework.h&quot;</span></span><br> <span style="font-family:NSimSun;color:rgb(163, 21, 21);" lang="EN-US"> &nbsp;</span><br> <span style="font-family:NSimSun;color:green;" lang="EN-US">//=================================================================================================================</span><br> <span style="font-family:NSimSun;" lang="EN-US">GameFramework::GameFramework()</span><br> <span style="font-family:NSimSun;" lang="EN-US">{</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>pKeys = NULL;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>pScreen = NULL;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>MouseX = MouseY = <span style="color:red;">0</span>;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>QuitFlag = FALSE;</span><br> <span style="font-family:NSimSun;" lang="EN-US">}</span><br> <span style="font-family:NSimSun;" lang="EN-US"> &nbsp;</span><br> <span style="font-family:NSimSun;color:green;" lang="EN-US">//=================================================================================================================</span><br> <span style="font-family:NSimSun;" lang="EN-US">GameFramework::~GameFramework()</span><br> <span style="font-family:NSimSun;" lang="EN-US">{</span><br> <span style="font-family:NSimSun;" lang="EN-US">}</span><br> <span style="font-family:NSimSun;" lang="EN-US"> &nbsp;</span><br> <span style="font-family:NSimSun;color:green;" lang="EN-US">//=================================================================================================================</span><br> <span style="font-family:NSimSun;color:blue;" lang="EN-US">void</span><span style="font-family:NSimSun;" lang="EN-US"> GameFramework::WaitFrame()<span style="">&nbsp; </span><span style="color:green;">// 設定FRAMES的速率</span></span><br> <span style="font-family:NSimSun;" lang="EN-US">{</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">static</span> Uint32 next_tick = <span style="color:red;">0</span>;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>Uint32 this_tick;</span><br> <span style="font-family:NSimSun;" lang="EN-US"> &nbsp;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span><span style="color:green;">/* Wait for the next frame */</span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>this_tick = SDL_GetTicks(); </span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">if</span>( this_tick &lt; next_tick )</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>{</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>SDL_Delay(next_tick-this_tick);</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>}</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>next_tick = this_tick + (<span style="color:red;">1000</span>/FRAMES_PER_SEC);</span><br> <span style="font-family:NSimSun;" lang="EN-US">}</span><br> <span style="font-family:NSimSun;" lang="EN-US"> &nbsp;</span><br> <span style="font-family:NSimSun;color:green;" lang="EN-US">//=================================================================================================================</span><br> <span style="font-family:NSimSun;" lang="EN-US">BOOL GameFramework::LoadBMP( SDL_Surface *screen, SDL_Surface **image, <br><span style="color:blue;"></span></span> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family:NSimSun;" lang="EN-US"><span style="color:blue;">char</span> *bmp_file_name, BOOL transparent_flag )</span><br> <span style="font-family:NSimSun;" lang="EN-US">{</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>SDL_Surface *imagebmp = NULL;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>Uint8 *buffer = NULL;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">int</span> i = <span style="color:red;">0</span>;</span><br> <span style="font-family:NSimSun;" lang="EN-US"> &nbsp;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span><span style="color:green;">/* Load a BMP image into a surface */</span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>imagebmp = SDL_LoadBMP( bmp_file_name );</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">if</span>( imagebmp == NULL )</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>{</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Debug::WBox( <span style="color:rgb(163, 21, 21);">&quot;GameFramework::LoadBMP<span style="">&nbsp;&nbsp; </span>&#92;<br></span></span> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family:NSimSun;" lang="EN-US"><span style="color:rgb(163, 21, 21);">it can&#39;t open the file. file name : &quot;</span>, bmp_file_name );</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">return</span> FALSE;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>}</span><br> <span style="font-family:NSimSun;" lang="EN-US"> &nbsp;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span><span style="color:green;">/* Set the video colormap */</span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">if</span>( imagebmp-&gt;format-&gt;palette != NULL )</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>{</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>SDL_SetColors(screen,</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="">&nbsp; </span>imagebmp-&gt;format-&gt;palette-&gt;colors, <span style="color:red;">0</span>,<span style="">&nbsp; </span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="">&nbsp; </span>imagebmp-&gt;format-&gt;palette-&gt;ncolors);</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>}</span><br> <span style="font-family:NSimSun;" lang="EN-US"> &nbsp;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span><span style="color:green;">/* Convert the image to the video format (maps colors) */</span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>*image = SDL_DisplayFormat(imagebmp);</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>SDL_FreeSurface(imagebmp);</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">if</span>( *image == NULL )</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>{</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Debug::WBox( <span style="color:rgb(163, 21, 21);">&quot;GameFramework::LoadBMP<span style="">&nbsp;&nbsp; &#92;<br></span></span></span> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family:NSimSun;" lang="EN-US"><span style="color:rgb(163, 21, 21);"><span style=""></span>SDL_DisplayFormat return NULL&quot;</span> );</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">return</span> FALSE;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>}</span><br> <span style="font-family:NSimSun;" lang="EN-US"> &nbsp;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">if</span>( transparent_flag )</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>SDL_SetColorKey( *image, SDL_SRCCOLORKEY, <br></span> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family:NSimSun;" lang="EN-US">*((Uint32 *)(*image)-&gt;pixels) );</span><br><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">return</span> TRUE;</span><br> <span style="font-family:NSimSun;" lang="EN-US">}<span style="">&nbsp;&nbsp; </span></span><br> <span style="font-family:NSimSun;" lang="EN-US"> &nbsp;</span><br> <span style="font-family:NSimSun;color:green;" lang="EN-US">//==========================================================================================================================================================</span><br> <span style="font-family:NSimSun;" lang="EN-US">BOOL GameFramework::RectCollision( SDL_Rect *rect1, SDL_Rect *rect2 )</span><br> <span style="font-family:NSimSun;" lang="EN-US">{</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>RECT src_scope;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>RECT dst_scope;</span><br> <span style="font-family:NSimSun;" lang="EN-US"> &nbsp;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>src_scope.left<span style="">&nbsp;&nbsp; </span>= rect1-&gt;x;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>src_scope.top<span style="">&nbsp;&nbsp;&nbsp; </span>= rect1-&gt;y;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>src_scope.right<span style="">&nbsp; </span>= src_scope.left + rect1-&gt;w;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>src_scope.bottom = src_scope.top<span style="">&nbsp; </span>+ rect1-&gt;h;</span><br> <span style="font-family:NSimSun;" lang="EN-US"> &nbsp;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>dst_scope.left<span style="">&nbsp;&nbsp; </span>= rect2-&gt;x;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>dst_scope.top<span style="">&nbsp;&nbsp;&nbsp; </span>= rect2-&gt;y;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>dst_scope.right<span style="">&nbsp; </span>= dst_scope.left + rect2-&gt;w;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>dst_scope.bottom = dst_scope.top<span style="">&nbsp; </span>+ rect2-&gt;h;</span><br> <span style="font-family:NSimSun;" lang="EN-US"> &nbsp;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span><span style="color:green;">// 判斷該來源矩形是否有侵入於目地矩形範圍內...</span></span><br> <span style="font-family:NSimSun;color:green;" lang="EN-US"> &nbsp;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">if</span>( src_scope.right<span style="">&nbsp; </span>&lt;= dst_scope.left<span style="">&nbsp; </span>||</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span><span style="">&nbsp;&nbsp;&nbsp; </span>src_scope.left<span style="">&nbsp;&nbsp; </span>&gt;= dst_scope.right ||</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span><span style="">&nbsp;&nbsp;&nbsp; </span>src_scope.bottom &lt;= dst_scope.top<span style="">&nbsp;&nbsp; </span>|| </span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span><span style="">&nbsp;&nbsp;&nbsp; </span>src_scope.top<span style="">&nbsp;&nbsp;&nbsp; </span>&gt;= dst_scope.bottom )</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span><span style="">&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">return</span> FALSE;</span><br> <span style="font-family:NSimSun;" lang="EN-US"> &nbsp;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">return</span> TRUE;</span><br> <span style="font-family:NSimSun;" lang="EN-US">}</span><br> <span style="font-family:NSimSun;" lang="EN-US"> &nbsp;</span><br> <span style="font-family:NSimSun;color:green;" lang="EN-US">//==========================================================================================================================================================</span><br> <span style="font-family:NSimSun;color:blue;" lang="EN-US">void</span><span style="font-family:NSimSun;" lang="EN-US"> GameFramework::Create()</span><br> <span style="font-family:NSimSun;" lang="EN-US">{</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span><span style="color:green;">/* Initialize SDL */</span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">if</span>( SDL_Init( SDL_INIT_VIDEO ) &lt; <span style="color:red;">0</span> )</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>{</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Debug::WBox( <span style="color:rgb(163, 21, 21);">&quot;GameFrameworkManager::vCreate<span style="">&nbsp;&nbsp; </span>SDL_Init is failed.&quot;</span> );</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">return</span>;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>}</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>atexit( SDL_Quit );</span><br> <span style="font-family:NSimSun;" lang="EN-US"> &nbsp;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span><span style="color:green;">/* Set the video mode (800x600 at native depth) */</span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>pScreen = SDL_SetVideoMode( <span style="color:red;">800</span>, <span style="color:red;">600</span>, <span style="color:red;">0</span>, SDL_HWSURFACE|SDL_ANYFORMAT );</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">if</span>( pScreen == NULL )</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>{</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Debug::WBox( <span style="color:rgb(163, 21, 21);">&quot;GameFrameworkManager::vCreate<span style="">&nbsp;&nbsp; &#92;<br></span></span></span> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family:NSimSun;" lang="EN-US"><span style="color:rgb(163, 21, 21);"><span style=""></span>SDL_SetVideoMode is failed.&quot;</span> );</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">return</span>;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>}</span><br> <span style="font-family:NSimSun;" lang="EN-US">}</span><br> <span style="font-family:NSimSun;" lang="EN-US"> &nbsp;</span><br> <span style="font-family:NSimSun;color:green;" lang="EN-US">//==========================================================================================================================================================</span><br> <span style="font-family:NSimSun;color:blue;" lang="EN-US">void</span><span style="font-family:NSimSun;" lang="EN-US"> GameFramework::Run()</span><br> <span style="font-family:NSimSun;" lang="EN-US">{</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>vOnInitiate();</span><br> <span style="font-family:NSimSun;" lang="EN-US"> &nbsp;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">while</span>( <span style="color:red;">1</span> )</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>{</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:green;">//--------------------------------------------------------------------</span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:green;">// windows系統訊息運作</span></span><br> <span style="font-family:NSimSun;color:green;" lang="EN-US"> &nbsp;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:green;">// Poll input queue</span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>SDL_PollEvent( &amp;SDLEvent );</span><br> <span style="font-family:NSimSun;" lang="EN-US"> &nbsp;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">if</span> ( SDLEvent.type == SDL_QUIT ) <span style="color:green;">// press X button to quit.</span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">break</span>;</span><br> <span style="font-family:NSimSun;" lang="EN-US"> &nbsp;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>pKeys = SDL_GetKeyState( NULL );</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>SDL_GetMouseState( &amp;MouseX, &amp;MouseY );</span><br> <span style="font-family:NSimSun;" lang="EN-US"> &nbsp;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:green;">//--------------------------------------------------------------------</span></span><br> <span style="font-family:NSimSun;color:green;" lang="EN-US"> &nbsp;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>vOnNormalUpdate();</span><br> <span style="font-family:NSimSun;" lang="EN-US"> &nbsp;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>_MOUSE_STATE_TYPE_ type = MOUSE_STATE_NULL;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">if</span>( SDLEvent.motion.type == SDL_MOUSEBUTTONDOWN )</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">if</span>( SDLEvent.button.button == SDL_BUTTON_LEFT )</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>type = MOUSE_STATE_LEFT_DOWN;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">else</span> <span style="color:blue;">if</span>( SDLEvent.button.button == SDL_BUTTON_RIGHT )</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>type = MOUSE_STATE_RIGHT_DOWN;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">else</span> <span style="color:blue;">if</span>( SDLEvent.motion.type == SDL_MOUSEBUTTONUP )</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">if</span>( SDLEvent.button.button == SDL_BUTTON_LEFT )</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>type = MOUSE_STATE_LEFT_UP;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">else</span> <span style="color:blue;">if</span>( SDLEvent.button.button == SDL_BUTTON_RIGHT )</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>type = MOUSE_STATE_RIGHT_UP;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span><br> <span style="font-family:NSimSun;" lang="EN-US"> &nbsp;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">switch</span> ( type )</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">case</span> MOUSE_STATE_LEFT_DOWN :</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>LeftDownFlag = TRUE;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>vOnMouseLeftDown();</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">break</span>;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">case</span> MOUSE_STATE_RIGHT_DOWN :</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>RightDownFlag = TRUE;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>vOnMouseRightDown();</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">break</span>;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">case</span> MOUSE_STATE_LEFT_UP :</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>LeftDownFlag = FALSE;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>LeftDownDBFlag = FALSE;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>vOnMouseLeftUp();</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">break</span>;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">case</span> MOUSE_STATE_RIGHT_UP :</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>RightDownFlag = FALSE;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>vOnMouseRightUp();</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">break</span>;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">case</span> MOUSE_STATE_LEFT_DOWN_DB :</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>LeftDownDBFlag = TRUE;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>vOnMouseLeftDownDB();</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">break</span>;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>};</span><br> <span style="font-family:NSimSun;" lang="EN-US"> &nbsp;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">if</span>( QuitFlag )</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">break</span>;</span><br> <span style="font-family:NSimSun;" lang="EN-US"> &nbsp;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">if</span>( SDLEvent.type == SDL_KEYDOWN || SDLEvent.type == SDL_KEYUP )</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>vOnKeyboard();</span><br> <span style="font-family:NSimSun;" lang="EN-US"> &nbsp;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>vOnTailNormalUpdate();</span><br> <span style="font-family:NSimSun;" lang="EN-US"> &nbsp;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>vOnShow();</span><br> <span style="font-family:NSimSun;" lang="EN-US"> &nbsp;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:green;">// Wait for the next frame // 控制畫面更新率</span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>WaitFrame();</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>}</span><br> <span style="font-family:NSimSun;" lang="EN-US"> &nbsp;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>vOnTerminate();</span><br> <span style="font-family:NSimSun;" lang="EN-US">}</span><br> <span style="font-family:NSimSun;" lang="EN-US"> &nbsp;</span><br> <span style="font-family:NSimSun;color:green;" lang="EN-US">// eof</span><span lang="EN-US"></span></div> <div class="Section1" style="margin-left:40px;">                                                                                                                                                                                                                                                                                                                                                                                                                                                                                </div>   </div> </div>  </div><font face="simsun"><br><br></font><font face="simsun"><br>下面這個就是實際上</font><font face="simsun">寫遊戲邏輯的區塊嚕～</font><br>所以我稱之為應用層。<br>遊戲事件驅動框架類別 - 應用層&nbsp; 範例如下：<span style="font-family:NSimSun;color:blue;" lang="EN-US"></span><br><div style="overflow:scroll;width:645px;height:725px;background-color:rgb(250, 250, 250);"><pre><!--[if gte mso 9]&gt;     Normal   0      0   2                                                     MicrosoftInternetExplorer4   --><style><!--/* Font Definitions */_filtered {font-family:新細明體;panose-1:2 2 3 0 0 0 0 0 0 0;}_filtered {font-family:NSimSun;panose-1:2 1 6 9 3 1 1 1 1 1;line-height:12pt;}_filtered {panose-1:2 1 6 9 3 1 1 1 1 1;}_filtered {panose-1:2 2 3 0 0 0 0 0 0 0;}/* Style Definitions */p.MsoNormal, li.MsoNormal, div.MsoNormal 	{margin:0cm;margin-bottom:.0001pt;font-size:12.0pt;font-family:"Times New Roman";}/* Page Definitions */_filtered {}_filtered {margin:72.0pt 90.0pt 72.0pt 90.0pt;}div.Section1 	{}--></style><!--[if gte mso 10]&gt; <style>table.MsoNormalTable 	{font-size:10.0pt;font-family:"Times New Roman";}</style> --></pre><div class="Section1" style=""><div class="ArwC7c ckChnd">  <div class="Section1">  <span style="font-family:NSimSun;" lang="EN-US"></span><span style="font-family:NSimSun;color:blue;" lang="EN-US"></span>  <div class="Section1"><br><span style="font-family:NSimSun;" lang="EN-US"></span> <span style="font-family:NSimSun;color:blue;" lang="EN-US">#include</span><span style="font-family:NSimSun;" lang="EN-US"> <span style="color:rgb(163, 21, 21);"></span></span><span style="font-family:NSimSun;" lang="EN-US"><span style="color:rgb(163, 21, 21);">&quot;windows.h&quot;</span></span><br> <span style="font-family:NSimSun;color:blue;" lang="EN-US">#include</span><span style="font-family:NSimSun;" lang="EN-US"> <span style="color:rgb(163, 21, 21);">&quot;..&#92;VictorEngine&#92;General&#92;GameFramework.h&quot;</span></span><br> <span style="font-family:NSimSun;color:rgb(163, 21, 21);" lang="EN-US">&nbsp;</span><br> <span style="font-family:NSimSun;color:green;" lang="EN-US">//=================================================================================================================</span><br> <span style="font-family:NSimSun;color:blue;" lang="EN-US">class</span><span style="font-family:NSimSun;" lang="EN-US"> GameApp : <span style="color:blue;">public</span> GameFramework&nbsp; </span><br> <span style="font-family:NSimSun;" lang="EN-US">{</span><br> <span style="font-family:NSimSun;color:blue;" lang="EN-US">public</span><span style="font-family:NSimSun;" lang="EN-US"> :</span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp; <span style="color:green;">//------------------------------------------------------------</span></span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp; SDL_Surface *pBackground;</span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp; SDL_Surface *pCursor;</span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp; <span style="color:green;">//------------------------------------------------------------</span></span><br> <span style="font-family:NSimSun;color:blue;" lang="EN-US">public</span><span style="font-family:NSimSun;" lang="EN-US"> :</span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp; <span style="color:green;">//------------------------------------------------------------</span></span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp; <span style="color:green;">// Event Driven Function</span></span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp; <span style="color:blue;">virtual</span> <span style="color:blue;">void</span> vOnInitiate&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><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp; <span style="color:blue;">virtual</span> <span style="color:blue;">void</span> vOnTerminate&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><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp; <span style="color:green;">//------------------------------------------------------------</span></span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp; <span style="color:blue;">virtual</span> <span style="color:blue;">void</span> vOnNormalUpdate&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><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp; <span style="color:green;">//--------------------------------</span></span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp; <span style="color:blue;">virtual</span> <span style="color:blue;">void</span> vOnMouseLeftDown&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><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp; <span style="color:blue;">virtual</span> <span style="color:blue;">void</span> vOnMouseRightDown&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><br> <span style="font-family:NSimSun;color:green;" lang="EN-US">//&nbsp; virtual void vOnMouseLeftDownDB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ();</span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp; <span style="color:blue;">virtual</span> <span style="color:blue;">void</span> vOnMouseLeftUp&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><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp; <span style="color:blue;">virtual</span> <span style="color:blue;">void</span> vOnMouseRightUp&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><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp; <span style="color:green;">//--------------------------------</span></span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp; <span style="color:blue;">virtual</span> <span style="color:blue;">void</span> vOnKeyboard&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><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp; <span style="color:blue;">virtual</span> <span style="color:blue;">void</span> vOnTailNormalUpdate&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ();</span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp; <span style="color:green;">//--------------------------------</span></span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp; <span style="color:blue;">virtual</span> <span style="color:blue;">void</span> vOnShow&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><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp; <span style="color:green;">//------------------------------------------------------------</span></span><br> <span style="font-family:NSimSun;" lang="EN-US">}gApp;</span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;</span><br> <span style="font-family:NSimSun;color:green;" lang="EN-US">//=================================================================================================================</span><br> <span style="font-family:NSimSun;" lang="EN-US">INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )</span><br> <span style="font-family:NSimSun;" lang="EN-US">{</span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp; gApp.Create();</span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp; gApp.Run();</span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;</span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp; <span style="color:blue;">return</span> <span style="color:red;">0</span>;</span><br> <span style="font-family:NSimSun;" lang="EN-US">}</span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;</span><br> <span style="font-family:NSimSun;color:green;" lang="EN-US">//=================================================================================================================</span><br> <span style="font-family:NSimSun;color:blue;" lang="EN-US">void</span><span style="font-family:NSimSun;" lang="EN-US"> GameApp::vOnInitiate()</span><br> <span style="font-family:NSimSun;" lang="EN-US">{</span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp; pBackground = NULL;</span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp; pCursor = NULL;</span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp; LoadBMP( pScreen, &amp;pBackground, <span style="color:rgb(163, 21, 21);">&quot;image.BMP&quot;</span> );</span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp; LoadBMP( pScreen, &amp;pCursor, <span style="color:rgb(163, 21, 21);">&quot;logo.bmp&quot;</span> );</span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;</span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp; SDL_ShowCursor( <span style="color:red;">0</span> ); <span style="color:green;">// 隱藏系統鼠標</span></span><br> <span style="font-family:NSimSun;" lang="EN-US">}</span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;</span><br> <span style="font-family:NSimSun;color:green;" lang="EN-US">//=================================================================================================================</span><br> <span style="font-family:NSimSun;color:blue;" lang="EN-US">void</span><span style="font-family:NSimSun;" lang="EN-US"> GameApp::vOnTerminate()</span><br> <span style="font-family:NSimSun;" lang="EN-US">{</span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp; SDL_FreeSurface( pBackground );</span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp; SDL_FreeSurface( pCursor );</span><br> <span style="font-family:NSimSun;" lang="EN-US">}</span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;</span><br> <span style="font-family:NSimSun;color:green;" lang="EN-US">//=================================================================================================================</span><br> <span style="font-family:NSimSun;color:blue;" lang="EN-US">void</span><span style="font-family:NSimSun;" lang="EN-US"> GameApp::vOnNormalUpdate()</span><br> <span style="font-family:NSimSun;" lang="EN-US">{</span><br> <span style="font-family:NSimSun;" lang="EN-US">}</span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;</span><br> <span style="font-family:NSimSun;color:green;" lang="EN-US">//=================================================================================================================</span><br> <span style="font-family:NSimSun;color:blue;" lang="EN-US">void</span><span style="font-family:NSimSun;" lang="EN-US"> GameApp::vOnMouseLeftDown()</span><br> <span style="font-family:NSimSun;" lang="EN-US">{</span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp; Debug::WBox( <span style="color:rgb(163, 21, 21);">&quot;vOnMouseLeftDown MouseX=%d, MouseY=%d&quot;</span>, MouseX, MouseY );</span><br> <span style="font-family:NSimSun;" lang="EN-US">}</span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;</span><br> <span style="font-family:NSimSun;color:green;" lang="EN-US">//=================================================================================================================</span><br> <span style="font-family:NSimSun;color:blue;" lang="EN-US">void</span><span style="font-family:NSimSun;" lang="EN-US"> GameApp::vOnMouseRightDown()</span><br> <span style="font-family:NSimSun;" lang="EN-US">{</span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp; Debug::WBox( <span style="color:rgb(163, 21, 21);">&quot;vOnMouseRightDown&quot;</span> );</span><br> <span style="font-family:NSimSun;" lang="EN-US">}</span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;</span><br> <span style="font-family:NSimSun;color:green;" lang="EN-US">//=================================================================================================================</span><br> <span style="font-family:NSimSun;color:blue;" lang="EN-US">void</span><span style="font-family:NSimSun;" lang="EN-US"> GameApp::vOnMouseLeftUp()</span><br> <span style="font-family:NSimSun;" lang="EN-US">{</span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp; Debug::WBox( <span style="color:rgb(163, 21, 21);">&quot;vOnMouseLeftUp&quot;</span> );</span><br> <span style="font-family:NSimSun;" lang="EN-US">}</span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;</span><br> <span style="font-family:NSimSun;color:green;" lang="EN-US">//=================================================================================================================</span><br> <span style="font-family:NSimSun;color:blue;" lang="EN-US">void</span><span style="font-family:NSimSun;" lang="EN-US"> GameApp::vOnMouseRightUp()</span><br> <span style="font-family:NSimSun;" lang="EN-US">{</span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp; Debug::WBox( <span style="color:rgb(163, 21, 21);">&quot;vOnMouseRightUp&quot;</span> );</span><br> <span style="font-family:NSimSun;" lang="EN-US">}</span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;</span><br> <span style="font-family:NSimSun;color:green;" lang="EN-US">//=================================================================================================================</span><br> <span style="font-family:NSimSun;color:blue;" lang="EN-US">void</span><span style="font-family:NSimSun;" lang="EN-US"> GameApp::vOnKeyboard()</span><br> <span style="font-family:NSimSun;" lang="EN-US">{</span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp; <span style="color:green;">// 鍵盤訊息- 按下ESC 鍵離開程式</span></span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp; <span style="color:blue;">if</span> ( pKeys[ SDLK_ESCAPE ] == SDL_PRESSED ) <span style="color:green;">// quit</span></span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QuitFlag = TRUE;</span><br> <span style="font-family:NSimSun;" lang="EN-US">}</span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;</span><br> <span style="font-family:NSimSun;color:green;" lang="EN-US">//=================================================================================================================</span><br> <span style="font-family:NSimSun;color:blue;" lang="EN-US">void</span><span style="font-family:NSimSun;" lang="EN-US"> GameApp::vOnTailNormalUpdate()</span><br> <span style="font-family:NSimSun;" lang="EN-US">{</span><br> <span style="font-family:NSimSun;" lang="EN-US">}</span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;</span><br> <span style="font-family:NSimSun;color:green;" lang="EN-US">//=================================================================================================================</span><br> <span style="font-family:NSimSun;color:blue;" lang="EN-US">void</span><span style="font-family:NSimSun;" lang="EN-US"> GameApp::vOnShow()</span><br> <span style="font-family:NSimSun;" lang="EN-US">{</span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp; SDL_Rect background_rect; <span style="color:green;">// 底圖目的大小</span></span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp; background_rect.x = <span style="color:red;">0</span>;</span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp; background_rect.y = <span style="color:red;">0</span>;</span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp; background_rect.w = pBackground-&gt;w;</span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp; background_rect.h = pBackground-&gt;h;<br></span><span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp; <span style="color:green;">// 秀底圖</span></span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp; <span style="color:blue;">if</span>( SDL_BlitSurface( pBackground, NULL, pScreen, &amp;background_rect ) &lt; <span style="color:red;">0</span> )</span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp; {</span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp; }</span><br><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp; SDL_Rect cursor_rect; <span style="color:green;">// 鼠標目的大小</span></span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp; cursor_rect.x = MouseX;</span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp; cursor_rect.y = MouseY;</span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp; cursor_rect.w = pCursor-&gt;w;</span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp; cursor_rect.h = pCursor-&gt;h;<br>&nbsp; &nbsp; </span><span style="font-family:NSimSun;" lang="EN-US"> <span style="color:green;">// 秀鼠標</span></span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp; <span style="color:blue;">if</span>( SDL_BlitSurface( pCursor, NULL, pScreen, &amp;cursor_rect ) &lt; <span style="color:red;">0</span> )</span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp; {</span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp; }</span><br> <span style="font-family:NSimSun;color:blue;" lang="EN-US"></span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family:NSimSun;" lang="EN-US"><span style="color:green;">// 將screen背後緩衝區秀到螢幕畫面上</span></span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;&nbsp;&nbsp; SDL_UpdateRects( pScreen, <span style="color:red;">1</span>, &amp;background_rect );</span><br> <span style="font-family:NSimSun;" lang="EN-US">}</span><br> <span style="font-family:NSimSun;" lang="EN-US">&nbsp;</span><br> <span style="font-family:NSimSun;color:green;" lang="EN-US">// eof</span></div><div class="Section1" style="margin-left:40px;">                                                                                                                                                                                                                                                                                            </div>   <br><span lang="EN-US"></span></div> <div class="Section1" style="margin-left:40px;"> </div>   </div> </div>  </div><font face="simsun"><br><br>若想看完整的</font>SDL版事件驅動架構範例<font face="simsun">程式碼，請於此下載。<br><br></font><span style="color:rgb(255, 0, 0);">程式碼下載：</span><a href="http://avatar996.myweb.hinet.net/GAMEsnake-20090220.7z">我的SDL版事件驅動架構範例程式碼下載連結</a><br><br>我已經盡量寫得很簡潔...<br>如果網友還是看不懂的話，請先去熟讀C++的<span style="color:rgb(128, 0, 255);">繼承</span>和<span style="color:rgb(128, 0, 255);">多行與虛擬</span>喔。<br>加油！<br><br>enjoy it !<br><br><br><br>延伸閱讀：<br><a target="_new" href="http://tw.myblog.yahoo.com/mmogc3d-mmogc3d/article?mid=1009&amp;prev=1975&amp;next=786&amp;l=f&amp;fid=30">勇者大人經驗分享 - 如何成為一位專業的遊戲程式設計師（三）- 遊戲框架篇</a><br>]]></description>
            <pubDate>Fri, 20 Feb 2009 05:31:28 +0800</pubDate>
            <guid><![CDATA[http://tw.myblog.yahoo.com/mmogc3d-mmogc3d/article?mid=1975]]></guid>
         </item>         <item>
            <title><![CDATA[3D線上遊戲製作軟體 - 勇者大人的記憶體池(memory pool)使用方法簡介.]]></title>
            <link><![CDATA[http://tw.myblog.yahoo.com/mmogc3d-mmogc3d/article?mid=1912]]></link>
            <description><![CDATA[<!--[if gte mso 9]&gt;     Normal   0      0   2                                                     MicrosoftInternetExplorer4   --><style><!--/* Font Definitions */_filtered {font-family:新細明體;panose-1:2 2 3 0 0 0 0 0 0 0;}_filtered {font-family:NSimSun;panose-1:2 1 6 9 3 1 1 1 1 1;}_filtered {panose-1:2 1 6 9 3 1 1 1 1 1;}_filtered {panose-1:2 2 3 0 0 0 0 0 0 0;}/* Style Definitions */p.MsoNormal, li.MsoNormal, div.MsoNormal 	{margin:0cm;margin-bottom:.0001pt;font-size:12.0pt;font-family:"Times New Roman";}/* Page Definitions */_filtered {}_filtered {margin:72.0pt 89.85pt 72.0pt 89.85pt;}div.Section1 	{}--></style><!--[if gte mso 10]&gt; <style>table.MsoNormalTable 	{font-size:10.0pt;font-family:"Times New Roman";}</style> --><img src="http://tw.blog.yahoo.com/photo/photo.php?id=OQMkgNiTBhY7.INyl6N1stA-&amp;photo=tn_20080130081218667.jpg"/><br><br><br><br>我認為精通活用資料結構是非常重要的內功！（我也還在學...）<br><br>我設計的記憶體池管理類別，就是善用資料結構的產物。（哈～自賣自誇）<br><br>&nbsp;任何種類的記憶體池管理類別都是為了解決某一種需求而設計出來的。<br>當然，我這東西仍在持續改進中...<br><br>我只是單純的分享一下我的設計方式，網友若有更好的設計方式，<br>也麻煩分享給我喔！<br><br><br>有網友就問我該如何使用這些記憶體池管理類別呢！？<br> 那我就介紹一下一些我常用的記憶體池管理類別。<br><br>記憶體池管理類別&nbsp; 使用範例如下：<br><div style="overflow:scroll;width:645px;height:725px;background-color:rgb(250, 250, 250);"><pre><font face="simsun"><font color="#000000"><font size="3"></font></font></font><!--[if gte mso 9]&gt;     Normal   0      0   2                                                     MicrosoftInternetExplorer4   --><style><!--/* Font Definitions */_filtered {font-family:新細明體;panose-1:2 2 3 0 0 0 0 0 0 0;}_filtered {font-family:NSimSun;panose-1:2 1 6 9 3 1 1 1 1 1;line-height:12pt;}_filtered {panose-1:2 1 6 9 3 1 1 1 1 1;}_filtered {panose-1:2 2 3 0 0 0 0 0 0 0;}/* Style Definitions */p.MsoNormal, li.MsoNormal, div.MsoNormal 	{margin:0cm;margin-bottom:.0001pt;font-size:12.0pt;font-family:"Times New Roman";}/* Page Definitions */_filtered {}_filtered {margin:72.0pt 90.0pt 72.0pt 90.0pt;}div.Section1 	{}--></style><!--[if gte mso 10]&gt; <style>table.MsoNormalTable 	{font-size:10.0pt;font-family:"Times New Roman";}</style> --></pre><div class="Section1" style=""><div class="ArwC7c ckChnd"><span style="font-family:NSimSun;color:blue;" lang="EN-US">void</span><span style="font-family:NSimSun;" lang="EN-US"> Example()</span><br><span style="font-family:NSimSun;" lang="EN-US">{</span><br><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span style="color:green;">// AV_KernelMemoryPool 記憶體池管例類別用法簡介</span></span><br> <span style="font-family:NSimSun;color:green;" lang="EN-US"> &nbsp;</span><br><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>DWORD bytes_1MB = (<span style="color:red;">1024</span> * <span style="color:red;">1024</span>);</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>DWORD memory_pool_bytes_max = bytes_1MB * <span style="color:red;">100</span>;</span><br><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span style="color:green;">// 先配置100MB的總記憶體池</span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>AV_KernelMemoryPool::sMemoryPoolCreate( memory_pool_bytes_max );</span><br><span style="font-family:NSimSun;" lang="EN-US"> &nbsp;</span><br><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span style="color:green;">//#####################################################</span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span style="color:green;">// AV_MemoryPool2HeadList 雙向鍊結串列用法簡介</span></span><br><span style="font-family:NSimSun;color:green;" lang="EN-US"> &nbsp;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">struct</span> PlayerInfo <span style="color:green;">// 玩家資訊結構- 假設有此種結構</span></span><br><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>{</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>DWORD Number;</span><br><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">char</span><span>&nbsp; </span>Name[ <span style="color:red;">16</span> ];</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>DWORD Attack;</span><br><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>DWORD Defend;</span><br><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>};</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span></span><br><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span style="color:green;">// 此PlayerTable表格實際上會是定義在例如GameManager這種主類別之中, </span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span style="color:green;">// 現在這只是範例,所以就寫在這裡.</span></span><br><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>AV_MemoryPool2HeadList&lt; PlayerInfo &gt; PlayerTable; <span style="color:green;">// 玩家資訊串列表格</span></span><br> <span style="font-family:NSimSun;color:green;" lang="EN-US"> &nbsp;</span><br><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span style="color:green;">// 初始化表格</span></span><br><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>PlayerTable.Create( <span style="color:red;">100</span> ); <span style="color:green;">// 從總記憶體池配置出100個PlayerInfo的空間</span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span></span><br><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span style="color:green;">// 如果當有需要使用新PlayerInfo節點時...</span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span style="color:green;">// 例如: Client端要登入Server端時, Server端就需要配置該玩家資訊的節點。</span></span><br><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span></span><span style="font-family:NSimSun;" lang="EN-US"><span style="color:green;">// 下面是取得一個新的PlayerInfo節點來用。</span></span> <br> <span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>PlayerInfo *new_player_node = PlayerTable.GetNode();</span><br><span style="font-family:NSimSun;" lang="EN-US"><span></span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span style="color:green;">// 將節點串連起來(也可以不用,看當時的需求)</span></span><br><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span style="color:green;">// 串起來的目的是...如果有尋訪所有使用節點的需求時, 則就會用到.</span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>PlayerTable.Link( new_player_node );</span><br><span style="font-family:NSimSun;" lang="EN-US"> &nbsp;</span><br><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span style="color:green;">// 當不需要用時...</span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span style="color:green;">// 先解開連結</span></span><br><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>PlayerTable.Unlink( new_player_node );</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span style="color:green;">// 再將此節點清除後釋放</span></span><br><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span style="color:green;">// ps: 這不是真正的記憶體釋放,而是將此節點先保留起來,</span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span style="color:green;">&nbsp;&nbsp;&nbsp; </span></span><span style="font-family:NSimSun;" lang="EN-US"><span style="color:green;">// </span></span><span style="font-family:NSimSun;" lang="EN-US"><span style="color:green;">等到下次要GetNode()時</span><span></span><span style="color:green;">,則會優先分配出去使用.</span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>PlayerTable.ReleaseNode( new_player_node );</span><br><span style="font-family:NSimSun;" lang="EN-US"> &nbsp;</span><br><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span style="color:green;">//------------------</span></span><br><br><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span style="color:green;">// 還有一種AV_ MemoryPool2HeadArrayList用法, <br> </span></span><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span></span><span style="font-family:NSimSun;" lang="EN-US"><span style="color:green;">// </span></span><span style="font-family:NSimSun;" lang="EN-US"><span style="color:green;">目的是...不需要向總記憶體池來索取記憶體,</span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span style="color:green;">// 而是用自身的NodeBuffer記憶體來當作串列用的記憶體.</span></span><br><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span style="color:green;">// 我想...這是個很有趣的觀念和用法...</span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span style="color:green;">// 舉例: 假設有這樣的SceneInfo結構...</span></span><br><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">struct</span> SceneInfo</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>{</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span style="color:green;">// 設定NPCTable有100個PlayerInfo空間,但目前還未分配到</span></span><span style="font-family:NSimSun;" lang="EN-US"><span style="color:green;">記憶體.</span></span><br><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>AV_MemoryPool2HeadArrayList&lt; PlayerInfo, <span style="color:red;">100</span> &gt; NPCTable;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span style="color:green;">// 設定EnemyTable有200個</span></span><span style="font-family:NSimSun;" lang="EN-US"><span style="color:green;">PlayerInfo</span></span><span style="font-family:NSimSun;" lang="EN-US"><span style="color:green;">空間,但目前還未分配到</span></span><span style="font-family:NSimSun;" lang="EN-US"><span style="color:green;">記憶體.</span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>AV_MemoryPool2HeadArrayList&lt; PlayerInfo, <span style="color:red;">200</span> &gt; EnemyTable;</span><br><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>};</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>AV_MemoryPool2HeadList&lt; SceneInfo &gt; SceneTable;</span><br><span style="font-family:NSimSun;" lang="EN-US"><span style="color:green;">&nbsp;&nbsp;&nbsp; // 這個5是隨便打的.</span></span><br><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>SceneTable.Create( <span style="color:rgb(255, 0, 0);">5</span><span style="color:red;"></span> );</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>SceneInfo *scene = SceneTable.GetNode();</span> <span style="font-family:NSimSun;" lang="EN-US"><span style="color:green;">// 取得</span></span><span style="font-family:NSimSun;" lang="EN-US"><span style="color:green;"></span></span><span style="font-family:NSimSun;" lang="EN-US"><span style="color:green;">新節點</span></span><br><span style="font-family:NSimSun;" lang="EN-US"><span style="color:green;">&nbsp;&nbsp;&nbsp; // 重點在這...<br></span></span><span style="font-family:NSimSun;" lang="EN-US"><span style="color:green;">&nbsp;&nbsp;&nbsp; </span></span><span style="font-family:NSimSun;" lang="EN-US"><span style="color:green;">// Create內部會將</span></span><span style="font-family:NSimSun;" lang="EN-US"><span style="color:green;">自身的</span></span><span style="font-family:NSimSun;" lang="EN-US"><span style="color:green;">NodeBuffer</span></span><span style="font-family:NSimSun;" lang="EN-US"><span style="color:green;">和自身的<br></span></span><span style="font-family:NSimSun;" lang="EN-US"><span style="color:green;">&nbsp;&nbsp;&nbsp; // pBufferList連接起來</span></span><span style="font-family:NSimSun;" lang="EN-US"><span style="color:green;">, 達到記憶體配置之自給自足喔！</span></span><span style="font-family:NSimSun;" lang="EN-US"><span style="color:green;"></span></span><br><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>scene-&gt;NPCTable.Create();</span> &nbsp; &nbsp;&nbsp; <span style="font-family:NSimSun;" lang="EN-US"><span></span><span style="color:green;">// 分配</span></span><span style="font-family:NSimSun;" lang="EN-US"><span style="color:green;"></span></span><span style="font-family:NSimSun;" lang="EN-US"><span style="color:green;">記憶體</span></span><span style="font-family:NSimSun;" lang="EN-US"><span style="color:green;">,也就是做</span></span><span style="font-family:NSimSun;" lang="EN-US"><span style="color:green;">記憶體連結初始化</span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>scene-&gt;EnemyTable.Create(); </span><span style="font-family:NSimSun;" lang="EN-US"><span style="color:green;">// </span></span><span style="font-family:NSimSun;" lang="EN-US"><span style="color:green;">分配</span></span><span style="font-family:NSimSun;" lang="EN-US"><span style="color:green;"></span></span><span style="font-family:NSimSun;" lang="EN-US"><span style="color:green;">記憶體</span></span><span style="font-family:NSimSun;" lang="EN-US"><span style="color:green;"></span></span><span style="font-family:NSimSun;" lang="EN-US"><span style="color:green;">,也就是做</span></span><span style="font-family:NSimSun;" lang="EN-US"><span style="color:green;">記憶體連結初始化</span></span><br><span style="font-family:NSimSun;" lang="EN-US"> &nbsp;</span><br><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span style="color:green;">// 之後呢...萬一有需要將scene資訊清除時,</span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span style="color:green;">// 可以直接這樣清除... </span></span><br><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>ZeroMemory( scene, <span style="color:blue;">sizeof</span>( SceneInfo ) );</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span style="color:green;">// 或是這樣清除並釋放...</span></span><br><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>SceneTable.ReleaseNode( scene );</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span style="color:green;">// 而不需要再顧慮NPCTable和EnemyTable的記憶體配置釋放問題.</span></span><br><span style="font-family:NSimSun;color:green;" lang="EN-US"> </span> <span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span style="color:green;">// 這種設計方式能達到記憶體不用再歸還作業系統</span></span><span style="font-family:NSimSun;" lang="EN-US"><span style="color:green;">喔</span></span><span style="font-family:NSimSun;" lang="EN-US"><span style="color:green;">.<br><br></span></span><span style="font-family:NSimSun;color:green;" lang="EN-US"></span> <span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span style="color:green;">//#####################################################</span></span><br><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span style="color:green;">// AV_SimpleMemoryPool 小型記憶體池用法簡介</span></span><br> <span style="font-family:NSimSun;color:green;" lang="EN-US"> &nbsp;</span><br><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>DWORD simple_memory_pool_bytes_max = bytes_1MB * <span style="color:red;">10</span>;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>AV_SimpleMemoryPool<span>&nbsp; </span>SimpleMemoryPool;</span><br><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span style="color:green;">// 這小型記憶體池是從主記憶體池分配出來的.</span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>SimpleMemoryPool.MemoryPoolCreate( simple_memory_pool_bytes_max );</span><br><span style="font-family:NSimSun;" lang="EN-US"> &nbsp;</span><br><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span style="color:green;">// 而這要如何應用呢！？</span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span style="color:green;">// 就用上面的SceneInfo例子來應用.</span></span><br><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>AV_MemoryPool2HeadList&lt; SceneInfo &gt; SceneTable2;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>DWORD scene_table_node_count = <span style="color:red;">5</span>;</span><br><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>DWORD scene_table_memory_bytes = <span style="color:blue;"><br> </span></span><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span></span><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span></span><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span></span><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span></span><span style="font-family:NSimSun;" lang="EN-US"><span style="color:blue;">sizeof</span>( MPNode2&lt; SceneInfo &gt; ) * scene_table_node_count;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span style="color:green;">// 重點來了, 從SimpleMemoryPool配置5個MPNode2&lt; SceneInfo &gt;節點的記憶體,</span></span><br><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span style="color:green;">// 然後傳給SceneTable2來作記憶體連結的初始化,</span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span style="color:green;">// 這樣一來,SceneTable2萬一不需要再使用時,</span></span><br><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span style="color:green;">// </span></span><span style="font-family:NSimSun;" lang="EN-US"><span style="color:green;">可以藉由SimpleMemoryPool來作全部的回收再利用 ,</span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span style="color:green;">// 也就是同樣的記憶體,再給其他種的記憶體結構所使用,</span></span><br><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span style="color:green;">// </span></span><span style="font-family:NSimSun;" lang="EN-US"><span style="color:green;">更能善加利用記憶體池喔.</span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>SceneTable2.CreateLink( scene_table_node_count, <br></span><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>(MPNode2&lt; SceneInfo &gt;*)SimpleMemoryPool.MemoryAllocate( <br> </span><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family:NSimSun;" lang="EN-US">scene_table_memory_bytes ) );</span><br> <span style="font-family:NSimSun;" lang="EN-US"> &nbsp;</span><br><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span style="color:green;">//#####################################################</span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span style="color:green;">// AV_SimplyMemoryPoolArray 陣列用法簡介</span></span><br><span style="font-family:NSimSun;color:green;" lang="EN-US"> &nbsp;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">struct</span> RoomInfo</span><br><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>{</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>DWORD Number;</span><br><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">char</span><span>&nbsp; </span>Name[ <span style="color:red;">16</span> ];</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>};</span><br><span style="font-family:NSimSun;" lang="EN-US"> &nbsp;</span><br><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span style="color:green;">// 其實這用法也很簡單,跟上面的都類似...</span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span style="color:green;">// 我有盡量將相似的使用語法統一起來.</span></span><br><span style="font-family:NSimSun;color:green;" lang="EN-US"> &nbsp;</span><br><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>AV_SimplyMemoryPoolArray&lt; RoomInfo &gt; RoomTable;</span><br><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span style="color:green;">// 配置100個RoomInfo的實體空間</span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>RoomTable.Create( <span style="color:red;">100</span> );</span><br><span style="font-family:NSimSun;" lang="EN-US"> &nbsp;</span><br><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>RoomInfo *room = RoomTable.Get( <span style="color:red;">0</span> );</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>room-&gt;Number = <span style="color:red;">100</span>;</span><br><span style="font-family:NSimSun;" lang="EN-US"> &nbsp;</span><br><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span style="color:green;">// 下面這是指標陣列</span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>AV_MemoryPoolPointerArray&lt; RoomInfo &gt; RoomPointerTable;</span><br><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span style="color:green;">// 配置100個RoomInfo的指標陣列空間</span></span><br><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>RoomPointerTable.Create( <span style="color:red;">100</span> );</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>RoomPointerTable.Add( room );</span><br><span style="font-family:NSimSun;" lang="EN-US"></span><br><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span style="color:green;">//#####################################################</span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span style="color:green;">//其他種的</span></span><span style="font-family:NSimSun;" lang="EN-US"><span style="color:green;">記憶體池管理類別也都是大同小異的用法</span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span style="color:green;">//看倌們就自行發揮嚕！</span></span><br><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span style="color:green;">//其實，最好是自己動手寫一組這種管理類別，</span></span><br> <span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span style="color:green;">//這樣自己才能夠真正瞭解到關鍵點， 也才能自己解決各種需求喔！</span></span><br><span style="font-family:NSimSun;" lang="EN-US"><span style="color:green;"></span></span><br><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span style="color:green;">//#####################################################</span></span><br><span style="font-family:NSimSun;color:green;" lang="EN-US"> &nbsp;</span><br> <span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span style="color:green;">// 當程式要結束時,就這樣將記憶體池釋放給作業系統吧.</span></span><br><span style="font-family:NSimSun;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>AV_KernelMemoryPool::sMemoryPoolRelease();</span><br> <span style="font-family:NSimSun;" lang="EN-US">}</span><span style="font-family:NSimSun;" lang="EN-US"></span><font face="simsun"><font color="#000000"><font size="3"><br><br></font></font></font></div> </div>  </div><font face="simsun"><br><br>若想看全部完整的</font>記憶體池管理類別<font face="simsun">程式碼，請於此下載。<br><br></font><span style="color:rgb(255, 0, 0);">程式碼下載：</span><a href="http://avatar996.myweb.hinet.net/AV_MemoryPool-20081231.zip">我的完整MemoryPool程式碼下載連結</a><br><br>enjoy it !<br><br><br><br><br>延伸閱讀：<br><a target="_new" href="http://tw.myblog.yahoo.com/mmogc3d-mmogc3d/article?mid=1870&amp;prev=1912&amp;next=1849">3D線上遊戲製作軟體 - 勇者大人對於記憶體池(memory pool)的一些經驗看法</a><br>]]></description>
            <pubDate>Sat, 24 Jan 2009 14:45:51 +0800</pubDate>
            <guid><![CDATA[http://tw.myblog.yahoo.com/mmogc3d-mmogc3d/article?mid=1912]]></guid>
         </item>        </channel>
        </rss><!-- w7.blog.tpc.yahoo.com uncompressed/chunked Mon Nov  9 09:56:51 CST 2009 -->
