




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、北京郵電大學(xué)世紀(jì)學(xué)院北京郵電大學(xué)世紀(jì)學(xué)院 畢業(yè)設(shè)計(jì)畢業(yè)設(shè)計(jì)( (論文論文) ) 題 目 基于基于 directx 的第一人稱射擊游戲制作的第一人稱射擊游戲制作 學(xué) 號(hào) 000 學(xué)生姓名 專業(yè)名稱 通信工程 所在系(院) 通信與信息工程 指導(dǎo)教師 2012 年 6 月 1 日 北京郵電大學(xué)世紀(jì)學(xué)院畢業(yè)設(shè)計(jì)(論文)任務(wù)書北京郵電大學(xué)世紀(jì)學(xué)院畢業(yè)設(shè)計(jì)(論文)任務(wù)書 姓名學(xué)號(hào)通信工程系(院)通信與信息工程 設(shè)計(jì)(論文)題目基于 directx 的第一人稱射擊游戲制作 題目分類 工程設(shè)計(jì); 工程技術(shù)研究; 軟件工程(如 cai 課題等); 專題研究;藝術(shù)設(shè) 計(jì); 其他 題目來源 自然科學(xué)基金與部、省、市
2、級(jí)以上科研課題; 企、事業(yè)單位委托課題; 院級(jí)課題; 自擬課題 其他 指導(dǎo)教師(指導(dǎo)教師 組組長及成員姓名) 職 稱工作單位備注 講師北郵信通院指導(dǎo)老師 畢業(yè)設(shè)計(jì)(論文)的內(nèi)容和要求: 注意:選題盡量與實(shí)際應(yīng)用需求相結(jié)合。要求寫明本設(shè)計(jì)(論文)所涉及的分析方法或技 術(shù)手段(如定性、定量分析的方法) ;要求有學(xué)生獨(dú)立的見解,設(shè)計(jì)內(nèi)容要詳細(xì)寫明具體步 驟和技術(shù)指標(biāo)。 開發(fā)一個(gè)簡(jiǎn)單的第一人稱射擊游戲: 1 游戲規(guī)劃,包括角色模型,菜單界面等; 2 創(chuàng)建和使用紋理和光照,增加對(duì)硬件光照和紋理的支持; 3 在程序中增加對(duì)腳本和 gui 的支持; 4 用邊界框和邊界球?yàn)橛螒蚣尤肱鲎矙z測(cè); 5 通過 dir
3、ect input 為游戲引擎加入輸入檢測(cè)功能,檢測(cè)來自鍵盤,鼠標(biāo)等設(shè)備 的輸入; 6 使用 directsound 和 directmucic 播放聲音,創(chuàng)建 3d 攝像機(jī)系統(tǒng)。 應(yīng)完成的工作和提交材料要求(課題完成后應(yīng)提交成果的種類、數(shù)量、質(zhì)量等方面的要求): 開題報(bào)告:3000 字左右; 論文的中文摘要:200-300 字左右,包含關(guān)鍵詞,并譯成英文。 英文摘要以 250 個(gè)左右實(shí)詞為宜; 論文正文不少于 15000 字; 可執(zhí)行文件及源代碼; 盡量結(jié)合課題,翻譯 1500 漢字以上的有關(guān)技術(shù)資料或?qū)I(yè)文獻(xiàn); 參考文獻(xiàn)中,主要的文獻(xiàn)應(yīng)達(dá)到 10 篇以上,其中外文文獻(xiàn)在 2 篇以上。 主要
4、參考文獻(xiàn)(參考文獻(xiàn)不少于 4 篇,參考文獻(xiàn)目錄按 gb/t77142005 的要求填寫): 1 左魯梅.三維圖形引擎中的關(guān)鍵技術(shù)研究d.北京:北京理工大學(xué),2009 : 2130 2 孫家廣.計(jì)算機(jī)圖形學(xué)m.清華大學(xué)出版社.2008 : 5070 3 王鴿鴿.三維引擎的研究與實(shí)現(xiàn)d. 遼寧:東北大學(xué).2008 : 2050 4 房曉溪. 游戲引擎教程m.中國水利水電出版社, 2008 : 3040 5 葉至軍. visual c+/directx9 3d 游戲開發(fā)導(dǎo)引 directx9 game programming tutorials. m.人民郵電出版社, 2006 : 5060 6 陳
5、卡. directx 9 3d 圖形程序設(shè)計(jì)m.上??茖W(xué)技術(shù)出版社, 2003 : 2555 7 allen sherrod. directx 游戲開發(fā)終極指南 ultimate game programming with directxm.清華大學(xué)出版社, 2008 : 5667 8 拉莫澤. 3d 游戲編程大師技巧m.人民郵電出版社, 2005 : 7780 9 david m. bourg / 射線類 class cplane; / 平面類 class cpolygon; / 多邊形類 #includeray.h #includeplane.h #includepolygon.h #in
6、cludemathdefines.h #endif 4.2.1 向量 如前所述,向量是3d游戲開發(fā)中涉及的最基本對(duì)象。3d向量保存在3d空間中指 定位置的3個(gè)軸上。這些軸分別是x軸、y軸和z軸,分別代表空間中的寬度、高度和 深度。這些值可對(duì)3d環(huán)境中的任意物體定位。3d向量是一個(gè)包含三個(gè)浮點(diǎn)數(shù)的結(jié)構(gòu)。 3d數(shù)學(xué)庫中有關(guān)向量的部分在引擎gameengine項(xiàng)目中文件vector.h與vector.cpp中 定義和實(shí)現(xiàn)。在這兩個(gè)文件中除了定義了向量在vc+中結(jié)構(gòu)體的表示方法外,還包 括向量長度、點(diǎn)積、叉積、向量歸一化的計(jì)算,以及direct3d向量的定義和各種數(shù) 學(xué)運(yùn)算。為其它部分調(diào)用向量計(jì)算提供
7、基礎(chǔ)。 4.2.2 矩陣 在計(jì)算機(jī)圖形學(xué)中,諸如矩陣這樣的對(duì)象可以控制物體的位置和旋轉(zhuǎn)。矩陣是 浮點(diǎn)數(shù)的2d數(shù)組,可以對(duì)矢量進(jìn)行平移、旋轉(zhuǎn)、縮放和變換。從根本上講,矩陣是 由行和列構(gòu)成的表。矩陣有多種形式,如33、34和44。這里矩陣的數(shù)分別代 表2d數(shù)組包含的行數(shù)和列數(shù)。例如,44矩陣由16個(gè)元素組成,因?yàn)?4矩陣有4 行,4列(44=16)。3d數(shù)學(xué)庫中有關(guān)矩陣的部分在引擎gameengine項(xiàng)目中文件 matrix.h與matrix.cpp中定義和實(shí)現(xiàn)。在這兩個(gè)文件中除了定義了矩陣的在vc+中 的表示方法外,還包括44矩陣的乘法、轉(zhuǎn)置和旋轉(zhuǎn)計(jì)算,以及direct3d矩陣內(nèi)置 對(duì)象和函數(shù)的
8、初始化。 4.2.3 四元組 旋轉(zhuǎn)是3d編程中最常用的操作之一。旋轉(zhuǎn)用于改變物體方向,或是繞著場(chǎng)景中 某個(gè)軸或具體的點(diǎn)轉(zhuǎn)動(dòng),并且可以移動(dòng)骨骼動(dòng)畫中要用到的骨架點(diǎn)。正因?yàn)樾D(zhuǎn)如 此重要,所以提高它們的精確度、速度和效率具有很重要的意義。例如,就骨骼動(dòng) 畫而言,存儲(chǔ)效率和速度對(duì)系統(tǒng)也許是最重要的兩個(gè)要素,這是由系統(tǒng)的復(fù)雜性和 存儲(chǔ)旋轉(zhuǎn)數(shù)據(jù)所需的內(nèi)存就決定的。 曾有一段時(shí)間使用矩陣實(shí)現(xiàn)旋轉(zhuǎn),出現(xiàn)過問題。這主要是因?yàn)槭褂镁仃嚂?huì)消耗 大量內(nèi)存和運(yùn)算時(shí)間,甚至在某些時(shí)候會(huì)產(chǎn)生gimble lock問題而無法準(zhǔn)確計(jì)算旋 轉(zhuǎn)結(jié)果。而四元組是4d數(shù)學(xué)對(duì)象,并不是4d矢量,但能當(dāng)作4d矢量對(duì)待。它充分解 決了使用
9、矩陣轉(zhuǎn)換的缺點(diǎn)。用四元組計(jì)算會(huì)得到更平滑的計(jì)算結(jié)果,更準(zhǔn)確的旋轉(zhuǎn), 而不會(huì)受到gimble lock的影響。 3d數(shù)學(xué)庫中有關(guān)四元組的部分在引擎gameengine項(xiàng)目中文件quaternion.h與 quaternion.cpp中定義和實(shí)現(xiàn)。在這兩個(gè)文件中除了定義了四元組在vc+中結(jié)構(gòu)體 的表示方法外,還包括四元組點(diǎn)積、長度、乘法等的計(jì)算。 4.2.4 射線 射線是包含原點(diǎn)(位置)和方向的結(jié)構(gòu)。射線主要在查看兩個(gè)平面是否發(fā)生碰撞, 或相互之間可能會(huì)出現(xiàn)碰撞時(shí)做碰撞檢測(cè)使用。同樣,可以通過鼠標(biāo)使用射線來選 擇對(duì)象。計(jì)算機(jī)圖形學(xué)中射線的另一種用途是實(shí)現(xiàn)一種名為射線跟蹤的渲染技術(shù)。 簡(jiǎn)單地講,射線
10、跟蹤是在場(chǎng)景中發(fā)射射線,并確定哪一根射線擊中了哪一個(gè)物體。 3d數(shù)學(xué)庫中有關(guān)射線的部分在引擎gameengine項(xiàng)目中文件ray.h與ray.cpp中定 義和實(shí)現(xiàn)。在這兩個(gè)文件中定義了射線在vc+中結(jié)構(gòu)體的表示方法。 4.2.5 平面 平面是一個(gè)無限擴(kuò)展的區(qū)域。是3d場(chǎng)景中的核心部分,如果沒有平面,將無法 進(jìn)行諸如幾何圖形選擇和碰撞檢測(cè)等操作。 3d數(shù)學(xué)庫中有關(guān)平面的部分在引擎gameengine項(xiàng)目中文件plane.h與plane.cpp 中定義和實(shí)現(xiàn)。在這兩個(gè)文件中定義了平面在vc+中結(jié)構(gòu)體的表示方法以及計(jì)算三 角形法線,判斷平面與平面、平面與射線間是否相交,點(diǎn)與平面的關(guān)系,點(diǎn)與平面 的距
11、離等計(jì)算的實(shí)現(xiàn)。同時(shí),它們也實(shí)現(xiàn)了direct3d平面的初始化操作。 4.2.6 三角形和多邊形 direct3d應(yīng)用程序中的一些圖元由諸如多邊形這樣的對(duì)象構(gòu)成。多邊形是封閉 的平面圖形,邊界由一些線段組成。多邊形是一個(gè)面,由三個(gè)或更多的相連成形的 點(diǎn)構(gòu)成。讀者可以見到,最常用的一類多邊形是三角形。三角形由三個(gè)互連在一起 組成像2d金字塔形狀的不同點(diǎn)構(gòu)成。 3d數(shù)學(xué)庫中有關(guān)三角形和多邊形的部分在引擎gameengine項(xiàng)目中文件 polygon.h與polygon.h.cpp中定義和實(shí)現(xiàn)。在這兩個(gè)文件中定義了三角形和多邊形 在vc+中結(jié)構(gòu)體的表示方法。 4.3 directx3d 光照 光照是
12、一門為3d場(chǎng)景增加真實(shí)感的技術(shù),它以某種方式通過對(duì)物體分布不同的 亮光和黑暗形成陰影而實(shí)現(xiàn)真實(shí)感。如同在現(xiàn)在許多游戲中見到的一樣,光照可以 將場(chǎng)景帶入到一個(gè)全新的真實(shí)感層次。為場(chǎng)景增加光照會(huì)對(duì)已渲染的場(chǎng)景產(chǎn)生巨大 的影響。圖4.3給出了相同場(chǎng)景的三個(gè)不同光照的版本。左邊的場(chǎng)景沒有光照和陰 影,中間的場(chǎng)景有光照而沒有陰影,右邊的場(chǎng)景兩者都有。 圖 4.3 相同場(chǎng)景的三個(gè)不同光照版本 4.3.1 光源 光源是 3d 場(chǎng)景中發(fā)光的物體。這種所謂的光會(huì)導(dǎo)致陰影發(fā)生不同的變化,因 而產(chǎn)生更具有真實(shí)感和更令人感興趣的場(chǎng)景。通過在場(chǎng)景中基于“光”信息讓物體 從亮到黑逐漸發(fā)生變化,可以在圖形程序中創(chuàng)建非常真實(shí)
13、的光照模擬。然后增加陰 影,只是在看不見光源的表面上出現(xiàn)亮度變化,如黑色或是黑灰色。換句話說,有 另一個(gè)表面介于光源和要增加陰影的表面之間。 通常在計(jì)算機(jī)圖形學(xué)中有三類光源需要考慮,分別是點(diǎn)光源、聚光光源和方向 性光源。 (一)點(diǎn)光源 點(diǎn)光源是一種在某個(gè)距離上向所有方向發(fā)光的光源。隨著光傳播一定的距離, 它會(huì)損失一定的能量而且亮度也會(huì)逐漸降低。 (二)聚光光源 聚光光源在一定距離上散法能量(類似于點(diǎn)光源)。與點(diǎn)光源的差別在于聚光光 源是通過一個(gè)圓錐將光發(fā)射到 3d 場(chǎng)景中,而不是在各個(gè)方向都發(fā)光。 (三)方向性光源 在計(jì)算機(jī)圖形學(xué)中,第三種光被稱為方向光。這些光像是從某個(gè)方向發(fā)生出來 的,而沒
14、有特定的光源(整理者:類似于太陽光)。現(xiàn)實(shí)生活中,所有的光源都有一 個(gè)產(chǎn)生光的源點(diǎn),但在計(jì)算機(jī)圖形學(xué)中產(chǎn)生一種沒有發(fā)光源點(diǎn)的光源也是可能的。 在光照計(jì)算機(jī)過程中,通過幾個(gè)數(shù)學(xué)計(jì)算就可以實(shí)現(xiàn)該光源。這些光源看上去不是 很真實(shí),但它們?cè)阡秩竞?jiǎn)單的場(chǎng)景和簡(jiǎn)單形狀的演示程序時(shí),卻足以滿足要求。 4.3.2 反射模型 反射模型描述了光照射到某個(gè)表面時(shí),入射光在物體表面上的作用方式。當(dāng)一 些光被反射回場(chǎng)景中時(shí),一部分光能被存儲(chǔ)。這些表面也就是所謂的材料。材料只 是一些屬性,描述了材料被照射時(shí)做出的滿應(yīng)方式。更改這些屬性將得到不同的效 果。計(jì)算機(jī)圖形學(xué)中有許多不同的反射模型,但最常用的模型分別是環(huán)境光反射模
15、 型、漫反射模型和鏡面反射模型。反射模型和光屬性一起確定了 3d 場(chǎng)景中物體的 外觀。 (一)環(huán)境光反射 環(huán)境光反射描述的是場(chǎng)景中沒有方向的光,但是可以從各個(gè)地方都可以看到。 因?yàn)閺拿總€(gè)表面將光反射回來,這樣就很難辨認(rèn)光的原始位置。環(huán)境光試著模擬全 局照明,這是場(chǎng)景中光從場(chǎng)景表面反射回來多次之后形成的光總量。當(dāng)光從表面上 反射離開的時(shí)候,它沿著一定的方向反射。這些光線中的一部分進(jìn)入到觀察者的眼 睛中,這樣就可以看到周圍的環(huán)境。 (二)漫反射 漫反射模型描述了光線從表面上在各個(gè)方向做相同反射的方式。這意味著如果 看一個(gè)只由漫反射光照的物體,那么從各個(gè)角度看上去該物體都是相同的。漫反射 是視覺獨(dú)立
16、的,只有物體移動(dòng)或是光移動(dòng)時(shí),才會(huì)發(fā)生變化。當(dāng)光線照射在散射表 面時(shí),它會(huì)在多個(gè)方向反射。物體越光滑,反射光線散射得越光滑。除了物體的陰 影區(qū)域外,物體從各個(gè)角度看上去都一樣。 (三)鏡面反射 鏡面反射模型模擬了從光滑發(fā)光表面如鏡子、一塊金屬或一塊發(fā)光塑料等發(fā)射 光線的情況。表面的鏡面屬性就是在光線中看到的大部分物體上發(fā)亮的光。如果移 動(dòng)一個(gè)發(fā)光物體,就會(huì)注意到鏡面亮光區(qū)所發(fā)生的變化。這意味著鏡面反射取決于 觀察物體的角度。所以漫反射光與視覺無關(guān),而鏡面反射光與視覺相關(guān)。 4.3.3 在 directx3d 中創(chuàng)建光照與材質(zhì)模型 為了在 direct3d 中創(chuàng)建光源,必須創(chuàng)建一個(gè) d3dlig
17、ht 對(duì)象。為了方便起見, 下面程序設(shè)置了光照結(jié)構(gòu)。不必設(shè)置所有的屬性值,而屬性值的設(shè)置取決于創(chuàng)建的 光源類型。 typedef struct _d3dlight9 d3dlighttype type; / 定義了所要?jiǎng)?chuàng)建的光源類型 d3dcolorvalue diffuse; / 該光源所發(fā)出的漫射光的顏色 d3dcolorvalue specular; / 該光源所發(fā)出的鏡面光的顏色 d3dcolorvalue ambient; / 該光源所發(fā)出的環(huán)境光的顏色 d3dvector position; / 用于描述光源在世界坐標(biāo)系中位置的向 量。 d3dvector direction; /
18、 一個(gè)描述光在世界坐標(biāo)系中傳播方向的 向量。 float range; / 光線“消亡”前,所能達(dá)到的最大光程。 float falloff; / 僅用于聚光燈。定義了光強(qiáng)從內(nèi)錐形到 外錐形的衰減方式 float attenuation0; / 該衰減變量定義了光強(qiáng)隨距離衰減的方 式。僅用于點(diǎn)光源和聚光燈 float attenuation1; / 同 attenuation0 float attenuation2; / 同 attenuation0 float theta; / 僅用于聚光燈。指定了內(nèi)部錐形的圓錐 角,單位為弧度 float phi; / 僅用于聚光燈。指定了外部錐形的圓錐
19、角,單位為弧度 d3dlight9; 同樣,在 directx3d 中定義的材質(zhì)結(jié)構(gòu)體如下: typedef struct d3dmaterial9 d3dcolorvalue diffuse; / 指定表面反射的漫反射光 d3dcolorvalue ambient; / 指定表面反射的環(huán)境光 d3dcolorvalue specular; / 指定表面反射的鏡面光 d3dcolorvalue emissive; / 表面本身自發(fā)光 float power; / 鏡面高光 d3dmaterial9, *lpd3dmaterial9; 4.3.4 引擎中增加對(duì)光照的支持 項(xiàng)目一開始先創(chuàng)建名為li
20、ght.h、material.h的兩個(gè)文件。light.h頭文件用于 創(chuàng)建燈源結(jié)構(gòu),該結(jié)構(gòu)用于創(chuàng)建direct3d中的燈源對(duì)象。以某種方式實(shí)現(xiàn)該結(jié)構(gòu), 這樣也可將其用于opengl或其他渲染系統(tǒng)。material.h與光源結(jié)構(gòu)非常相似,因?yàn)?它可同時(shí)用于為direct3d和opengl創(chuàng)建材質(zhì)數(shù)據(jù)。材質(zhì)結(jié)構(gòu)包含了創(chuàng)建不同類型材 質(zhì)所必須的全部信息。 在引擎渲染接口文件renderinterface.h與定義實(shí)現(xiàn)文件d3drenderer.h和 d3drenderer.cpp中添加對(duì)光源材質(zhì)設(shè)置的聲明與定義,以及啟動(dòng)光源函數(shù)。如下: / 設(shè)置并啟用光源 void cd3drenderer:set
21、light(stlight *light, int index) if(!light | !m_device | index ambienta; l.ambient.r = light-ambientr; l.ambient.g = light-ambientg; l.ambient.b = light-ambientb; l.attenuation0 = light-attenuation0; l.attenuation1 = light-attenuation1; l.attenuation2 = light-attenuation2; l.diffuse.a = light-diffus
22、ea; l.diffuse.r = light-diffuser; l.diffuse.g = light-diffuseg; l.diffuse.b = light-diffuseb; l.direction.x = light-dirx; l.direction.y = light-diry; l.direction.z = light-dirz; l.falloff = light-falloff; l.phi = light-phi; l.position.x = light-posx; l.position.y = light-posy; l.position.z = light-p
23、osz; l.range = light-range; l.specular.a = light-speculara; l.specular.r = light-specularr; l.specular.g = light-specularg; l.specular.b = light-specularb; l.theta = light-theta; if(light-type = light_point) l.type = d3dlight_point; else if (light-type = light_spot) l.type = d3dlight_spot; else l.ty
24、pe = d3dlight_directional; m_device-setlight(index, m_device-lightenable(index, true); 4.4 directx3d 紋理 開發(fā)令人信任的背景和環(huán)境是3d游戲項(xiàng)目的核心所在。場(chǎng)景中的幾乎每個(gè)表面 都會(huì)應(yīng)該人一種很強(qiáng)的視覺效果和觸模感。磚墻是由磚塊構(gòu)成的,木板箱是由許多 塊木板構(gòu)成的,還有諸如此類等等。針對(duì)當(dāng)前這種辦法,產(chǎn)生的問題就是為了獲取 表面上更好的細(xì)節(jié)層次,就需要上千萬的獨(dú)立的著色小三角形,這樣,創(chuàng)建游戲場(chǎng) 景耗費(fèi)的時(shí)間就無法估計(jì),沒有什么經(jīng)濟(jì)價(jià)值,并且還要占用大量的處理器資源。 解決上述問題需要一種更好
25、的增加細(xì)節(jié)層次的方法,并且不會(huì)增加不必要的代 碼或是對(duì)象和場(chǎng)景的復(fù)雜度?!凹y理映射”技術(shù)可以實(shí)現(xiàn)這樣的效果。紋理映射使 用了圖像數(shù)據(jù)并將圖像數(shù)據(jù)繪制(映射)到表面上。該表面看上去就像有一幅圖在它 上面。所以,如果有一堵墻,并將磚塊的紋理施加到這堵墻上面,那么即便只是這 個(gè)表面使用了兩個(gè)三角形,它看上去也像場(chǎng)景中的一堵墻。如圖4.4中的示例。 圖 4.4 紋理貼圖示例 4.4.1 創(chuàng)建使用紋理 在direct3d中加載圖像時(shí)要用到一個(gè)名為lpdirect3dtexture9的結(jié)構(gòu)。 lpdirect3dtexture9結(jié)構(gòu)是direct3d中的紋理對(duì)象,在加載1d或2d紋理圖像時(shí)要用 到該結(jié)構(gòu)。
26、無論何時(shí)創(chuàng)建lpdirect3dtexture9紋理對(duì)象,都要調(diào)用對(duì)象的release()函 數(shù)對(duì)其進(jìn)行釋放。下列程序代碼列舉了d3dxcreatetexture()的原型: hresult winapi d3dxcreatetexture( lpdirect3ddevice9 pdevice, / direct3d9的設(shè)備對(duì)象 uint width, / 圖像寬度 uint height, / 圖像高度 uint miplevels, / 圖片的圖層,一般用d3dx_default,與圖像質(zhì)量 有關(guān) dword usage, /設(shè)定這個(gè)紋理的使用方法 d3dformat format, /
27、每個(gè)顏色成分使用的位數(shù) d3dpool pool, / 紋理對(duì)象駐留的內(nèi)存類別 lpdirect3dtexture9 * pptexture / 指向新創(chuàng)建的紋理對(duì)象 ); 4.4.2 引擎中增加對(duì)紋理的支持 引擎中添加紋理要做的第一件事情就是增加啟用和禁用透明度渲染狀態(tài)、設(shè)置 透明度渲染狀態(tài)值并指明濾波器和濾波器類型的功能。這些可以在 defines.h 頭文 件中完成,如下列程序所示。新添加的代碼位于 defines.h 頭文件的尾部。 / 一些渲染狀態(tài) enum renderstate cull_none, cull_cw, cull_ccw, depth_none, depth_rea
28、donly, depth_readwrite, shade_points, shade_solidtri, shade_wiretri, shade_wirepoly, transparency_none, / 禁用透明度 transparency_enable / 啟用透明度 ; / 透明度渲染狀態(tài)值 enum transstate trans_zero = 1, trans_one, trans_srccolor, trans_invsrccolor, trans_srcalpha, trans_invsrcalpha, trans_dstalpha, trans_invdstalpha,
29、 trans_dstcolor, trans_invdstcolor, trans_srcalphasat, trans_bothsrcalpha, trans_invbothsrcalpha, trans_blendfactor, trans_invblendfactor ; / 紋理過濾器的過濾模式 enum texturestate min_filter, / 縮小率 mag_filter, / 放大率 mip_filter / mipmap 紋理級(jí)別 ; / 紋理過濾器類型 enum filtertype point_type, / 最近點(diǎn)采樣 linear_type, / 線性紋理過
30、濾 anisotropic_type / 各向異性紋理過濾 ; 下一步是在引擎渲染接口文件renderinterface.h與定義實(shí)現(xiàn)文件d3drenderer.h 和d3drenderer.cpp中添加對(duì)紋理設(shè)置的聲明與定義,以及紋理讀取、透明度,幕 外渲染等各種函數(shù)。代碼略。 4.5 directx3d 文本和圖形用戶界面 4.5.1 directx3d 文本 為了在一個(gè)基本層次上顯示文本,要用到兩個(gè)不同的對(duì)象,即lpd3dxfont和 rect這兩個(gè)結(jié)構(gòu)。lpd3dxfont用于創(chuàng)建和顯示文本,而rect用于確定要顯示的文本 位置。為了創(chuàng)建lpd3dxfont對(duì)象,就要用到一個(gè)名為d3d
31、xcreatefont()的函數(shù)。該 函數(shù)原型如下列程序清單所示。其成員變量如下: hresult d3dxcreatefont( lpdirect3ddevice9 pdevice, int height, / 字體字符的高度 uint width, / 字體字符的寬度 uint weight, / 打印字體的權(quán)重(即:粗體) uint miplevels, / 文本的mipmap級(jí)別 bool italic, / 字體是否為斜體 dword charset, / 用到的字符集 dword outputprecision, / 指定windows與期望字體大小的匹配方法 dword qual
32、ity, / 指定windows將字體和真實(shí)字體的匹配方法 dword pitchandfamily, / 斜度和family索引 lpctstr pfacename, / 要用的字體類型名稱 lpd3dxfont * ppfont / 要填充的lpd3dxfont對(duì)象 ); 渲染文本對(duì)象就要用到lpd3dxfont對(duì)象的drawtext()函數(shù)。即在屏幕上顯示指 定的文本。程序的原形如下: int drawtext( lpd3dxsprite psprite, / 指向包含字符串的lpd3dxsprite對(duì)象的指針 lpctstr pstring, / 屏幕上要顯示的文本 int count
33、, / 字符串字符的數(shù)目 lprect prect, / 一個(gè)rect對(duì)象,定義了要顯示在屏幕上的第 一個(gè)字符的起始位置 dword format, / 指定字符串的顯示方式 d3dcolor color / 屏幕上顯示的文本顏色 ); 4.5.2 創(chuàng)建和顯示圖形用戶界面 用戶圖形界面(gui)系統(tǒng)將主要由按鈕和靜態(tài)文本控件對(duì)象構(gòu)成。同時(shí),可 以指定和按鈕、文本一起顯示的背景圖。 gui 系統(tǒng)包括含有紋理坐標(biāo)的 gui 頂點(diǎn)結(jié)構(gòu)、gui 控件結(jié)構(gòu)和 gui 系統(tǒng)類。gui 頂點(diǎn)結(jié)構(gòu)包括(x,y,z)點(diǎn)的坐標(biāo);gui 控件結(jié)構(gòu)包括控件類型、id、顏色、索引鏈表 等信息;gui 系統(tǒng)類包括添加設(shè)備
34、、背景圖像 gui、返回高度長度等函數(shù)。除此之 外,還要有一個(gè)系統(tǒng)回調(diào)函數(shù),來響應(yīng)控件動(dòng)作。這些功能定義在 gui.h 中,代碼 如下: / gui 控件結(jié)構(gòu) struct stguicontrol int m_type; / 控件類型 int m_id; / 控件 id unsigned long m_color; / 控件顏色 int m_listid; / 鏈表索引,字體對(duì)象 id 或頂點(diǎn)緩存 id int m_xpos, m_ypos; / 控件的 xy 坐標(biāo) int m_width, m_height; / 控件的寬和高 char *m_text; / 指向靜態(tài)控件文本字符的指針 i
35、nt m_uptex, m_downtex, m_overtex; / 按鈕的彈起、按下和停靠 ; / gui 控件系統(tǒng)類 class cguisystem public: / 構(gòu)造函數(shù) cguisystem() : m_controls(0), m_totalcontrols(0), m_backdropid(-1) / 析構(gòu)函數(shù) cguisystem() shutdown(); int increasecontrols(); / 添加背景圖控件 bool addbackdrop(int texid, int staticid); / 添加靜態(tài)文本控件 bool addstatictext(
36、int id, char *text, int x, int y, unsigned long color, int fontid); / 添加按鈕控件 bool addbutton(int id, int x, int y, int width,int height, int upid, int overid,int downid,unsigned int staticid); / 內(nèi)存清理 void shutdown(); / 獲取指定 id 的 gui 控件對(duì)象 stguicontrol *getguicontrol(int id) if (id = m_totalcontrols) r
37、eturn null; return / 返回控件對(duì)象總數(shù) m_totalcontrols int gettotalcontrols() return m_totalcontrols; / 返回指定背景圖控件對(duì)象 stguicontrol *getbackdrop() if (m_backdropid = 0 / 失敗則返回 0 值 return null; private: stguicontrol *m_controls; / gui 控件對(duì)象指針 int m_totalcontrols; / 控件對(duì)象的數(shù)量 int m_backdropid; / 背景圖控件的 id ; 4.5.3 引擎
38、中增加對(duì)文本和 gui 的支持 引擎文件中添加了很多代碼,這樣可以顯示文本和 gui。defines.h 頭文件為 gui 提供了許多新的 define(定義)語句。下列程序給出了 defines.h 頭文件中新添 加的代碼。 / 用于確定 gui 元素在屏幕上的位置 #define percent_of(a, b) (int)(a * b) / gui 控件矩形的靈活頂點(diǎn)格式 #define gui_fvf 2 / gui 控件類型 #define ugp_gui_statictext 1 / 靜態(tài)文本控件 #define ugp_gui_button 2 / 按鈕控件 #define ug
39、p_gui_backdrop 3 / 背景圖控件 / 鼠標(biāo)的狀態(tài) #define ugp_button_up 1 / 左鍵在按鈕上彈起 #define ugp_button_over 2 / ??吭诎粹o上 #define ugp_button_down 3 / 左鍵在按鈕上按下 對(duì)于 gui,引擎中主要提供對(duì) gui.h 文件中各個(gè)函數(shù)的實(shí)現(xiàn)。代碼略。另外, 還要更新 renderinterface.h、d3drenderer.h 和 d3drenderer.cpp 文件。這樣可 以擴(kuò)充 gui 系統(tǒng),這些類中新添加的函數(shù)有 creategui()、addguibackdrop()、 addg
40、uistatictext()、addguibutton()和 processgui()。新增變量有 m_guilist(gui 界面鏈表)和 m_totalguis(確定系統(tǒng)中要顯示的 gui 界面數(shù)量)。定 義代碼如下: class cd3drenderer : public crenderinterface public: / .the original class functions. / 添加背景圖 gui bool addguibackdrop(int guiid, char *filename); / 添加靜態(tài)文本 gui bool addguistatictext(int gui
41、id, int id, char *text, int x, int y, unsigned long color, int fontid); / 添加按鈕 gui bool addguibutton(int guiid, int id, int x, int y, char *up, char *over, char *down); / 繪制 gui void processgui(int guiid, bool lmbdown, int mousex,int mousey, void(*funcptr)(int id, int state); / .the rest of the clas
42、ss functions. 4.6 directx3d 特效 3d游戲最值得關(guān)注的主題之一就是它的視覺效果。特效用于表現(xiàn)自然世界或虛 擬世界中的圖形學(xué)現(xiàn)象。這包括爆炸、雪、雨、霧、光照效果、動(dòng)態(tài)模糊、反射等。 就像在電影行業(yè)中一樣,特效可以增強(qiáng)屏幕內(nèi)容。在實(shí)時(shí)和非實(shí)時(shí)仿真中可以實(shí)現(xiàn) 很多效果。正確的特效有助于增強(qiáng)用戶更深層的體驗(yàn)。這里將介紹幾種可運(yùn)用到 direct3d場(chǎng)景中增強(qiáng)場(chǎng)景真實(shí)感的不同技術(shù)。同時(shí)還將介紹使用多采樣降低渲染物 體,基于頂點(diǎn)的霧,細(xì)節(jié)紋理映射和一個(gè)簡(jiǎn)單的雨粒子系統(tǒng)。 4.6.1 多采樣 全景抗混疊是一種減少在渲染多邊形的邊時(shí)所產(chǎn)生的參差不齊效果的方法???混疊物體也會(huì)對(duì)渲
43、染后的整個(gè)場(chǎng)景產(chǎn)生負(fù)面影響,尤其是處理動(dòng)畫更是如此。通過 實(shí)現(xiàn)對(duì)像素的本地模糊處理,并在屏幕上顯示出一個(gè)平均結(jié)果而實(shí)現(xiàn)全景抗混疊。 圖 4.5(左)是抗混疊物體, (右)為場(chǎng)景渲染后的物體。 圖 4.5 多采樣示例圖 在direct3d中啟用多采樣將實(shí)現(xiàn)程序中的抗混疊。多采樣將對(duì)程序性能的影響 很大。采樣數(shù)越高,渲染的場(chǎng)景質(zhì)量就越好。樣本最大數(shù)取決于支持它的硬件。在 direct3d 9.0中,多采樣類型包含了 d3dmultisample_none、d3dmultisample_nonmaskable、d3dmultisample_2_sample s以及d3dmultisample_16_
44、samples。默認(rèn)情況下使用d3dmultisample_none,這意 味著并不使用任何類型的多采樣。使用d3dmultisample_2_samples和 d3dmultisample_16_samples或它們之間任意其他采樣都會(huì)讓direct3d知道在對(duì)場(chǎng) 景多采樣時(shí)使用的樣本數(shù)。 4.6.2 霧 為 3d 場(chǎng)景增加霧會(huì)得到更真實(shí)的渲染效果。霧可以增加大量真實(shí)感,尤其對(duì) 地形、樹林地區(qū)以及幽靈般的戶外背景。同樣,霧可以很好地限制觀察者對(duì)環(huán)境的 可見度?,F(xiàn)實(shí)中并不存在無限的視覺距離。事實(shí)上,這就是虛擬環(huán)境的一個(gè)鏡像。 direct3d 中有兩類硬件霧可用:頂點(diǎn)霧和像素霧。頂點(diǎn)霧是按照每
45、個(gè)頂點(diǎn)來計(jì) 算霧的數(shù)據(jù),而像素霧根據(jù)像素級(jí)別計(jì)算霧的數(shù)據(jù)。由于通常像素比頂點(diǎn)要多得多, 因此兩者相比而言,像素霧的渲染速度較慢。同樣,頂點(diǎn)霧提供了很好的視覺效果。 有了頂點(diǎn)霧,就可以在表面上逐點(diǎn)內(nèi)插處理霧的信息。 圖 4.6 是采用霧特效的一個(gè)截圖: 圖 4.6 霧特效截圖 4.6.3 粒子系統(tǒng) 粒子系統(tǒng)保存和操縱一種稱為粒子的元素。粒子系統(tǒng)的職責(zé)就是對(duì)粒子施加不 同的作用力,為它們?cè)黾右环N真實(shí)的外觀。粒子系統(tǒng)的類型包括爆炸、煙、火、火 花等,而其他類型的效果可由許多小的元素構(gòu)成。粒子是一個(gè)小物體,包含多種屬 性,如位置、速度(方向)和質(zhì)量。 相關(guān)粒子特效的程序內(nèi)容保存在文件 rainps.h
46、 和 rainps.cpp 中。圖 4.7 是 “粒子雨”特效: 圖 4.7 粒子特效截圖 4.6.4 引擎中增加對(duì)特效的支持 為了在引擎中支持特效,首先在defines.h文件中為想要在引擎中使用的霧和 多采樣功能添加幾個(gè)define語句。對(duì)霧而言,將使用想要?jiǎng)?chuàng)建的霧的枚舉類型。對(duì) 多采樣而言,將使用可以支持的多采樣枚舉類型。對(duì)該引擎而言,這里將支持非多 采樣、2倍、4倍、8倍和16倍速率采樣等幾種采樣類型。霧枚舉類型的名稱是 ugp_fog_type,而多采樣枚舉類型的名稱是ugp_ms_type。在define.h文件中添加 的代碼如下: / multi-sampling. enum u
47、gp_ms_type ugp_ms_none, ugp_ms_samples_2, ugp_ms_samples_4, ugp_ms_samples_8, ugp_ms_samples_16 ; / fog. enum ugp_fog_type ugp_vertex_fog, ugp_pixel_fog ; 然后需要在引擎渲染接口文件renderinterface.h與定義實(shí)現(xiàn)文件d3drenderer.h 和d3drenderer.cpp中添加對(duì)特效的設(shè)置的聲明與定義,以及特效多采樣、霧和粒 子系統(tǒng)等各種函數(shù)。代碼略。 4.7 基本腳本系統(tǒng) 通過在程序中編寫腳本的方法,允許用戶和程序員以腳本
48、的內(nèi)容來控制系統(tǒng)的 行為。腳本是一個(gè)包含了大量告訴程序工作方式的指令文件(文本或二進(jìn)制)??梢?在不需要重新編譯程序的情況下,通過更改腳本文件來改變程序的行為。通過在文 件中放置指令,程序員可以打開文件、讀取腳本,按照腳本中的內(nèi)容執(zhí)行所要執(zhí)行 的工作。一些有名的腳本系統(tǒng)包括(game monkey腳本、java腳本、unreal腳本、 lua和python)。在游戲中使用腳本就增加了讓用戶修改程序的可能性。 4.7.1 屬性腳本系統(tǒng) 屬性腳本只需定義屬性及其值即可。從另一個(gè)角度理解,屬性腳本就是定義了 變量及其值的腳本文件?;旧?,屬性腳本系統(tǒng)都必須讀取文本文件中的每個(gè)屬性 及其后面的值。對(duì)它
49、而言,為了這樣做,那就必須指定像分隔符這樣內(nèi)容。 屬性腳本系統(tǒng)包含propertyscript.h頭文件、propertyscript.cpp源文件。在 propertyscript.h頭文件。在該文件中定義了一個(gè)枚舉變量,以枚舉這里將要支持 的不同類型的屬性,一個(gè)定義矢量對(duì)象(3個(gè)分量)的結(jié)構(gòu),一個(gè)名為cvariable的屬 性類以及屬性腳本系統(tǒng)自身。cvariable類用于存儲(chǔ)單個(gè)屬性,在其中定義了屬性 名、屬性類型以及一個(gè)支持每種類型的成員變量。 屬性腳本系統(tǒng)cpropertyscript包含3個(gè)成員變量:一列cvariable對(duì)象、列表 中的屬性總數(shù)、跟蹤正在讀取的當(dāng)前字符的計(jì)數(shù)器。最
50、后一個(gè)成員變量只有讀取文 件時(shí)才用到,這樣可以在解析文件時(shí)確定位置。一旦讀取完文件,最后一個(gè)成員變 量就沒有用了。 由于屬性可以是4種不同類型之一,因此同樣需要有成員函數(shù)返回每種類型。 這在cvariable和cpropertyscript兩個(gè)類中都可以實(shí)現(xiàn)。需要有一種方法能夠確定 屬性類型,這樣才能返回正確的成員變量。下列程序清單給出了完整的 propertyscript.h頭文件。 / 枚舉了一些類型 enum envartype null_var = 0, int_var, float_var, string_var, vector_var ; / 存儲(chǔ)3d向量類型的結(jié)構(gòu) struct
51、stvector stvector() : x(0), y(0), z(0) float x, y, z; ; / 用于描述單個(gè)屬性(文本)的類 class cvariable public: cvariable() : type(0), floatval(0), intval(0), stringval(0) name0 = 0; vecval.x = vecval.y = vecval.z = 0; cvariable() if(stringval) delete stringval; stringval = null; / 用新的變量名替換舊的變量名,然后調(diào)用重載函數(shù),完成數(shù)據(jù)的設(shè)置 v
52、oid setdata(int t, char* n, void *data); / 設(shè)置數(shù)據(jù) void setdata(int t, void *data); / 獲取屬性名 char *getname() return name; / 獲取屬性值的類型 int gettype() return type; / 獲取int類型的屬性值 int getdataasint() return intval; / 獲取float類型的屬性值 float getdataasfloat() return floatval; / 獲取string類型的屬性值 char *getdataasstring()
53、 return stringval; / 獲取stvector類型的屬性值 stvector getdataasvector() return vecval; private: char name128; / 屬性名 int type; / 屬性類型 / 對(duì)應(yīng)類型的屬性值 int intval; float floatval; char *stringval; stvector vecval; ; / 總的屬性腳本系統(tǒng)類 class cpropertyscript public: cpropertyscript(); cpropertyscript(); bool increasevariab
54、lelist(); bool loadscriptfile(char *filename); private: / 獲取當(dāng)前所讀取的一行中某個(gè)單獨(dú)文本,并保存在第2個(gè)參數(shù)中 void parsenext(char *templine, char *varname); public: bool addvariable(char *name, int t, void *val); bool setvariable(char *name, int t, void *val); int getvariableasint(char *name); float getvariableasfloat(cha
55、r *name); char *getvariableasstring(char *name); stvector getvariableasvector(char *name); void shutdown(); private: cvariable *variablelist; / cvariable對(duì)象鏈表,用于保存各個(gè) 屬性名及屬性值 int m_totalvars; / 列表中的屬性總數(shù) int currentlinechar; / 正在讀取的當(dāng)前字符的個(gè)數(shù)的計(jì)數(shù) 器 ; 4.7.2 命令腳本系統(tǒng) 下一個(gè)腳本系統(tǒng)是基于命令的腳本。命令腳本是一種在文件中包含許多命令的 腳本。命令腳本和
56、屬性腳本非常相似,除了每一行第一個(gè)單詞所代表的意思不同之 外。在基于命令的腳本中,通常要有一個(gè)文件,并且會(huì)解釋該文件,直到文件執(zhí)行 到結(jié)束或是出現(xiàn)錯(cuò)誤為止。在腳本示例中,先有一個(gè)命令腳本,后面跟著命令實(shí)現(xiàn) 自己任務(wù)所需的一套信息。 命令腳本系統(tǒng)包含 commandscript.h 頭文件和 commandscript.cpp 源文件。 commandscript.h 頭文件包含了一個(gè)保存 3 個(gè)組件對(duì)象的結(jié)構(gòu),這 3 個(gè)組件稱為 stvector,還包含了腳本系統(tǒng)的類。腳本系統(tǒng)包含了用于加載腳本文件、提取命令、 提取有效腳本文件中不同類型值(字符串、整數(shù)等)、清理系統(tǒng)等的函數(shù),以及大量 用于在
57、整個(gè)腳本文件中移動(dòng)位置的不同函數(shù)(例如:移動(dòng)到開始位置、移動(dòng)到下一 行等)。對(duì)成員變量而言,它們將記錄文件中的總行數(shù),當(dāng)前行位置,所處當(dāng)前行 中的當(dāng)前字符以及整個(gè)文件自身。通過所在當(dāng)前行的當(dāng)前字符可以了解當(dāng)前正在處 理的行的位置。下列程序清單給出了該演示程序完整的頭文件。 struct stvector stvector() : x(0), y(0), z(0) float x, y, z; ; class ccommandscript public: ccommandscript(); ccommandscript(); bool loadscriptfile(char *filename)
58、; void parsecommand(char *destcommand); void parsestringparam(char *deststring); bool parseboolparam(); int parseintparam(); float parsefloatparam(); void shutdown(); void movetostart(); void movetonextline(); int getcurrentlinenum(); int gettotallines(); bool islinecomment(); private: int totalscri
59、ptlines; int currentline; int currentlinechar; char *m_script; ; 4.7.3 令牌流 不論是屬性腳本系統(tǒng)還是命令腳本系統(tǒng),所使用的這些內(nèi)容有一個(gè)共同點(diǎn),即 它們是用分隔符分開的。分開的每一組文本稱為一個(gè)令牌。文件可以由許多令牌組 成,每個(gè)令牌都有自己的用途和含義。在不考慮出現(xiàn)令牌原因的情況下,令牌只是 一些文本。有時(shí)可以將文件分隔成一系列令牌令牌流。雖然有一種獲取信息的 方法,但如果本該使用令牌流而沒有使用,那么這個(gè)方法就不是很清晰。例如,對(duì) 屬性腳本而言,使用令牌流,所要做的全部工作就是調(diào)用某類函數(shù),如 getnexttoken
60、(),將其賦給屬性名稱,然后再次調(diào)用 getnexttoken()函數(shù)獲取屬性 值。 令牌流實(shí)現(xiàn)的程序在 token.h 頭文件和 token.cpp 源文件中。token.h 除了構(gòu) 造函數(shù)和析構(gòu)函數(shù)之外,還將添加一個(gè) reset()函數(shù),這樣可以返回到該文件的頭 部,兩個(gè)重載函數(shù) getnexttoken()用于返回文件中的令牌,一個(gè) movetonextline()函 數(shù)用于移動(dòng)到文件的下一行,還有一個(gè) shutdown()函數(shù)用于在類做完工作后清理所 有使用的對(duì)象。token.h 程序清單如下: class ctoken public: ctoken() : m_length(0),
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 個(gè)人技術(shù)轉(zhuǎn)讓合同
- 公司租車協(xié)議年
- 道路冬季灰土施工方案
- 專業(yè)音樂會(huì)現(xiàn)場(chǎng)布置服務(wù)合同
- 小區(qū)管網(wǎng)施工方案
- 豐臺(tái)小區(qū)路面施工方案
- 雨花石鋪地面施工方案
- 張家界硫酸池防腐施工方案
- 荊門學(xué)校防雷工程施工方案
- 綠地軟景施工方案
- 八年級(jí)物理全冊(cè)全套試卷測(cè)試卷(含答案解析)
- 2024年黑龍江林業(yè)職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫完整答案
- 2025中國華電校園招聘高頻重點(diǎn)提升(共500題)附帶答案詳解
- 住宅建筑室內(nèi)裝飾裝修設(shè)計(jì)管理研究
- 四級(jí)人工智能訓(xùn)練師(中級(jí))職業(yè)技能等級(jí)認(rèn)定考試題庫(含答案)
- 教育部《中小學(xué)校園食品安全和膳食經(jīng)費(fèi)管理工作指引》專題講座
- 2024年江蘇省中小學(xué)生金鑰匙科技競(jìng)賽(高中組)考試題庫(含答案)
- 理療課件教學(xué)課件
- 2024解析:第十二章滑輪-講核心(解析版)
- 《非精密進(jìn)近》課件
- 2024 年下半年數(shù)學(xué)一年級(jí)數(shù)學(xué)思維挑戰(zhàn)試卷
評(píng)論
0/150
提交評(píng)論