游戏程序设计课件_第1页
游戏程序设计课件_第2页
游戏程序设计课件_第3页
游戏程序设计课件_第4页
游戏程序设计课件_第5页
已阅读5页,还剩874页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

遊戲編程概述

遊戲是什麼?遊戲程式員看遊戲遊戲”只是一個具有某種“邏輯”和某些“數據”的結合體遊戲的組成遊戲的基本部件遊戲的運行流程遊戲其實就是一個不斷按某種邏輯更新各種數據(畫面、聲音等)的過程。遊戲的基本流程只是一個連續的迴圈,它不斷地按某種邏輯來繪製新的圖像,並刷新畫面DaveRoderick曾形象地把遊戲類比為一個帶有前置終端的即時資料庫,該終端即時地接受用戶(玩家)輸入的各種交互指令,取出相應的數據,並“優雅”地將這些數據以各種形式(視覺、聽覺等)展現給用戶。

遊戲開發的基本理念和方法(1)數據驅動理念“邏輯”方面是一款遊戲的靈魂,主要由遊戲設計人員來負責完成;“數據”方面主要起到描述性和修飾性的作用,主要由程式設計人員來處理。這樣的主次關係決定了只有高效地、靈活地處理和對付這些“數據”部分,才能讓遊戲設計人員把更多的時間和精力花費在“邏輯”部分,遊戲編程人員必須把這些“數據處理”工作變得簡便和快捷,才能保證遊戲開發的成功。遊戲開發的基本理念和方法(2)數據驅動的基本策略預先開發專門的數據獲取和管理工具。遊戲程式設計人員常常需要針對當前遊戲的開發,為遊戲開發中的藝術創作人員專門設計和實現一系列的“數據”獲取和管理工具,包括聲音的處理程式、繪畫工具等,以提高藝術創作人員的工作效率;遊戲程式設計人員在編寫代碼時,要採用可以很容易修改遊戲數據的方式,保證遊戲數據的動態可調整性。遊戲開發是一個不斷修改完善的過程,遊戲的設計人員常常需要訪問那些影響遊戲不同實體行為的數據,並且可以修改這些數據。遊戲開發的基本理念和方法(2)保證遊戲數據的動態可調整性的技巧和策略創建一個可以解析文本檔或者命令的子系統它能對遊戲的初始化數據/參數進行動態地解釋和配置,而不是簡單地“啟動”遊戲的運行。把遊戲程式中的一些常數放置在文本檔中,這樣,不需要重新編譯就可以很容易地對這些參數進行修改。所有的數據都不放在代碼內。假設所有的數據內容都可以修改,或者將來可能被修改。使用腳本來控制遊戲的流程。腳本是定義各種行為控制的最簡單的方式,它特別擅長定義遊戲中順序執行的步驟,或者各種等待觸發的遊戲事件。在編碼實現中,時刻牢記把“邏輯”和“數據”分開的核心準則即把複雜的遊戲邏輯放在代碼中,而把“數據”外置,這樣可以有效地提高遊戲的功能清晰性和可調試性。避免重複的數據。如果你需要在不同的遊戲場景中表現相同的人物行為,那麼,只需要在一個地方實現,而在另一個場景中直接調用就可以了。在大型的複雜遊戲開發中,需要另外的編輯工具代替手工編輯方式,方便於產生遊戲數據的文本檔,如關卡編輯器、腳本編輯器等。建構這些合適的編輯工具可謂是“磨刀不誤砍柴功”,它們將十分高效地加快大型遊戲的開發過程。遊戲開發的基本理念和方法(3)軟體工程中的原型法、中間件方法等都是開發遊戲軟體的有效方法可玩性測試的原型系統:專門用於檢驗遊戲設計的合理性和用戶的可接受程度;用戶介面的原型系統:檢查玩家如何與遊戲進行交互;各個子系統的原型系統:測試該子系統的功能,並可檢查各個子系統的交互關係和數據介面;演算法測試的原型系統:可用來檢查各種演算法。尤其是特定領域的一些複雜演算法需要通過原型系統進行不斷地改進和提高。遊戲的測試與調試(1)遊戲的測試與調試目標遊戲BUG的出現可能是由於程式員的技術問題,也可能是由於策劃的設計問題,或者是因為美工的一時疏忽。不管是什麼原因,在進行遊戲的調試和測試工作時,要儘量把這些問題全部解決。遊戲的調試是編程人員的任務,在這個階段中要找出遊戲程式的內在缺陷,並加以修正。採用一般的軟體調試和測試方法就可以達到。遊戲的測試相當於對遊戲設計階段的BUG的修正,找出遊戲設計本身存在的缺陷。遊戲的測試與調試(2)遊戲的測試人員一般由以下幾類人員組成:第一類遊戲測試人員是開發隊伍的成員。看到自己製作的美工、聲效、代碼和遊戲中使用的關卡,更好地知道如何進行改進;第二類遊戲測試人員是傳統意義上的遊戲測試人員,這些人在遊戲進入“alpha”階段就開始對遊戲進行測試。這些測試人員會將一半的時間用來跟蹤代碼中的“BUG”,並且還會提供一些重要的回饋資訊,比如,如何玩遊戲、遊戲的難度過於簡單還是過於困難、遊戲的交互控制是直觀還是遲鈍等;第三類遊戲測試人員比較注重第一印象,他們短期參與到專案中,從事玩遊戲的工作,然後提供關於遊戲的最直接的感覺。關於遊戲中不太直觀的控制方式、不清晰的資訊表示或者遊戲難度設置不合理的部分,他們都可以提出建議;第四類遊戲測試人員是沒有從事當前遊戲開發的遊戲設計者或者開發人員,會以比其他的測試人員更為獨到的方式提出自己對遊戲優缺點的見解,他們在某種程度上理解遊戲的設計思想,可以分析出項目為何存在缺點,並提出改進方案。遊戲的測試與調試(3)遊戲中的測試工作可以分為兩種:有監督的測試和無監督的測試。有監督的測試一般在遊戲開發的早期進行,讓設計人員清楚地瞭解遊戲有哪些部分不完整,需要從哪些方面獲得回饋資訊。在專案開發的後期,如果某個部分剛剛修改過或者返工過,設計人員只需要這一部分的回饋資訊,以判斷所做的修改是否解決了現有的問題,或者是否會在某個重要方面對遊戲造成影響。無監督的測試也很重要,告訴他們開始玩遊戲,觀察他們做些什麼,並且傾聽他們的回饋意見,這樣可以為設計人員提供關於遊戲的全面的回饋意見,這些資訊對於解決所有的問題至關重要。遊戲的測試與調試(4)遊戲在整體上完成後,在進入全面測試階段的時候,就可以進行遊戲參數的調整。參數的調整工作通常包括修改遊戲中的某個設置,然後繼續玩遊戲,以判斷修改是否達到了所要求的效果。在進行參數調整工作時,必須密切注意不同的值之間是如何相互作用和影響的。在決定如何對遊戲進行參數調整時,沒有絕對的規則可以遵循。你必須要全面地觀察遊戲,以理解比你玩遊戲的經驗少得多的玩家如何來玩這個遊戲,並且還要瞭解哪些地方可以對他們提出挑戰,而又不會不公平或者過於殘酷。一旦決定對一個行為參數或效果參數進行調整,那麼大刀闊斧地將其加倍或減半,這樣在調試時才能清晰地感受到調整前後的變化,有利於快速地確定合適的參數值。遊戲開發的基本準則所有的遊戲開發都必須為今後的重用作好準備。儘量使用可重用的模組將會最大程度上縮短遊戲的開發週期。開發文檔不是可有可無的。好的開發文檔不僅能為軟體重用提供有力的技術保證,而且在遊戲開發過程中,它能讓其他的開發人員清楚地知道你在幹什麼。先設計,後編程。遊戲的設計和編程實現是明顯分開的,因此,遊戲的開發一定要先進行設計,後進行編程實現。遊戲開發是一個不斷進行自我完善的過程,在開始編程的時候,大概只完成了80%的遊戲設計工作量,其餘的設計工作隨著開發進程的推進而逐步地進行精緻和完善。靈活有效地安排開發進程。在遊戲開發過程中,一定要讓每一個遊戲編程人員知道他們的開發目標。雖然執著地實施既定的開發計畫很重要,但是,更重要的是如何在開發進程落後的時候,重新校準新的開發計畫。及時地發現錯誤。在開發過程中,及時地發現和糾正錯誤十分重要。時間越長,這些潛在的錯誤就越容易“發酵腐爛”,最終導致開發的失敗。遊戲開發小組包括藝術家動畫師/造型人員編程人員音效/音樂設計產品開發人員遊戲開發所需要的資源通常,遊戲開發需要3-5個程式設計人員3-5個藝術設計各種支持(產品開發,市場推廣,音效師,音樂家,測試,系統管理員,法律顧問等)將近18個月的開發時間遊戲開發基本過程遊戲開發的基本過程設計人員:描述遊戲內容及其賣點開發人員:如何利用現有資源完成既定目標專案進度安排,充分調動積極性掩蓋複雜的細節實現與遊戲程式員相關的任務遊戲資源開發編輯工具/數據遊戲引擎開發考慮註冊購買現有的產品具體實現(gameplay)定型

測試/修改發佈。。。。。。遊戲開發的輔助工具聲音數字轉換器音樂編輯器、編曲機圖形工具:Photoshop等攝像頭視頻採集卡圖形庫:包括建模和繪製遊戲引擎。。。。。。遊戲引擎技術(1)遊戲引擎技術的出現是遊戲程式設計技術發展的里程碑之一,並已成為當前電腦遊戲開發的關鍵技術和核心平臺。它也是軟體工程、專業化分工和遊戲產品的獨特文化性要求在遊戲開發的綜合體現,對遊戲產業的發展起了巨大的推動作用遊戲引擎的意義遊戲編程人員就不需要從頭做起,而是可以直接調用遊戲引擎提供的強大功能,高質量地在很短的週期內開發出新遊戲,適應遊戲產業的激烈市場競爭遊戲引擎促使遊戲編程人員進行更為專業化的分工高水準的編程人員注重於性能要求很高的遊戲引擎的開發,一般水準的遊戲編程人員則利用遊戲引擎進行具體的遊戲產品的開發遊戲引擎技術(2)遊戲引擎相當於遊戲的底層框架平臺。框架平臺搭好後,只要往裏填充內容就可以了。如果把遊戲引擎比擬為一個“遊戲操作系統”,那麼最終的遊戲產品則可比擬為一個個具體地運行在“遊戲操作系統”上的應用程式。遊戲引擎已經發展為一套由多個子系統共同構成的複雜系統從建模、動畫到光影和粒子特效,從物理系統、碰撞檢測到檔管理、網路流量控制等,包括專業的編輯工具和插件,幾乎涵蓋了遊戲程式設計過程中的所有重要環節遊戲引擎技術(3)遊戲引擎的終極目標遊戲編程的透明化,讓遊戲的創意人員也能直接實現遊戲根據創意,直接生成代碼著名的商用遊戲引擎DoomQuakeUnrealLithTech……遊戲引擎技術(4)Ogre引擎開源/projects/ogre面向對象抽象底層圖形庫(D3D,OpenGL)靈活的渲染引擎(不是一個完整的遊戲引擎)大量採用C++設計模式以插件的形式方便擴展OGRE的功能提供了抽象的渲染API,封裝了底層的圖形庫。遊戲引擎技術(5)Ogre引擎的學習(一個月的時間)讀Ogre的源代碼,學習Ogre的設計和編碼方式解析Ogre的結構和功能熟悉API調用嘗試改變Ogre的demo遊戲程式員的基本素質要求軟體設計的基本技能豐富的知識面

軟體工程、數據結構、資料庫、演算法設計等2D/3D圖形學、人工智慧、音頻/視頻處理

、人機交互、電腦網絡堅實的數學和物理基礎:線性代數、歐氏幾何、牛頓物理學經驗和能力綜合運用各片斷技術的經驗不斷學習新技術的能力遊戲的開發常常受限於運行時間或者存儲空間等資源因素,但卻處處追求高效率和高性能。其他遊戲引擎,如DirectX,OpenGL,Ogre及其他商用遊戲引擎一些數據處理和建模工具,如Photoshop,Maya,3DS等。。。。。。給遊戲程式設計員的忠告遊戲編程人員還需要不斷地學習遊戲開發特別強調創新,每次開發的遊戲都會不一樣,而且遊戲編程環境和技術也在不斷的發展變化中。只有善於從不同的方面(同事、網上的遊戲編程資源、……)去學習,不斷地提高自己的遊戲編程能力,才有可能使自己在遊戲業界立足爭取獲得一個大學文憑。要成為一個遊戲編程人員,大學文憑並不是必須的,但是,一個大學文憑能在找工作時給你很多有益的幫助。。。。。。。Q&A??????OGRE

淺析教學中文資料OGRE_01a.doc:從使用者的角度將OGRE引擎最基本的概念和使用方法做一個較全面的介紹。隱藏了OGRE引擎內部的底層內容,力求做到簡單、易懂,是OGRE引擎的入門教程。ByMarg小組Loneststarreading.docOGRE淺析:by鄒林燦OGRE中文系列分析:by盛崇山OGRELOGO本次課程的主要內容OGRE簡介OGRE的安裝如何用OGRE來進行應用程式的開發OGRE簡介

OGRE:Object-OrientedGraphicsRenderingEngine(面向對象的圖形渲染引擎)C++開發面向對象且使用靈活的3D引擎。目的:讓開發者方便和直接開發基於3D硬體設備的應用程式或遊戲。引擎中的類庫對更底層的系統庫(如:Direct3D和OpenGL)的細節進行了抽象,並提供了基於現實世界對象的介面和其他類。

OGRE簡介這部分主要介紹:OGRE特點OGRE中的模組OGRE特點

效率特性簡單、易用的面向對象介面設計能更容易渲染3D場景,並使實現產品獨立於渲染API(如Direct3D/OpenGL/Glide等)。可擴展的程式框架(framework)自動處理常見的需求,如渲染狀態管理,hierarchical

culling,半透物體排序等。清晰、整潔的設計加上全面的文檔支持。OGRE特點平臺和3D

API支持支持Direct3D和OpenGL支持Windows平臺,用VisualC++6(或VisualC++.Net)和STLport來編譯。支持Linux平臺,用gcc3+(或gcc2.9x)和STLport來編譯。材質/Shader支持支持從PNG、JPEG或TGA這幾種檔中加載紋理;自動產生MipMap;自動調整紋理大小以滿足硬體需求。支持可程式控制的紋理座標生成(如環境帖圖)和轉換(平移、扭曲、旋轉)。材質可以擁有足夠多的紋理層,每層紋理支持各種渲染特效,支持動畫紋理。自動應用多通道渲染和多紋理,從而大幅度提高渲染品質。支持透明物體和其他場景級別的渲染特效。通過腳本語言可以不用重新編譯就設置和更改高級的材質屬性。OGRE特點網格Meshes高效的網格數據格式提供插件支持從Milkshape3D導出OGRE本身的.mesh和.skeleton檔格式。支持骨骼動畫(可渲染多個動畫的組合)支持用Bezier樣條實現的曲面OGRE特點場景特性擁有高效率和高度可配置性的資源管理器,並支持多種場景類型。使用系統默認的場景組織方法,或通過親自編寫插件使用自己的場景組織方法。通過包圍體(如包圍盒)實現視域裁剪。提供的二叉樹場景管理器插件可加速室內場景的渲染,支持加載Quake3關卡和shader腳本分析。優秀的場景組織體系;場景結點支持物體的附屬(attach),並帶動附屬物體一起運動,實現了類似於關節的運動繼承體系。OGRE特點特效粒子系統包括可以通過編寫插件來擴展的粒子發射器(emitter)和粒子特效影響器(affector)。通過腳本語言可以不用重新編譯就設置和更改粒子屬性。支持並自動管理粒子池,從而提升粒子系統的性能。支持天空盒、天空面和天空圓頂,使用非常簡單。支持Billboard,以實現特效。自動管理透明物體(系統自動幫你設置渲染順序和深度緩衝)

OGRE特點其他特性資源管理和文檔加載(ZIP、PK3)。支持高效的插件體系結構,它允許你不重新編譯就擴展引擎的功能。運用'Controllers'你可以方便地改變一個數值。例如動態改變一個帶防護罩的飛船的顏色值。調試用的記憶體管理器負責檢查記憶體溢出。

OGRE中的模組

OGRE中由很多模組組成,每個模組互相配合,共同實現OGRE的強大功能和優秀特性。OGRE的模組大致可表現為如下結構,這也基本上是OGRE工程檔的結構:OgreMainPlatformManagersPluginsRenderSystemsTools

OgreMain模組

場景組織體系Material管理插件動態加載系統數學支持庫渲染器和幾何管道網格/幾何實體管理資源管理天空/背景渲染公告板系統和粒子系統日誌和異常處理事件監聽器編解碼器和圖像加載器自定義記憶體管理器基本動畫骨骼動畫字體渲染/字體加載覆蓋(Overlay)表面,二維元素Win32平臺管理模組

實現了Windows平臺的基本平臺服務。特性輸入管理配置系統BSP場景管理

該插件用BSP樹和clusters提供了室內場景的管理。它可以導入Quake3的關卡。特性BSP樹關卡導入Shader支持其他模組檔系統插件提供在檔系統的檔夾中定位資源的能力。GuiElement插件提供標準的二維表面元素,如文本輸入區和邊框。OctreeSceneManager插件用八叉樹管理標準場景。可用它渲染地形。其他模組ParticleFX插件此插件提供了標準的粒子發射器和粒子特效影響器。Direct3D7渲染系統插件此插件提供了基於Direct3D7的渲染系統。Direct3D9渲染系統插件此插件提供了基於Direct3D9的渲染系統。其他模組SDL渲染系統插件此插件提供了基於OpenGL和SDL的渲染系統。3ds2oof工具這個工具可以將3DStudio的網路檔(.3ds)轉換成.oof格式(OGRE以前的網路檔格式)。這個工具已經被拋棄了。3DstudioMax導出器這是一個3DStudioMAX(版本4或5)的插件,可以將3DStudio的模型數據轉換成OGRE的.mesh或.skeleton格式。其他模組位圖字體創建工具能過此工具你可以把二進位字體檔轉換成OGRE的.fontdef檔。Milkshape3D導出器這個工具是Milkshape3D(一個建模工具)的插件,它允許你將模式導出成OGRE支持的.mesh和.skeleton檔格式。Python介面設計這個子工程的目的是以dll的形式提供一個介面,使Python(一種腳本語言)可以直接驅動OGRE,並且允許OGRE直接調用Python腳本以實現遊戲相關的腳本語言。安裝OGRE

這部分主要介紹獲取OGRE支撐環境編譯OGRE運行DEMOOGRE運行期結構獲取OGREOGRE是一個開放源碼專案,該專案的網址是。在這裏可以獲取到OGRE的最新版本和文檔,此外還可以在論壇上與其它開發者交流。支撐環境

OGRE是一個比較大的專案,不可能每個功能都獨立完成。OGRE的編譯和使用需要一些其他庫作為支撐環境。在Windows環境下編譯和安裝OGRE需要如下支撐環境:STLport4.5.3DirectX9SDK其他第三方庫編譯OGRE

在VC6環境裏打開OGREOGRE的最新版本的ogrenew檔夾下的Ogre.dsw工作區檔,執行BatchBuild指令,該指令會自動處理OGRE中各個工程的依賴關係,正確完成全部的編譯構建。

在VC7環境裏打開OGREOGRE的最新版本的ogrenews檔夾下的Ogre.sln工作區檔,執行BatchBuild指令,該指令會自動處理OGRE中各個工程的依賴關係,正確完成全部的編譯構建。運行DEMO在ogrenew\Samples\Common\bin\Debug下可以看到Debug方式編譯的全部DEMO。OGRE運行期結構運行完DEMO之後,注意查看ogrenew\Samples\Common\bin\Debug檔夾中的內容,從這裏可以看到OGRE程式的運行環境。除了DEMO的可執行檔外,該檔夾中還包括如下的動態鏈接庫:OGRE運行期結構OgreMain.dllOgrePlatform.dllRenderSystem_Direct3D7.dllRenderSystem_Direct3D9.dllRenderSystem_SDL.dllPlugin_GuiElements.dllPlugin_BspSceneManager.dllPlugin_OctreeSceneManager.dllPlugin_FileSystem.dllPlugin_ParticleFX.dllDevil.dllSDL.dll其他:機器上還必須包括DirectX8.1和STLport的動態鏈接庫,一般系統會將它們自動安裝到Windows系統檔夾下。OGRE運行期結構OGRE的運行還需要如下的配置檔:ogre.cfg:OGRE的顯示模式配置檔Plugins.cfg:插件配置檔,在這裏指定插件的路徑和插件檔案名。上一個表中以Plugin_開頭的dll檔都是插件,它們可以放在其他檔夾裏,但必須在本文件裏指定路徑。resources.cfg:資源配置檔,設置資源搜索路徑,Zip檔也作為搜索路徑對待。quake3settings.cfg:quake3地圖配置檔。terrain.cfg:室外地形場景配置檔。OGRE運行期結構OGRE程式的資源路徑在resources.cfg裏指定。OGREDEMO的資源都放在\ogrenew\Samples\Media及其下的Zip檔裏。資源檔包括以下內容:.skeleton骨骼動畫的骨骼定義檔.particle粒子範本定義檔.overlay二維及三維介面定義檔.mesh模型檔.material材質定義檔.fontdef字體定義檔.jpg圖片檔.png圖片檔準備用OGRE開發從FrameWork開始FrameWork與實際應用程式的關係ExampleApplication類ExampleFrameListener類第一個3D程式FrameWork

假設以Demo_EnvMapping工程為例,觀察一下OGRE的Demo程式的代碼結構,可以發現在本工程中其實只有兩個檔:EnvMapping.h和EnvMapping.cpp。查看本工程的Settings,在C/C++選項卡中打開PreProcessor分類,可以看到有三個附加包含路徑,其中..\include是本工程的頭檔路徑,..\..\Common\include是Demo程式公共的頭檔路徑,..\..\..\OgreMain\include是OGRE引擎的頭檔路徑。在..\..\Common\include中可以發現兩個頭檔:ExampleApplication.h和ExampleFrameListener.h。這兩個檔定義了簡單OGRE程式的應用框架,它們封裝了簡單OGRE程式的基本要素和運行過程。FrameWork與實際應用程式的關係

在創建我們自己的OGRE程式時,只需要繼承OGREFrameWork中的類並做少量改動就可以了。OGREFrameWork與實際應用的關係如下圖所示:ExampleApplication類

該類定義了如下數據成員://指向Root對象的指針

Root*mRoot;//指向程式中攝像機的指針

Camera*mCamera;//指向場景管理器的指針

SceneManager*mSceneMgr;//指向“幀監聽器”的指針

FrameListener*mFrameListener;//指向渲染窗口的指針

RenderWindow*mWindow;Root:OGRE系統的入口點

Root對象在程式中必須最先創建和最後釋放。OGRE引擎是通過Root將其他部分“串”起來的,通過Root對象可以調出配置對話框以配置渲染系統(RenderSystem);通過Root對象可以獲取到引擎其他部分的指針,如SceneManager、RenderSystem、Resourcemanagers等;Root對象還提供一個startRendering方法來開始一個連續渲染過程,對該方法的調用在ExampleApplication類中就可以見到。Camera:攝象機

渲染結果實際上就是攝象機最後“看”到的結果。SceneManager:場景管理器

普通場景、室外封閉場景、室外無限場景和室內場景:

enumSceneType{ST_GENERIC,ST_EXTERIOR_CLOSE,ST_EXTERIOR_FAR,ST_INTERIOR};室內場景採用BSP場景管理方式,室外場景採用八叉樹場景管理方式。初學者使用ST_GENERIC普通場景類型。對於複雜室內和室外場景,OGRE分兩部分:基本上固定不變的“世界”,對於這部分採用BSP或Octree等特殊演算法提高渲染效率;場景中的可移動物體,它們的創建和控制需要開發人員自己來完成。FrameListener:幀監聽器

監聽最終用戶的控制資訊(滑鼠、鍵盤、遙控杆等),對攝象機、場景物體等進行控制.RenderWindow:渲染窗口

渲染結果所在的窗口,其中包括渲染真正的目的地:視口Viewport。啟動OGRE

//繼承自ExampleApplication類

EnvMapApplication

app;

try{

app.go(); }

catch(Exception&e) { …… }

啟動OGRE

//啟動引擎

virtual

void

go(void) {

if(!setup())

return;

mRoot->startRendering(); }

go函數

virtualvoidgo(void):該函數是ExampleApplication類除構造和析構函數以外唯一的public函數,它一調用,程式就正式開始運行了。代碼如下:

virtualvoidgo(void){if(!setup())return;mRoot->startRendering();}從代碼可以看出,先調用setup()函數完成渲染前的準備,如果setup成功,就由mRoot調用startRendering()開始渲染,如果不成功則退出。setup函數

Setup函數完成一個OGRE應用程式的開始渲染前的準備工作。實際步驟如下:首先創建Root類的對象。加載資源路徑setupResources(void)彈出config對話框,配置RenderSystem選擇場景管理器類型創建並初始化攝像機創建窗口中的視口創建場景創建幀監聽器setup函數代碼步驟的代碼如下:virtualboolsetup(void){mRoot=newRoot();//首先創建Root類的對象。

setupResources();//加載資源路徑

boolcarryOn=configure();//彈出config對話框,配置RenderSystemif(!carryOn)returnfalse;chooseSceneManager();//選擇場景管理器類型

createCamera();//創建並初始化攝像機

createViewports();//創建窗口中的視口

//Setdefaultmipmaplevel(NBsomeAPIsignorethis)TextureManager::getSingleton().setDefaultNumMipMaps(5);createScene();//創建場景

createFrameListener();//創建幀監聽器

returntrue;}setup函數至此,setup()函數結束,它已完成渲染之前的全部準備工作,接下來就由Root對象調用startRendering()函數指揮渲染系統開始連續的渲染過程。OGRE消息處理機制消息機制的設計一般總要設計到三個部分:消息的產生、消息的傳遞和消息的處理。OGRE中的消息處理者的抽象類主要是listener類,而listener必須是對應特定的target的,所以可以認為是由listener和target兩個抽象類組成。而消息傳遞由Dispatcher和Processor組成。FrameListenerFrameListener類中有兩個很重要的虛函數。frameStarted和frameEnded。

class_OgreExportFrameListener { public:

//幀渲染之前的事件處理方法

virtualboolframeStarted(constFrameEvent&evt){returntrue;} //幀渲染之後的事件處理方法

virtualboolframeEnded(constFrameEvent&evt){returntrue;} virtual~FrameListener(){} }

ExampleFrameListenerExampleFrameListener繼承自FrameListener。它包裝實現了一個幀監聽器常用的功能。OGRE對事件的處理方法有兩種模式,立即模式和緩沖模式。ExampleFrameListener中有一個mEventProcessor變數,它是用來處理緩衝模式的事件的。而在默認的非緩衝模式中,ExampleFrameListener實現了基本輸入操作。如:鍵盤WASD控制視點前後左右移動,滑鼠控制視點的旋轉等等。EventProcessorEventProcessor類繼承了FrameListener類,OGRE引擎自動在每幀前調用EventProcessor的frameStarted函數。EventProcessor類還繼承了KeyTarget,MouseTarget,MouseMotionTarget。作為消息傳送目標的EventProcessor,因此才有可能處理這些消息。鍵盤消息處理機制EventListenerisMulticasterKeyXX(KeyEvent)=0InputEventEventTarget*mSourceKeyEventintmKeyEventEventTargetvirtualprocessKeyEvent()=0KeyTargetprocessKeyEvent()add/removeKeyListenerKeyListenerTargetListenerEventProcessor的設置

//創建一個EventProcessor mEventProcessor=new

EventProcessor();

//初始化

mEventProcessor->initialise(win);

//開始處理消息

mEventProcessor->startProcessingEvents();

//將ExampleFrameListener作為按鍵消息的監聽者註冊

mEventProcessor->addKeyListener(this);

EventProcessor的運行

bool

EventProcessor::frameStarted(const

FrameEvent&evt) {

mInputDevice->capture();

while(mEventQueue->getSize()>0) {

InputEvent*e=mEventQueue->pop();

processEvent(e);

delete

e; }

return

true; }

第一個3D程式

OGRE的應用框架中定義好了ExampleApplication與ExampleFrameListener類,已封裝了3D應用程式的全部要素,應用開發者所要做的工作主要有2點:派生出自己的應用程式類,重新實現createScene函數以創建場景。派生出自己的監聽器類,如果需要的話,重新實現frameStarted函數以進行特殊的輸入控制和動畫控制。第一個3D程式打開Demo_EnvMapping工程,這是一個非常簡單易懂的程式實例。這個程式只有兩個檔EnvMapping.h和EnvMapping.cpp。EnvMapping.h檔定義了ExampleApplication類的派生類EnvMapApplication,並重新實現了createScene函數創建出一個亮閃閃的具有環境帖圖的食人魔頭像。classEnvMapApplication:publicExampleApplication{public:EnvMapApplication(){}protected://重新實現createScene函數,創建實際場景

voidcreateScene(void){//設置環境光

mSceneMgr->setAmbientLight(ColourValue(0.5,0.5,0.5));//創建點光源lLight*l=mSceneMgr->createLight("MainLight");//設置點光源l的位置,缺省顏色為白色

l->setPosition(20,80,50); //讀入ogrehead.mesh模型檔,創建為一個Entity。

Entity*ent=mSceneMgr->createEntity("head","ogrehead.mesh");//設置食人魔Entity的材質為指定材質(環境貼圖)

ent->setMaterialName("Examples/EnvMappedRustySteel");//將食人魔Entity連接到場景根節點上。

mSceneMgr->getRootSceneNode()->createChild()->attachObject(ent);}};第一個3D程式一個基本的場景包括光、攝象機和模型等。ExampleApplication類中創建了缺省攝象機(見FrameWork部分)。每個模型檔載入後被創建成Entity。為了便於對場景的管理,OGRE引入了場景節點的概念,所有場景節點組合成一棵節點樹,全部Entity掛在這棵節點樹中的不同節點上。場景管理器mSceneMgr通過對節點樹的操控來完成對場景物體的操控。場景建立好之後,接下來處理應用程式的入口問題,這部分代碼在EnvMapping.cpp裏.EnvMapping程式課後工作安裝OGRE熟悉OGRE的變換和光照部分熟悉OGRE的檔格式和場景管理模式預習OGRE中的紋理映射

二維圖像遊戲基礎

1. 初始化 2. 進入遊戲迴圈 3. 查詢用戶輸入狀態 4. 執行遊戲邏輯和AI判斷 5. 繪製圖像 6. 迴圈 7. 退出遊戲迴圈的基本步驟

1. 初始化 2. 進入遊戲迴圈 3. 查詢用戶輸入狀態 4. 執行遊戲邏輯和AI判斷 5. 繪製圖像 6. 迴圈 7. 退出遊戲迴圈的基本步驟Demo:Airplane演示GameRunGameInitGameMenuGameRestartGameExitGameStarting//definesforgameloopstates#defineGAME_INIT 1 //thegameisinitializing#defineGAME_MENU 2 //thegameisinthemenu#defineGAME_STARTING 3 //thegameisabouttorun#defineGAME_RUN 4 //thegameisnowrunning#defineGAME_RESTART 5 //thegameisgoingtorestart#defineGAME_EXIT 6 //thegameisexiting//gameglobalsintgame_state =GAME_INIT; //startoffinthisstateInterror =0; //usedtosenderrorsbacktoOS//mainbeginshereVoidmain(){ //implementationofmaingameloopWhile(game_state!=GAME_EXIT){ //implementationofmaingameloop switch(game_state) { caseGAME_INIT: //thegameisinitializing { //allocateallmemoryandresources Init(); game_state=GAME_MENU; }break; caseGAME_MENU: //thegameisinthemenu { //callthemainmenufunctionandletitswitchstates game_state=Menu();

//note:wecouldforceaRUNstatehere }break;

caseGAME_STARTING: //thegameisabouttorun { //thisstateisoptional,butusuallyusedtosetthingsupright

//beforethegameisrunyoumightdoalittlemorehousekeeping Setup_For_Run();

//switchtorunstate

game_state=GAME_RUN; }break;

caseGAME_RUN:

//thegameisnowrunning

{

//thissectioncontainstheentiregamelogicloop Clear(); //clearthedisplay

Get_Input(); //gettheinput

Do_Logic(); //performlogicandAI

Render_Frame();//displaythenextframeofanimation

Wait(); //synchronizethedisplay

//theonlywaythatstatecanbechangedisthruuserinteraction //intheinputsectionorbymaybelosingthegame.

}break;

caseGAME_RESTART:

//thegameisrestarting

{

//thissectionisacleanupstateusedtofixupanylooseends //beforerunningagain

Fixup(); //switchstatesbacktothemenu

game_state=GAME_MENU;

}break;

caseGAME_EXIT: //thegameisexiting

{ //ifthegameisinthisstatethenit’stimetobail,killeverything //andcrossyourfingers

Release_And_Cleanup();

error=0; //settheerrorwordtowhatever //note:wedonothavetoswitchstatessincewearealreadyinthisstate //onthenextloopiterationthecodewillfalloutofthemainwhileand //exitbacktotheOS

}break; default: break;

}

//endswitch return(error); //returnerrorcodetooperatingsystem}//endmain二維遊戲技術二維遊戲概覽地圖的創建與顯示顏色混合與半透明精靈動畫碰撞檢測遊戲迴圈概念及實例解析二維遊戲早期的遊戲都是二維的如Diablo(暗黑破壞神)只有兩個軸(上下,左右)很多RPG遊戲是固定視角的二維半二維遊戲(續)二維遊戲對現在的編程仍然有意義(特別是現在的手機遊戲):如記憶體、解析度本質上視頻遊戲是一個連續的迴圈,執行邏輯指令,並將圖像輸出到螢幕。這和電影的播放非常類似,但是這個電影是用戶指定的。地圖的創建與顯示為實現一個基本的二維遊戲框架,首先要實現遊戲地圖的各種加載和編輯操作,為角色提供遊戲環境。4種通用地圖實現的方法:固定地圖、滾屏地圖、多層次地圖、菱形地圖固定地圖使用固定的背景作為地圖將螢幕切割成棋盤狀的一系列小塊在內存中保持一個二維數組,保存每個小塊對應的編號繪製時根據數組提供的資訊,在每個小塊畫上相應圖塊

固定地圖拼接演算法實現 for(yi=0;yi<y軸小地圖個數;yi++){ for(xi=0;xi<x軸小地圖個數;xi++){ intscreenx=xi*tile_wide; //乘以寬度得到最後螢幕上位置

intscreeny=yi*tile_high; inttileid=mapping_matrix[yi][xi]; //在這個數組中存放著對應位置的小地圖編 //號,如1表示水,2表示石頭,3表示磚等

blit(tillid,screenx,screeny); //自編函數,把相應地圖貼到正確位置

} }該程式段中blit函數的實現,可以調用Windows系統的一個API函數BitBlt直接實現滾屏地圖是固定地圖的進一步擴展,可以顯示遠大於固定地圖的圖像根據玩家所在位置,確定顯示的地圖部分滾屏地圖滾屏地圖演算法實現變數設置:playerx,playery為人物相對於完整地圖左上角的座標;screen_wide,screen_high為螢幕的寬和高;xtile為螢幕上x軸上可顯示的小地圖個數;ytile為螢幕上y軸上可顯示的小地圖個數;tileplayerx=playerx/tile_wide為人物所在格x軸下標;tileplayery=playery/tile_high為人物所在格y軸下標;應該繪製的地圖範圍是:x軸:由tileplayerx-xtile/2至tileplayerx+xtile/2;y軸:由tileplayery-ytile/2至tileplayery+ytile/2;當人物在螢幕正中央時,地圖到螢幕的位置變化公式為:screenx=xi*tile_wide–playerx+0.5*screen_widescreeny=yi*tile_high–playery+0.5*screen_high滾屏地圖演算法實現(續)例程:

intbeginx=tileplayerx-xtile/2 intendx=tileplayerx+xtile/2 intbeginy=tileplayery-ytile/2 intendy=tileplayery+ytile/2 tileplayerx=playerx/tile_widetileplayery=playery/tile_high for(yi=beginy;yi<endy;yi++){ for(xi=beginx;xi<endx;xi++){ intscreenx=xi*tile_wide–playerx+0.5*screen_wide; //螢幕上位置

intscreeny=yi*tile_high–playery+0.5*screen_high;inttileid=mapping_matrix[yi][xi]; //地圖數據數組

blit(tillid,screenx,screeny);//自編函數,將相應地圖貼到正確位置

} }多層次地圖以下列情況,可以考慮使用多層次地圖。需要小地圖能重疊或者有層次關係;在背景上有多個物體運動;需要模擬物體遠近不同的透視關係;多層次地圖的實現思想並不複雜,在滾屏地圖的基礎上設置多個層次的地圖即可。不妨設從底往上分別為0層,1層,…把地圖數據數組改為三維數組。可以使每個圖層以不同的速度運動,模擬景物遠近不同的層次感。這種技術,又稱視差卷軸(ParallaxScrollers)。

菱形地圖菱形地圖是在二維畫面上表現三維場景的常用技術拼接所使用的小地圖是菱形,計算比較複雜菱形地圖演算法實現intMapDraw(HDChdc){ inti,j; intlim=MAXSCREENX/TILEWIDE;//所需繪製地圖的範圍

for(i=-lim;i<lim;i++){ for(j=-lim;j<lim;j++){ intsx=MAXSCREENX/2-(TILEWIDE/2)+(i*TILEWIDE/2)-(j*TILEWIDE/2); intsy=MAXSCREENY/2-(TILEHIGH/2)+(i*TILEHIGH/2)+(j*TILEHIGH/2); if((sx<MAXSCREENX)&&(sy<MAXSCREENY)&&(sx+TILEWIDE>0) &&(sy+TILEHIGH>0)&&(playerx+i<100&&playerx+i>=0) &&(playery+j<100&&playery+j>=0)){ //邊界判斷

TransparentBlt(hdcMem,sx,sy,TILEWIDE,TILEHIGH, hdcTiles[Data[playerx+i][playery+j]], 0,0,TILEWIDE,TILEHIGH,RGB(0,255,0));//貼圖

} } } BitBlt(hdc,0,0,MAXSCREENX,MAXSCREENY,hdcMem,0,0,SRCCOPY);//畫到窗口return0;}Demo:AOE演示空間的離散的數位化的描述二維區域什麼是圖像(r0,g0,b0)(r1,g1,b1)(r2,g2,b2)(r3,g3,b3)(r4,g4,b4)(r5,g5,b5)(r6,g6,b6)(r7,g7,b7)圖像表示檔格式BMP,TGA,TIFF,GIF,JPEG等定義(Bitmap)位圖圖像是一塊由彩色點集組成的矩形區域。DIB(DeviceIndependentbitmap) 設備無關位圖DDB(Device-DependentBitmaps)設備有關位圖:老的Windows系統。BMP結構BMP檔頭比較簡單的頭資訊位圖資訊關於數據尺寸的詳細資訊調色板(optional):相當於一個查找表RGB四元組位圖數據RGB象素值索引值(如果有調色板)BMP檔頭typedefstruct{ WORDbfType; //“BM”,表示該檔為位圖

DWORDbfSize; //檔大小(以byte計) WORDbfReserved1; //保留位

WORDbfReserved2; DWORDbfOffbits; //實際位圖起始位置相對於檔頭的偏移量}BITMAPFILEHEADER位圖資訊typedefstruct{ DWORDbiSize; //=sizeof(BITMAPINFOHEADER) DWORDbiWidth; //位圖寬度(以象素計) DWORDniHeight; //正數,左下角為起始點,從下向上

//負數,左上角為起點,從上向下

WORDbiplanes; //colorplane數,恒等於1 WORDbiBitCount; //1,4,8,24,32 DWORDbiCompression;//通常,以下域可以忽略,置為0即可

DWORDbiSizeImage; DWORDbiXPelsPerMeter; DWORDbiYPelsPerMeter; DWORDbiClrUsed; //位圖使用的顏色

DWORDbiClrImportant;//重要顏色數}BITMAPINFOHEADERRGB四元組typedefstruct{ BYTErgbBlue; BYTErgbGreen; BYTErgbRed; BYTErgbReserved; }RGBQUAD

BMP圖像顯示從BMP檔中載入圖像數據分配記憶體緩衝區基於檔結構提取圖像數據在螢幕上顯示圖像:將圖像數據發送至顯卡Bitblt():塊拷貝圖像數據OpenGL/DirectXStretchBlt:將一個保存在DIB中的圖像數據拷貝到另外一個矩形區域,帶縮放。圖像的半透明操作每種顏色都由紅綠藍3種基本色彩(三原色)組合而成;三原色中每一種顏色的亮度用一個8位的二進位數來表示半透明圖色彩=源圖像色彩×(100%-透明度)+背景圖像色彩×透明度WindowsAPI函數:AlphaBlend+精靈動畫(1)基於精靈的人物表現鬼怪ghosts,精靈sprites,騎士knights精靈:前景是圖像,背景是透明的精靈動畫:將上一幀中精靈出現的地方用背景填充,並在新的指定地點繪製精靈透明區域圖像鏤空(2)將掩碼圖和背景圖案進行按位AND,使得原始圖像的對應位置變空。將原始圖像和上一步處理結果按位OR。這樣,原始圖像貼到背景上並遮蓋背景,其餘部分(掩碼圖中白色部分)沒有貼到背景上。

掩碼圖原始圖像精靈動畫(3)英文為spriteanimation一幅背景圖一組範本圖(mask)人物的連續顯示方式雙緩衝機制不要在窗口中直接貼圖,避免閃爍建立一個記憶體DC,然後把所有的貼圖動作都在這個DC上進行,最後把結果顯示到操作窗口中。演示VideoMatting精靈動畫(4)對動畫序列中的每一幀Load背景圖確定sprite繪畫的位置將某一掩碼圖與背景圖作AND運算將對應的人物圖與背景圖作OR運算更新sprite繪畫的位置演示D3DSprite程式碰撞檢測對運動物體的碰撞判斷是許多遊戲程式中不可或缺的要素常見的碰撞檢測方法區域檢測碰撞點檢測顏色檢測:較為精確, 相對耗時區域檢測碰撞點檢測區域檢測採用某種規則形狀逼近物體物體之間的碰撞檢測轉化為規則形狀之間的檢測碰撞點檢測本質是區域檢測的一種一般在兩個運動物體中的一個物體上設置碰撞點,在另一個物體上設置檢測區域,運行時逐個判斷碰撞點是否在檢測區域中。顏色檢測為樹林做一張掩碼圖,將樹林用黑色填充。要產生汽車駛入樹林後面的效果,先在背景上貼上汽車的圖像,然後在上面用鏤空圖技術畫上樹林。然後,判斷汽車圖像在樹林圖像上的相對位置,將汽車圖像上的點和掩碼圖上相應位置的點做按位AND操作,檢查結果中是否有黑色點(RGB值為0)存在。任何顏色的RGB值與黑色圖形進行按位AND運算,將得到黑色。如果存在黑色點,表明有碰撞。圖像操作全局操作對圖像上的所有象素作同樣的操作如:傅立葉變換、直方圖統計、塊拷貝、灰度轉換、縮放等局部操作操作只與象素及其周圍鄰居的值有關如:濾波、邊緣檢測等直方圖表示圖像中象素顏色值的分佈直方圖上每一點橫坐標:顏色(亮度)值縱坐標:圖像中具有該顏色(亮度)值的象素的數目亮度增強亮度圖像象素顏色平均值用直方圖進行亮度增強將每一個象素灰度值加上一個常數得到的直方圖是原始直方圖向正軸方向的平移提高對比度每一象素點(x,y)上的圖像對比度C定義為I(x,y)-該點象素值I-背景亮度平均值Imax-圖像灰度最大值0–

圖像灰度最小值通過直方圖提高對比度將原始圖像直方圖的取值範圍[Xmin,Xmax]通過線性變換擴大至[0,Ymax]算術運算加:減:除:與:或:異或:幾何運算平移將圖像沿坐標軸移動若干偏移量縮放整數倍放大整數倍縮小一般情況:縮放係數非整數的情況旋轉旋轉矩陣R及其逆矩陣R-1圖像濾波算子垂直方向算子水準方向算子例如:邊界增強算子本質上實現的時候都是將某個象素的新的值用鄰域象素值的加權平均計算而得。形態算子一組空間濾波操作用於改變二值區域的形狀腐蝕:減少物體邊界的象素數膨脹:增加物體邊界的象素數複合方法開:腐蝕,然後膨脹閉:膨脹,然後腐蝕OriginalImage膨脹與腐蝕(Dilation,Erosion)數學形態學裏面最重要的操作腐蝕將圖像的尺寸減少膨脹增加圖像的尺寸可以用來消除圖像上小的亮斑雜訊和不規則的邊腐蝕(續)定義:物體的顏色是白,背景是黑定義腐蝕範本為111111111將範本與圖像進行加操作如果有,則結果為1,否則為0腐蝕(續)範本的效果相當於去掉物體邊界處的單個象素4種情況:當前處理象素為1,鄰域象素為1-》1當前處理象素為0,鄰域象素為1-》0當前處理象素為0,鄰域象素為1、0的混合-》0當前處理象素為1,鄰域象素為1、0的混合-》1腐蝕(續)原始圖像腐蝕後的圖像腐蝕兩次

膨脹膨脹是腐蝕的逆操作範本檔是000000000其效果相當於在物體的邊界添加單個象素膨脹(續)4種情況當前處理象素為0,鄰域象素為0-》0當前處理象素為1,鄰域象素為1-》1當前處理象素為1,鄰域象素為1、0的混合-》1當前處理象素為0,鄰域象素為1、0的混合-》1邏輯操作算子是Or膨脹(續)原始圖像膨脹多次後的圖像膨脹圖像開操作 開操作相當於先做腐蝕操作,再做膨脹操作效果相當於去掉單個象素,但是保留原來的形狀何尺寸。原始圖像腐蝕兩次,然後膨脹兩次(開操作)閉操作閉操作是開操作的相互操作先膨脹,然後腐蝕它可以用來填補一些小洞原始圖像閉操作結果輪廓抽取 先做腐蝕操作,再將腐蝕結果圖像減去原始圖像圖像特效工具例如:AdobePremiere或者Avid提供了豐富的特效非常方便和簡單!電影廣告中的特效經常以這種方式完成Hollywood由於資金不缺,經常是手工完成但是現在的趨勢是編程實現淡入淡出最簡單的圖像特效圖像從一個黑色背景中出現令透明度ALPHA從0變到1ALPHA=0圖像為黑色ALPHA=1原始圖像Alpha改變的速度決定了圖像的溶解速度如果讓ALPHA從1變到0,就得到淡出的效果Morphing(變形)圖像處理中最有意思的效果某個物體伸展到另外一個物體通常利用網格輔助也涉及很多電腦視覺的知識圖像溶解圖像變形Morphing(變形)電影《黑與白》中應用的技術蜘蛛網格演示模糊(blur)本質上相當於一個信號處理中的反走樣濾波將每個象素用其周圍鄰域象素值的加權平均值替代效果一般圖像量化改變圖像中顏色的數目或者灰度的層次效果非常有趣風格化圖像保留尖銳的邊緣其他部分用紋理來代替下圖是Intel公司網頁上的一個例子風格化圖像(續)用多種合成濾波方法產生油畫風格風格化圖像(續)利用類比的方法產生更多風格各異的圖像風格化圖像(續)紋理合成+類比的方法二維潛艇遊戲分析具備了最基本的遊戲要素:目標性、計分系統、競技性等。主要利用的技術:WindowsGDI、二維圖像二維潛艇遊戲分析(續)CMyObjectCSubmarineCMyShipCTorpedoCScoreCBombCExplosionCChildView二維潛艇遊戲分析(續)CMyObjectCMyObject

所有物體的基類CPointGetPos();virtualCRectGetRect();虛函數,獲得物體的矩形座標virtualboolDraw(CDC*pDC,boolbPause);在pDC上繪製當前物體圖像boolIsSubmarine();判斷當前物體是否是潛艇

二維潛艇遊戲分析(續)CMyShipCmyShip

我方戰艦,由CmyObject繼承

staticvoidDeleteImage();釋放記憶體

staticBOOLLoadImage();圖像初始化

boolDraw(CDC*pDC,boolbPause);繪製

voidSetMotion(intmotion)水準移動,motion是移動距離

intGetMotion() 獲取戰艦移動方面

CPointGetPos() 獲取戰艦繪製座標

CRectGetRect()獲得物體的矩形座標

二維潛艇遊戲分析(續)CSubmarineCsubmarine

敵方潛水艇

staticvoidDeleteImage();釋放記憶體

staticBOOLLoadImage();圖像初始化

CRectGetRect()獲得物體的矩形座標

intGetType()獲得潛艇類型,(綠色、黃色)

boolDraw(CDC*pDC,boolbPause);繪製

voidSetFireFlag()設置已經開火標誌,以防潛艇多次開火

boolGetFireFlag()判斷潛艇是否開火

二維潛艇遊戲分析(續)Cexplosion我方炸彈

CRectGetRect()獲得物體的矩形座標

intGetMulti() 獲取m_nMulti(標記連鎖爆炸的潛艇個數)

voidSetMulti(intMulti){m_nMulti=Multi;}設置m_nMulti boolDraw(CDC*pDC,boolbPause);繪製

二維潛艇遊戲分析(續)CScoreCscore分數顯示

boolDraw(CDC*pDC,boolbPause);繪製

CRectGetRect() (返回NULL,無效函數)

staticintGetTotalScore() {returnm_nTotalScore;}獲得當前總得分

高級紋理映射紋理映射(texturemapping)紋理映射的基本原理凹凸

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论