![《游戲開(kāi)發(fā)基礎(chǔ)-基于Unity游戲引擎》全套教學(xué)課件_第1頁(yè)](http://file4.renrendoc.com/view12/M02/09/3C/wKhkGWczP6mAH-0ZAACAcB1x5Hw247.jpg)
![《游戲開(kāi)發(fā)基礎(chǔ)-基于Unity游戲引擎》全套教學(xué)課件_第2頁(yè)](http://file4.renrendoc.com/view12/M02/09/3C/wKhkGWczP6mAH-0ZAACAcB1x5Hw2472.jpg)
![《游戲開(kāi)發(fā)基礎(chǔ)-基于Unity游戲引擎》全套教學(xué)課件_第3頁(yè)](http://file4.renrendoc.com/view12/M02/09/3C/wKhkGWczP6mAH-0ZAACAcB1x5Hw2473.jpg)
![《游戲開(kāi)發(fā)基礎(chǔ)-基于Unity游戲引擎》全套教學(xué)課件_第4頁(yè)](http://file4.renrendoc.com/view12/M02/09/3C/wKhkGWczP6mAH-0ZAACAcB1x5Hw2474.jpg)
![《游戲開(kāi)發(fā)基礎(chǔ)-基于Unity游戲引擎》全套教學(xué)課件_第5頁(yè)](http://file4.renrendoc.com/view12/M02/09/3C/wKhkGWczP6mAH-0ZAACAcB1x5Hw2475.jpg)
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Unity游戲引擎介紹全套可編輯PPT課件什么是游戲引擎一款完整的游戲引擎,能夠提供給游戲開(kāi)發(fā)者穩(wěn)定的底層框架和完善的游戲創(chuàng)作工具,使得開(kāi)發(fā)者更加關(guān)心游戲的內(nèi)容和可玩性,不用再去過(guò)多地?fù)?dān)心游戲程序的底層細(xì)節(jié),而且能夠讓開(kāi)發(fā)出來(lái)的游戲產(chǎn)品更加穩(wěn)定可靠。有了游戲引擎,游戲的開(kāi)發(fā)過(guò)程更加簡(jiǎn)單,同時(shí)大大降低開(kāi)發(fā)成本、縮短開(kāi)發(fā)周期,進(jìn)而降低研發(fā)的風(fēng)險(xiǎn)。出于以上原因,越來(lái)越多的開(kāi)發(fā)者傾向于使用健全的游戲引擎來(lái)制作自己的游戲。正因?yàn)橛旋嫶蟮氖袌?chǎng)需求,游戲引擎的市場(chǎng)才逐漸形成。UnrealEngine4(虛幻引擎,UE4)CryEngineCocos2DUnityEngine什么是游戲引擎簡(jiǎn)單地說(shuō),引擎就是“用于控制所有游戲功能的主程序,從計(jì)算圖形圖像、碰撞、物理系統(tǒng)和物體的相對(duì)位置,到接受玩家的輸入,以及按照正確的音量輸出聲音等等?!睙o(wú)論是2D游戲還是3D游戲,無(wú)論是角色扮演游戲、即時(shí)策略游戲、冒險(xiǎn)解謎游戲或是動(dòng)作射擊游戲,哪怕是一個(gè)只有1兆的小游戲,都有這樣一段起控制作用的代碼。經(jīng)過(guò)不斷的進(jìn)化,如今的游戲引擎已經(jīng)發(fā)展為一套由多個(gè)子系統(tǒng)共同構(gòu)成的復(fù)雜系統(tǒng),從建模渲染、動(dòng)畫(huà)到光影、粒子特效,從物理系統(tǒng)、碰撞檢測(cè)到文件管理、網(wǎng)絡(luò)特性,還有專(zhuān)業(yè)的所見(jiàn)即所得編輯工具和插件,幾乎涵蓋了開(kāi)發(fā)過(guò)程中的所有重要環(huán)節(jié)。總而言之,游戲引擎是一種可復(fù)用的、適應(yīng)性較強(qiáng)的游戲開(kāi)發(fā)中間件,游戲開(kāi)發(fā)人員可以使用同一套游戲引擎來(lái)開(kāi)發(fā)出不同的游戲產(chǎn)品甚至可以很方便地把同一款游戲產(chǎn)品發(fā)布到不同的運(yùn)行平臺(tái)上。/madewith資源商店提供了各種免費(fèi)或者付費(fèi)的資源和插件。Unity的下載與安裝Unity官方地址:Unity的下載與安裝Unity下載地址(點(diǎn)擊首頁(yè)的“獲取Unity”進(jìn)入):/cnUnity的下載與安裝點(diǎn)擊“使用個(gè)人版”進(jìn)入下載頁(yè)面->下載Windows版安裝程序(如果是蘋(píng)果Mac操作系統(tǒng),請(qǐng)選擇MacOSX版的安裝程序),下載Unity安裝助手Unity的下載與安裝運(yùn)行Unity安裝助手Unity的下載與安裝運(yùn)行Unity安裝助手運(yùn)行Unity雙擊Unity圖標(biāo),打開(kāi)UnityUnity游戲工程的構(gòu)成結(jié)構(gòu)Project工程:一個(gè)游戲便是一個(gè)工程;Scene場(chǎng)景:一個(gè)游戲包括一個(gè)或者多個(gè)游戲場(chǎng)景/關(guān)卡。GameObject游戲?qū)ο螅簶?gòu)成游戲的各種對(duì)象,例如場(chǎng)景模型、角色以及其他抽象(如某種控制模塊)的但是確實(shí)存在于場(chǎng)景中的對(duì)象。Component組件:是Unity的核心架構(gòu)。每個(gè)游戲?qū)ο笥梢粋€(gè)或者多個(gè)組件構(gòu)成,每種組件賦予游戲?qū)ο竽撤N功能。Script腳本:是實(shí)現(xiàn)Component的腳本程序,現(xiàn)在Unity支持C#語(yǔ)言(一種與Java語(yǔ)言類(lèi)似的語(yǔ)言,只要會(huì)Java,上手C#非常簡(jiǎn)單)。Unity中定義的重要概念資源(Assets):在3D游戲的制作過(guò)程中,需要用到各種各樣的資源,這些資源包括模型、貼圖、聲音、程序腳本等等。在Unity3D中通通被稱(chēng)為資源(Asset),可以把資源比喻成3D游戲制作過(guò)程中的原材料,通過(guò)原材料的不同組合和利用,便形成了一個(gè)游戲產(chǎn)品。Unity中定義的重要概念工程(Project):在Unity3D中,工程就是一個(gè)游戲項(xiàng)目。這個(gè)工程包括了該游戲場(chǎng)景所需要的各種資源,還有關(guān)卡、場(chǎng)景和游戲?qū)ο蟮鹊?。在?chuàng)建一個(gè)新的游戲之前,必須先創(chuàng)建一個(gè)游戲工程。游戲工程可以想象成實(shí)現(xiàn)游戲的工廠。它里面有游戲的資源倉(cāng)庫(kù)、制作游戲的裝配間和打包輸出的車(chē)間等等。Unity中定義的重要概念場(chǎng)景(Scenes):場(chǎng)景可以想象成一個(gè)游戲界面,或者一個(gè)游戲關(guān)卡。在一個(gè)打開(kāi)的場(chǎng)景中,游戲開(kāi)發(fā)者通過(guò)編輯器為該場(chǎng)景組裝各種游戲資源,這些資源被放置到場(chǎng)景中之后成為一個(gè)個(gè)游戲?qū)ο螅ㄟ^(guò)這些游戲?qū)ο髮?shí)現(xiàn)該游戲關(guān)卡中的各種功能。場(chǎng)景相當(dāng)于制作游戲過(guò)程中不同部分的不同車(chē)間,在不同的車(chē)間中,搭建不同的場(chǎng)景。。Unity中定義的重要概念游戲?qū)ο螅℅ameObject):游戲?qū)ο笫墙M成游戲場(chǎng)景必不可少的對(duì)象。各種各樣的游戲?qū)ο笸ㄟ^(guò)資源的組裝并加入到游戲場(chǎng)景中,只有某種資源被放置在游戲場(chǎng)景中,才會(huì)生成游戲?qū)ο?。游戲?qū)ο蟾鶕?jù)功能的需要有不同的屬性,通過(guò)這些屬性來(lái)控制游戲?qū)ο蟮牟煌袨椤?。Unity中定義的重要概念組件(Component),在Unity3D中是用于控制游戲?qū)ο髮傩缘募?。每一個(gè)組件包括了游戲?qū)ο蟮哪撤N特定的功能屬性,例如Transform組件,用于控制物體的位置、旋轉(zhuǎn)和縮放??梢酝ㄟ^(guò)組件中的參數(shù)來(lái)修改物體的屬性,甚至你通過(guò)編寫(xiě)一個(gè)腳本程序并把該程序添加到游戲?qū)ο笾?,成為它的一個(gè)組件,并利用監(jiān)視器(Inspector)來(lái)編輯你想要的屬性值。簡(jiǎn)而言之,組件其實(shí)就是定義了游戲?qū)ο蟮膶傩院托袨?。Unity中定義的重要概念腳本(Scripts):我們知道,游戲與其他娛樂(lè)方式(電影、圖書(shū)、電視、廣播等等)的最大區(qū)別在于可互動(dòng)性?;?dòng)性是游戲的最基本特征之一,而程序腳本便是實(shí)現(xiàn)可互動(dòng)性的最有利的工具。通過(guò)編寫(xiě)程序可以控制游戲中的每一個(gè)游戲?qū)ο螅覀兛梢宰屗麄兏鶕?jù)我們的需要改變他們的狀態(tài)和行為。最新版本的Unity支持C#程序語(yǔ)言。Unity支持使用C++、Java等其他語(yǔ)言編寫(xiě)的插件。Unity中定義的重要概念預(yù)置(Prefabs):有的時(shí)候我們會(huì)在Unity3D中為游戲?qū)ο筇砑痈鞣N組件,并設(shè)置好它的屬性和行為,最后需要反復(fù)利用這些已經(jīng)修改好的對(duì)象。Unity3D為我們提供了一種保存這種設(shè)置的方法,該種方法稱(chēng)為保存預(yù)置(Prefab)。界面與操作介紹Unity中的C#程序基本語(yǔ)法變量聲明(變量名規(guī)定首字母為小寫(xiě),使用駝峰命名法):[public/private][int/float/bool/double/string/GameObect]ValName=[defaultVal];如publicintscore=0;privatefloatspeedVal=20f;函數(shù)聲明(函數(shù)名規(guī)定首字母為大寫(xiě),使用駝峰命名法):[public/private]returnValFunctionName(ParametersList){FunctionBlock}如publicintHurtCharacter(intdamageVal){damage-=damageVal;}類(lèi)的聲明(類(lèi)名規(guī)定首字母為大寫(xiě),使用駝峰命名法):[public/private]ClassName:[SuperClass]{}學(xué)習(xí)要點(diǎn):語(yǔ)法與Java的語(yǔ)法非常類(lèi)似,只是一些表達(dá)方式有所區(qū)分,如繼承的表達(dá)在java中是extends,在C#中用的是冒號(hào):。在編程的學(xué)習(xí)中,不要刻意追求某種語(yǔ)言的好與壞,只有是否合適,沒(méi)有最好的。同時(shí),掌握了基本的編程思想(如面向?qū)ο缶幊獭⒚嫦蜻^(guò)程編程、數(shù)據(jù)結(jié)構(gòu)以及相關(guān)算法)后,基本上可以做到語(yǔ)言無(wú)關(guān)。使用Unity中的C#進(jìn)行程序編程,除了面向?qū)ο蟮幕菊Z(yǔ)法之外,還需要了解它所提供的API,同時(shí)要熟悉一些常用的API。Unity手冊(cè):
/Manual/index.htmlUnity腳本APIDocumentation:
/ScriptReference/index.htmlUnity中的關(guān)鍵事件回調(diào)機(jī)制在游戲的整個(gè)運(yùn)行機(jī)制中,最關(guān)鍵的一個(gè)架構(gòu)便是游戲大循環(huán),如果使用C++或者java等實(shí)現(xiàn)一個(gè)游戲時(shí),基本上都要使用到大(主)循環(huán)。但是在游戲引擎中,該大循環(huán)已經(jīng)給你封裝起來(lái),只為你提供相關(guān)的調(diào)用接口,所以需要熟悉這些接口的調(diào)用時(shí)機(jī)和作用。Unity中的關(guān)鍵事件回調(diào)機(jī)制Awake():一個(gè)游戲?qū)ο蟊粍?chuàng)建之前會(huì)被調(diào)用一次,主要用于初始化一些參數(shù)。Start():一個(gè)游戲?qū)ο蟊患せ顣r(shí)調(diào)用一次,也是用于初始化一些參數(shù)。Update():游戲大循環(huán)的入口,每一幀會(huì)被調(diào)用一次,直到游戲結(jié)束。該函數(shù)主要用于監(jiān)聽(tīng)和更新各種事件和參數(shù)。比如監(jiān)聽(tīng)鍵盤(pán)輸入,使游戲?qū)ο蟾淖兾恢玫鹊取nEnable():當(dāng)一個(gè)游戲?qū)ο蟊患せ顣r(shí)調(diào)用一次。OnDisable():當(dāng)一個(gè)游戲?qū)ο笫r(shí),但未銷(xiāo)毀時(shí)被調(diào)用一次。其他回調(diào)函數(shù):在Unity中,如果函數(shù)前面帶有On介詞,那么便表示為回調(diào)函數(shù)。要使得腳本具有以上回調(diào)函數(shù)功能,該類(lèi)需要繼承自Unity的MonoBehavior類(lèi)。其他回調(diào)函數(shù)可以參考文檔:
/Manual/ExecutionOrder.html代碼演示創(chuàng)建一個(gè)腳本,名為:EventTest輸入一下代碼:保存后把代碼掛在場(chǎng)景中的MainCamera對(duì)象上。點(diǎn)擊運(yùn)行,觀察控制臺(tái)。
游戲開(kāi)發(fā)基礎(chǔ)
--打地鼠游戲制作(Whac-A-Mole)浙江傳媒學(xué)院:張帆本章內(nèi)容介紹—打地鼠游戲洞口位置的計(jì)算和存儲(chǔ)。地鼠出現(xiàn)的頻率控制。地鼠的隨機(jī)生成和銷(xiāo)毀。游戲時(shí)間和分?jǐn)?shù)。當(dāng)時(shí)間少于15秒時(shí)增加地鼠出現(xiàn)頻率。實(shí)現(xiàn)錘子的擊打動(dòng)畫(huà)。為游戲加上音效。重新開(kāi)始游戲。導(dǎo)出游戲?!洞虻厥蟆酚螒蚪榻B《打地鼠》(原名:Whac-A-Mole)最早可以追溯到1976年由美國(guó)創(chuàng)意工程股份有限公司(CreativeEngineering,Inc.)推出的一款有償街機(jī)游戲。游戲規(guī)則在一定時(shí)間內(nèi),地鼠隨機(jī)出現(xiàn)在洞口,玩家要在它出現(xiàn)的時(shí)候擊中它,擊中加分,反之地鼠會(huì)自動(dòng)消失,時(shí)間耗盡則游戲結(jié)束。隨著游戲時(shí)間的減少,老鼠出現(xiàn)的頻率越來(lái)越高,存在的時(shí)間也越來(lái)越短,游戲難度逐步上升。所需圖片資源-Sprite游戲背景洞口地鼠錘子SortLayer—用于圖片資源的繪制順序程序?qū)崿F(xiàn)要點(diǎn)洞口位置的存儲(chǔ)結(jié)構(gòu)和計(jì)算。地鼠出現(xiàn)的頻率控制。地鼠的隨機(jī)生成和銷(xiāo)毀。游戲時(shí)間和分?jǐn)?shù)。開(kāi)始初始化洞口位置隨機(jī)位置生成地鼠是否打到地鼠計(jì)時(shí)結(jié)束游戲結(jié)束否是生成被打到地鼠圖像并計(jì)分一定時(shí)間后銷(xiāo)毀地鼠否是否程序?qū)崿F(xiàn)要點(diǎn)洞口位置的存儲(chǔ)結(jié)構(gòu)和計(jì)算。地鼠出現(xiàn)的頻率控制。地鼠的隨機(jī)生成和銷(xiāo)毀。游戲時(shí)間和分?jǐn)?shù)。GameController:用于洞口生成以及判斷游戲進(jìn)程。Mole:用于控制地鼠的消失、判斷是否地鼠被打到以及計(jì)分。Beaten:用于地鼠被打到后的銷(xiāo)毀工作。Timer:用于計(jì)時(shí)。Restart:用于游戲重啟。ChangeCursor:用于錘子的打擊反饋動(dòng)畫(huà)。程序?qū)崿F(xiàn)要點(diǎn)洞口位置的存儲(chǔ)結(jié)構(gòu)和計(jì)算。(思考,應(yīng)該使用什么數(shù)據(jù)結(jié)構(gòu)呢?)地鼠出現(xiàn)的頻率控制。地鼠的隨機(jī)生成和銷(xiāo)毀。游戲時(shí)間和分?jǐn)?shù)。程序?qū)崿F(xiàn)要點(diǎn)洞口位置的存儲(chǔ)結(jié)構(gòu)和計(jì)算。9個(gè)洞口的位置和狀態(tài)可用3x3二維數(shù)組存儲(chǔ)。地鼠出現(xiàn)的頻率控制。地鼠的隨機(jī)生成和銷(xiāo)毀。游戲時(shí)間和分?jǐn)?shù)。[2,0][2,1][2,2][1,0][1,1][1,2][0,0][0,1][0,2]9個(gè)洞口對(duì)應(yīng)的二維數(shù)組的行列索引,每個(gè)元素保存了該洞口的具體位置以及是否有地鼠的狀態(tài)。注:該例子以左下角對(duì)應(yīng)數(shù)據(jù)的索引號(hào)[0,0]。程序?qū)崿F(xiàn)要點(diǎn)洞口位置的存儲(chǔ)結(jié)構(gòu)和計(jì)算。9個(gè)洞口的位置和狀態(tài)可用3x3二維數(shù)組存儲(chǔ)。為后續(xù)隨機(jī)索引方便,把二維數(shù)組映射成一維數(shù)組。(思考:如何把二維數(shù)組映射到一位數(shù)組呢?)地鼠出現(xiàn)的頻率控制。地鼠的隨機(jī)生成和銷(xiāo)毀。游戲時(shí)間和分?jǐn)?shù)。[2,0][2,1][2,2][1,0][1,1][1,2][0,0][0,1][0,2]把a(bǔ)[m][n]映射到b[k]的公式為:k=i*n+jm、n分別表示二維數(shù)組的行數(shù)和列數(shù),i為元素所在行,j為元素所在列,同時(shí)0<=i<m,0<=j<n。程序?qū)崿F(xiàn)要點(diǎn)洞口位置的存儲(chǔ)結(jié)構(gòu)和計(jì)算。9個(gè)洞口的位置和狀態(tài)可用3x3二維數(shù)組存儲(chǔ)。為后續(xù)隨機(jī)索引方便,把二維數(shù)組映射成一維數(shù)組。每個(gè)洞口的位置,設(shè)相鄰洞口之間的橫向間隔為2個(gè)單位,縱向?yàn)?個(gè)單位。地鼠出現(xiàn)的頻率控制。地鼠的隨機(jī)生成和銷(xiāo)毀。游戲時(shí)間和分?jǐn)?shù)。1個(gè)單位2個(gè)單位程序?qū)崿F(xiàn)要點(diǎn)洞口位置的計(jì)算和存儲(chǔ)。地鼠出現(xiàn)的頻率控制。地鼠的隨機(jī)生成和銷(xiāo)毀。游戲時(shí)間和分?jǐn)?shù)。程序?qū)崿F(xiàn)要點(diǎn)洞口位置的計(jì)算和存儲(chǔ)。地鼠出現(xiàn)的頻率控制。地鼠的隨機(jī)生成和銷(xiāo)毀。游戲時(shí)間和分?jǐn)?shù)。使用到InvokeRepeating()函數(shù)程序?qū)崿F(xiàn)要點(diǎn)洞口位置的計(jì)算和存儲(chǔ)。地鼠出現(xiàn)的頻率控制。地鼠的隨機(jī)生成和銷(xiāo)毀。游戲時(shí)間和分?jǐn)?shù)。使用到InvokeRepeating()函數(shù)函數(shù)說(shuō)明:程序?qū)崿F(xiàn)要點(diǎn)洞口位置的計(jì)算和存儲(chǔ)。地鼠出現(xiàn)的頻率控制。地鼠的隨機(jī)生成和銷(xiāo)毀。生成對(duì)象用Instantiate函數(shù)銷(xiāo)毀對(duì)象用Destroy函數(shù)游戲時(shí)間和分?jǐn)?shù)。Instantiate函數(shù)文檔:/ScriptReference/Object.Instantiate.htmlDestroy函數(shù)文檔:/ScriptReference/Object.Destroy.html參數(shù): obj:要銷(xiāo)毀的對(duì)象 t:執(zhí)行該代碼之后多長(zhǎng)時(shí)間后才把該對(duì)象銷(xiāo)毀。
如:Destroy(this.gameObject,3.0f);
執(zhí)行該函數(shù)之后過(guò)3秒鐘把該對(duì)象銷(xiāo)毀掉。 ***this.gameObject或者直接使用gameObject表示掛載了當(dāng)前組件腳本的對(duì)象。也就是自身。如地鼠對(duì)象掛載了該腳本,那么gameObject對(duì)象指的就是地鼠對(duì)象。程序?qū)崿F(xiàn)要點(diǎn)洞口位置的計(jì)算和存儲(chǔ)。地鼠出現(xiàn)的頻率控制。地鼠的隨機(jī)生成和銷(xiāo)毀。銷(xiāo)毀對(duì)象用Destroy函數(shù)生成對(duì)象用Instantiate函數(shù)游戲時(shí)間和分?jǐn)?shù)。程序?qū)崿F(xiàn)要點(diǎn)洞口位置的計(jì)算和存儲(chǔ)。地鼠出現(xiàn)的頻率控制。地鼠的隨機(jī)生成和銷(xiāo)毀。銷(xiāo)毀對(duì)象用Destroy函數(shù)生成對(duì)象用Instantiate函數(shù)游戲時(shí)間和分?jǐn)?shù)。Instantiate函數(shù)文檔:/ScriptReference/Object.Instantiate.htmlDestroy函數(shù)文檔:/ScriptReference/Object.Destroy.html參數(shù): original:要生成的對(duì)象 position:在哪個(gè)位置生成該對(duì)象 rotation:對(duì)象生成后的初始朝向返回值:返回任何繼承自O(shè)bject(Unity中的基類(lèi))的對(duì)象。程序?qū)崿F(xiàn)要點(diǎn)洞口位置的計(jì)算和存儲(chǔ)。地鼠出現(xiàn)的頻率控制。地鼠的隨機(jī)生成和銷(xiāo)毀。銷(xiāo)毀對(duì)象用Destroy函數(shù)生成對(duì)象用Instantiate函數(shù)游戲時(shí)間和分?jǐn)?shù)。Instantiate函數(shù)文檔:/ScriptReference/Object.Instantiate.htmlDestroy函數(shù)文檔:/ScriptReference/Object.Destroy.html參數(shù): original:要生成的對(duì)象 position:在哪個(gè)位置生成該對(duì)象 rotation:對(duì)象生成后的初始朝向返回值:返回任何繼承自O(shè)bject(Unity中的基類(lèi))的對(duì)象。如:Instantiate(Gophers,newVector3(0,0.4F,-0.1F),Quaternion.identity);//在(0,0.4,-0.1)的位置上生成一個(gè)地鼠。**Quaternion.identiy表示默認(rèn)初始旋轉(zhuǎn)角度。***Quaternion為四元數(shù),用于表示旋轉(zhuǎn),可防止萬(wàn)向鎖。程序?qū)崿F(xiàn)要點(diǎn)洞口位置的計(jì)算和存儲(chǔ)。地鼠出現(xiàn)的頻率控制。地鼠的隨機(jī)生成和銷(xiāo)毀。銷(xiāo)毀對(duì)象用Destroy函數(shù)生成對(duì)象用Instantiate函數(shù)鼠標(biāo)左鍵擊打地鼠。游戲時(shí)間和分?jǐn)?shù)。Instantiate函數(shù)文檔:/ScriptReference/Object.Instantiate.htmlDestroy函數(shù)文檔:/ScriptReference/Object.Destroy.html程序?qū)崿F(xiàn)要點(diǎn)洞口位置的計(jì)算和存儲(chǔ)。地鼠出現(xiàn)的頻率控制。地鼠的隨機(jī)生成和銷(xiāo)毀。游戲時(shí)間和分?jǐn)?shù)。計(jì)時(shí):配合回調(diào)函數(shù)Update()和靜態(tài)變量Time.deltaTime來(lái)實(shí)現(xiàn)。程序?qū)崿F(xiàn)要點(diǎn)洞口位置的計(jì)算和存儲(chǔ)。地鼠出現(xiàn)的頻率控制。地鼠的隨機(jī)生成和銷(xiāo)毀。游戲時(shí)間和分?jǐn)?shù)。計(jì)時(shí):配合回調(diào)函數(shù)Update()和靜態(tài)變量Time.deltaTime來(lái)實(shí)現(xiàn)。**Update()函數(shù)是游戲制作的最關(guān)鍵函數(shù)之一,它在游戲大循環(huán)的每一幀調(diào)用一次,實(shí)現(xiàn)數(shù)據(jù)的更新,比如位置的改變等。程序?qū)崿F(xiàn)要點(diǎn)洞口位置的計(jì)算和存儲(chǔ)。地鼠出現(xiàn)的頻率控制。地鼠的隨機(jī)生成和銷(xiāo)毀。游戲時(shí)間和分?jǐn)?shù)。計(jì)時(shí):配合回調(diào)函數(shù)Update()和靜態(tài)變量Time.deltaTime來(lái)實(shí)現(xiàn)。**Update()函數(shù)是游戲制作的最關(guān)鍵函數(shù)之一,它在游戲大循環(huán)的每一幀調(diào)用一次,實(shí)現(xiàn)數(shù)據(jù)的更新,比如位置的改變等。***Time.deltaTime則是兩幀之間的時(shí)間差,即Time.deltaTime=currentFrameTime–preFrameTime;程序?qū)崿F(xiàn)要點(diǎn)洞口位置的計(jì)算和存儲(chǔ)。地鼠出現(xiàn)的頻率控制。地鼠的隨機(jī)生成和銷(xiāo)毀。游戲時(shí)間和分?jǐn)?shù)。Summary洞口位置的計(jì)算和存儲(chǔ)。地鼠出現(xiàn)的頻率控制。地鼠的隨機(jī)生成和銷(xiāo)毀。游戲時(shí)間和分?jǐn)?shù)。當(dāng)時(shí)間少于15秒時(shí)增加地鼠出現(xiàn)頻率。實(shí)現(xiàn)錘子的擊打動(dòng)畫(huà)。為游戲加上音效。重新開(kāi)始游戲。導(dǎo)出游戲。關(guān)于OnMouseDown函數(shù)是Unity中的一種回調(diào)函數(shù)。當(dāng)鼠標(biāo)按下按鍵的事件發(fā)生時(shí)會(huì)被調(diào)用。以后在Unity中發(fā)現(xiàn)有函數(shù)的最前面有On修飾,則表示該函數(shù)是在某種狀態(tài)下會(huì)被觸發(fā)運(yùn)行?!斗谱印罚∕emory、PairsGame…)Unity2017經(jīng)典游戲開(kāi)發(fā)教程:算法分析與實(shí)現(xiàn)《翻牌子》游戲規(guī)則介紹又名《卡牌對(duì)對(duì)翻》或叫《記憶翻牌》等等。游戲規(guī)則:找到兩兩對(duì)應(yīng)的牌子即可得分,找到所有對(duì)應(yīng)的卡牌結(jié)束游戲。玩家每次可以翻開(kāi)兩張牌,若一樣,則兩張牌將始終處于正面,否則,再次翻轉(zhuǎn)為背面。當(dāng)所有卡牌配對(duì)成功后,計(jì)時(shí)停止,游戲結(jié)束。本章內(nèi)容介紹--《記憶翻牌》游戲游戲資源導(dǎo)入與場(chǎng)景搭建??ㄅ瞥厣珊涂ㄅ婆帕小O磁???ㄅ茽顟B(tài)??ㄅ频呐鋵?duì)。本章內(nèi)容介紹--《記憶翻牌》游戲游戲資源導(dǎo)入與場(chǎng)景搭建??ㄅ瞥厣珊涂ㄅ婆帕?。洗牌??ㄅ茽顟B(tài)。卡牌的配對(duì)。程序?qū)崿F(xiàn)要點(diǎn)卡片排列和卡片池生成。洗牌(卡牌隨機(jī)生成)??ㄆ瑺顟B(tài)??ㄆ呐鋵?duì)。程序?qū)崿F(xiàn)要點(diǎn)卡片排列和卡片池生成。卡片在場(chǎng)景中的布局;該例子中共有12張卡牌,以3行4列的方式排列。使用一個(gè)數(shù)組來(lái)保存卡牌數(shù)據(jù)。洗牌(卡牌隨機(jī)生成)??ㄆ瑺顟B(tài)??ㄆ呐鋵?duì)。程序?qū)崿F(xiàn)要點(diǎn)卡片排列和卡片池生成。卡片在場(chǎng)景中的布局;該例子中共有12張卡牌,以3行4列的方式排列。使用一個(gè)數(shù)組來(lái)保存卡牌數(shù)據(jù)。洗牌(卡牌隨機(jī)生成)??ㄆ瑺顟B(tài)??ㄆ呐鋵?duì)。(-3,0)(-1,0)(1,0)(3,0)(-3,2.5)(-3,5)(-1,2.5)(1,2.5)(3,2.5)(-1,5)(1,5)(3,5)以每張卡片的中心為錨點(diǎn),以左下角卡片為起始點(diǎn)。坐標(biāo)為originalX=-3,originalY=0;相鄰兩張卡片橫向間隔設(shè)為offsetX=2,縱向間隔設(shè)offsetY=2.5;則每張卡片相對(duì)于左下角卡片的位置為:(x,y)=(offsetX*j+originalX,offsetY*i+originalY)i和j分別表示第i行和第j列i=0i=1i=2J=0J=1J=2J=3程序?qū)崿F(xiàn)要點(diǎn)卡片排列和卡片池生成。卡片在場(chǎng)景中的布局;該例子中共有12張卡牌,以3行4列的方式排列。使用一個(gè)數(shù)組來(lái)保存卡牌數(shù)據(jù)。洗牌(卡牌隨機(jī)生成)。共有12張牌,6種不同的牌面,每種牌面2張(如何確保每種卡片有2張?)??ㄆ瑺顟B(tài)??ㄆ呐鋵?duì)。程序?qū)崿F(xiàn)要點(diǎn)創(chuàng)建一個(gè)共有6個(gè)元素的一維數(shù)組images,用于存放6種不同的牌面。創(chuàng)建一個(gè)共有12個(gè)元素的一維數(shù)組numbers,并初始化給數(shù)組為:{0,0,1,1,2,2,3,3,4,4,5,5},每個(gè)元素的值代表images數(shù)組的對(duì)應(yīng)索引值。對(duì)numbers數(shù)組進(jìn)行洗牌,把元素中的數(shù)值打亂。按照?qǐng)鼍翱ㄅ频牟季?,在每一個(gè)對(duì)應(yīng)的位置生成卡牌的牌面對(duì)象。根據(jù)i和j,從numbers數(shù)組中取出對(duì)應(yīng)的image索引值,再按照該索引值找到每個(gè)牌面的圖像。Images數(shù)組初始的Numbers數(shù)組{0,0,1,1,2,2,3,3,4,4,5,5}洗牌后的Numbers數(shù)組{1,0,3,2,4,0,1,3,4,5,5,2}程序?qū)崿F(xiàn)要點(diǎn)關(guān)于洗牌:可采取很多的方式來(lái)進(jìn)行洗牌功能的操作。本例子的洗牌方式為:遍歷整個(gè)Numbers數(shù)組,獲得當(dāng)前索引i的元素值。從當(dāng)前元素的索引到最后元素的索引之間取隨機(jī)數(shù)r。對(duì)調(diào)i索引的元素和r索引的元素的值。直到i為最后元素的索引。{0,0,1,1,2,2,3,3,4,4,5,5}iri{1,0,0,1,2,2,3,3,4,4,5,5}ri{1,3,0,1,2,2,3,0,4,4,5,5}r{1,0,0,1,2,2,3,3,4,4,5,5}ri程序?qū)崿F(xiàn)要點(diǎn)按照?qǐng)鼍翱ㄅ频牟季郑?行4列),在每一個(gè)對(duì)應(yīng)的位置生成卡牌的牌面對(duì)象。根據(jù)i行和j列,從numbers數(shù)組中取出對(duì)應(yīng)的image索引值,再按照該索引值找到每個(gè)牌面的圖像。Images數(shù)組洗牌后的Numbers數(shù)組{1,0,3,2,4,0,1,3,4,5,5,2}通過(guò)Numbers獲得Images中的卡片類(lèi)型為:Images[number[i*gridCols+j]];如場(chǎng)景中第2行,第1列所對(duì)應(yīng)的Numbers的索引值為2*4+1=9,即該卡牌對(duì)應(yīng)Numbers中的元素為Numbers[9]=5,也就是獲得了Images所對(duì)應(yīng)的第5個(gè)卡片,即Images[5]=方塊卡片,最后把該圖片對(duì)象賦值給對(duì)應(yīng)位置的卡片對(duì)象即可。**Numbers中只是保存了Images對(duì)應(yīng)的索引號(hào),而Images才是保存了實(shí)際的圖片素材。程序?qū)崿F(xiàn)要點(diǎn)卡片池生成和卡牌排列。洗牌(卡牌隨機(jī)生成)??ㄆ瑺顟B(tài):共有三種狀態(tài):未被翻開(kāi)狀態(tài);翻開(kāi)狀態(tài)配對(duì)成功狀態(tài)??ㄆ呐鋵?duì)。未被翻開(kāi)狀態(tài)翻開(kāi)狀態(tài)配對(duì)成功狀態(tài)狀態(tài)轉(zhuǎn)換圖程序?qū)崿F(xiàn)要點(diǎn)卡片池生成??ㄆ瑺顟B(tài)??ㄆ呐鋵?duì)。為每種類(lèi)型設(shè)置不同的ID號(hào),當(dāng)有兩張牌處于翻開(kāi)狀態(tài)時(shí),判斷這兩張牌的ID號(hào)是否相等,如果相等,則表示配對(duì)成功,否則配對(duì)失敗。//偽代碼If(_firstRevealed.id==secondReveled.id){ //配對(duì)成功的操作,如加分等。}else{ //配對(duì)不成功的操作,如重新把牌翻回背面等。}關(guān)于協(xié)同程序(Coroutine)協(xié)同程序,即在主程序運(yùn)行時(shí)同時(shí)開(kāi)啟另一段邏輯處理,來(lái)協(xié)同當(dāng)前程序的執(zhí)行。最常見(jiàn)的用法是讓某個(gè)功能塊運(yùn)行到某個(gè)位置并暫停該功能塊的運(yùn)行,等到一定時(shí)間之后再繼續(xù)完成該功能塊的指令。用法:聲明一個(gè)返回值為Ienumerator的函數(shù);在函數(shù)的某個(gè)位置編寫(xiě)暫停語(yǔ)句:yieldreturnnewWaitForSeconds(1.5f);//讓該函數(shù)暫停1.5秒。在主線(xiàn)程的某個(gè)位置調(diào)用該協(xié)同程序,StartCoroutine(協(xié)同程序函數(shù)的函數(shù)名);/ScriptReference/Coroutine.html/ScriptReference/MonoBehaviour.StartCoroutine.html/ScriptReference/WaitForSeconds.html/ScriptReference/WaitForEndOfFrame.html/ScriptReference/MonoBehaviour.StopCoroutine.html拼圖(jigsawpuzzle)Unity2017經(jīng)典游戲開(kāi)發(fā)教程:算法分析與實(shí)現(xiàn)《拼圖》游戲介紹它的歷史可以追溯到1760年左右。英國(guó)雕刻師和制圖師約翰?斯皮爾斯伯里(JohnSpilsbury)將地圖貼在硬木板上,然后沿著國(guó)界線(xiàn)進(jìn)行切割,制作了最原始的拼圖。最初的拼圖是具有教育意義的,拼圖所用的圖片有些附有適合青少年閱讀的短文,有些則用于向新興資產(chǎn)階級(jí)傳授歷史或地理知識(shí)。游戲規(guī)則將一張圖片分成若干份(碎片),玩家把這些碎片按照原圖的樣式拼接起來(lái),則視為游戲成功。本章內(nèi)容介紹--《拼圖》游戲游戲資源導(dǎo)入與場(chǎng)景搭建。碎片對(duì)象的生成與初始化位置。原圖與碎片位置的對(duì)應(yīng)關(guān)系。鼠標(biāo)拖拽移動(dòng)碎片。碎片放置位置正確性判斷。工程創(chuàng)建與資源導(dǎo)入程序?qū)崿F(xiàn)要點(diǎn)碎片對(duì)象的生成與初始化位置。原圖與碎片位置的對(duì)應(yīng)關(guān)系。鼠標(biāo)拖拽移動(dòng)碎片。碎片放置位置正確性判斷。程序?qū)崿F(xiàn)要點(diǎn)-碎片對(duì)象的生成與初始化位置碎片對(duì)象的生成使用Resources類(lèi)來(lái)進(jìn)行碎片圖片資源的讀入與對(duì)象生成,并保存在一個(gè)數(shù)組中。程序?qū)崿F(xiàn)要點(diǎn)-原圖與碎片位置的對(duì)應(yīng)關(guān)系使用二維數(shù)組來(lái)保存每個(gè)碎片的對(duì)象(本例子中共有3x3=9張碎片)。假設(shè)二維數(shù)組第一個(gè)元素[0,0]保存第一張碎片,最后一個(gè)元素[2,2]保存最后一張碎片。二維數(shù)組中的每個(gè)碎片對(duì)象對(duì)應(yīng)一維數(shù)組碎片圖片的索引號(hào)為:圖片一維數(shù)組索引號(hào)=Row*ColNumber+Col其中:Row表示當(dāng)前二維數(shù)組一個(gè)元素所在的行號(hào),ColNumber表示二維數(shù)組每一行的列數(shù),Col表示當(dāng)前二維數(shù)組一個(gè)元素所在的列號(hào)。例如[1,2]對(duì)應(yīng)的碎片需要獲取的圖片為一維數(shù)組里的索引號(hào)為:1*3+2=5的圖片。[0,0][0,1][0,2][1,0][2,0][1,1][1,2][2,2][2,1]程序?qū)崿F(xiàn)要點(diǎn)-碎片的初始化位置碎片的初始化放置只需要使用隨機(jī)數(shù)(Random.Range)即可。程序?qū)崿F(xiàn)要點(diǎn)-原圖與碎片位置的對(duì)應(yīng)關(guān)系
1/2WWW程序?qū)崿F(xiàn)要點(diǎn)-原圖與碎片位置的對(duì)應(yīng)關(guān)系
WW[0,0][0,1][0,2][1,0][2,0][1,1][1,2][2,2][2,1]
1/2WWW程序?qū)崿F(xiàn)要點(diǎn)-鼠標(biāo)拖拽移動(dòng)碎片判斷鼠標(biāo)點(diǎn)擊的位置是否在碎片內(nèi):把鼠標(biāo)的屏幕坐標(biāo)轉(zhuǎn)換為世界坐標(biāo)(Mx,My);獲取碎片的坐標(biāo)(Sx,Sy).如果|Mx-Sx|<W/2,|My-Sy|<H/2,則表明鼠標(biāo)的世界坐標(biāo)位置在此碎片的范圍內(nèi),則判定碎片被選中。(此處不考慮圖層深度)實(shí)現(xiàn)被拖拽的碎片跟隨鼠標(biāo)移動(dòng)。獲得鼠標(biāo)的屏幕坐標(biāo)位置,并轉(zhuǎn)換為世界坐標(biāo)下的位置。碎片新的坐標(biāo)=鼠標(biāo)的世界坐標(biāo)+碎片位置與鼠標(biāo)位置的偏移量。鼠標(biāo)松開(kāi)時(shí),則進(jìn)行碎片位置匹對(duì)判斷。程序?qū)崿F(xiàn)要點(diǎn)-碎片放置位置正確性判斷
[0,0][0,1][0,2][1,0][2,0][1,1][1,2][2,2][2,1]A(x1,y1)B(x2,y2)程序?qū)崿F(xiàn)要點(diǎn)-碎片放置位置正確性判斷
[0,0][0,1][0,2][1,0][2,0][1,1][1,2][2,2][2,1]A(x1,y1)B(x2,y2)程序?qū)崿F(xiàn)要點(diǎn)-碎片放置位置正確性判斷
[0,0][0,1][0,2][1,0][2,0][1,1][1,2][2,2][2,1]A(x1,y1)B(x2,y2)程序?qū)崿F(xiàn)要點(diǎn)-碎片放置位置正確性判斷
if(|X2–X1|<臨界值&&|Y2–Y1|<臨界值){碎片坐標(biāo)=正確坐標(biāo)}else{碎片回到原來(lái)的位置;}其他Sprite類(lèi)為Unity中用于2D圖片的類(lèi)GameObject為Unity中代表游戲?qū)ο蟮念?lèi)。Transform類(lèi),用于保存游戲?qū)ο蟮奈恢?、旋轉(zhuǎn)和縮放數(shù)據(jù)。Camera類(lèi),用于控制攝像機(jī)的行為和屬性等。Vector2/Vector3:數(shù)學(xué)中的二維向量和三維向量。Resources類(lèi),可用于載入保存在Resources目錄下的資源,包括圖片、音頻等等。Mathf類(lèi):實(shí)現(xiàn)了常用的數(shù)學(xué)計(jì)算函數(shù),如絕對(duì)值(ABS)、正弦(Sin)等等。Start函數(shù)為回調(diào)函數(shù),在MonoBehavior類(lèi)中聲明,在子類(lèi)中實(shí)現(xiàn),一般用于初始化一個(gè)游戲?qū)ο蟆pdate函數(shù)為回調(diào)函數(shù),在MonoBehavior類(lèi)中聲明,在子類(lèi)中實(shí)現(xiàn),每幀調(diào)用一起,用于數(shù)據(jù)(如位置數(shù)據(jù),按鍵事件的監(jiān)聽(tīng))的更新。是游戲開(kāi)發(fā)中最重要的一個(gè)循環(huán)函數(shù)。Input.GetMouseButtonDown(0):監(jiān)聽(tīng)鼠標(biāo)按鍵按下的事件。OnMyMouseUp()當(dāng)鼠標(biāo)按鍵彈起時(shí)響應(yīng)。******建議查閱Unity的官方文檔,了解以上類(lèi)和方法*******Manual用戶(hù)手冊(cè)(建議先整體瀏覽一遍,了解unity能提供的功能,同時(shí)最好用英文文檔,練習(xí)閱讀英文文檔):/Manual/index.html?_ga=2.6416242.1527791948.1533267545-1582799829.1481427680腳本手冊(cè):/ScriptReference/index.html推箱子(Sokoban)Unity2017經(jīng)典游戲開(kāi)發(fā)教程:算法分析與實(shí)現(xiàn)《推箱子》游戲介紹推箱子是一個(gè)來(lái)自日本的電子游戲,其電子游戲最早于1981年由今林宏行編寫(xiě),并于1982年12月由日本的ThinkingRabbit公司發(fā)行,目的是在訓(xùn)練玩家的邏輯思考能力。游戲規(guī)則這個(gè)游戲是在一個(gè)正方形的棋盤(pán)上進(jìn)行的,每一個(gè)方塊表示一個(gè)地板或一面墻。地板可以通過(guò),墻面不可以通過(guò)。地板上放置了箱子,一些地板被標(biāo)記為存儲(chǔ)位置。玩家被限制在棋盤(pán)上,可以水平或垂直地移動(dòng)到空的方塊上(永遠(yuǎn)不會(huì)穿過(guò)墻或箱子)。箱子不得被推入其他箱子或墻壁,也不能被拉出。箱子的數(shù)量等于存儲(chǔ)位置的數(shù)量。當(dāng)所有的箱子都安放在儲(chǔ)藏地點(diǎn)時(shí),游戲勝利。本章內(nèi)容介紹--《推箱子》游戲資源的導(dǎo)入、資源切割與角色動(dòng)畫(huà)制作。地圖的生成。分析角色可移動(dòng)的情況。角色位置以及移動(dòng)方向與數(shù)組的對(duì)應(yīng)關(guān)系。角色的移動(dòng)。箱子的移動(dòng)。勝利條件判斷。資源的導(dǎo)入、資源切割與角色動(dòng)畫(huà)制作動(dòng)畫(huà)狀態(tài)機(jī)幀動(dòng)畫(huà)圖片素材程序?qū)崿F(xiàn)要點(diǎn)地圖的生成。角色位置以及移動(dòng)方向與數(shù)組的對(duì)應(yīng)關(guān)系。分析角色可移動(dòng)的情況。角色的移動(dòng)。箱子的移動(dòng)。勝利條件判斷。程序?qū)崿F(xiàn)要點(diǎn)-地圖的生成使用二維數(shù)組的方式來(lái)思考地圖信息的存儲(chǔ)。每個(gè)元素中用不同的數(shù)字來(lái)標(biāo)記不同的對(duì)象:0表示空白1表示墻2表示角色3表示箱子9表示終點(diǎn)10表示箱子在目標(biāo)點(diǎn)上(為什么要設(shè)置該狀態(tài)?)11表示角色在目標(biāo)點(diǎn)上(為什么要設(shè)置該狀態(tài)?)程序?qū)崿F(xiàn)要點(diǎn)-地圖的生成通過(guò)遍歷地圖數(shù)組,讀取每個(gè)元素的數(shù)值,根據(jù)數(shù)值標(biāo)記生成不同的地圖對(duì)象。程序?qū)崿F(xiàn)要點(diǎn)-地圖的生成設(shè)坐標(biāo)原點(diǎn)在地圖的左上角,向右為橫向x軸正方向,向下為縱向y軸負(fù)方向。那么二維數(shù)組map[m][n]的第i行第j列的元素為map[i][j],每個(gè)方塊(tile)的尺寸為1*1,則對(duì)應(yīng)map[i][j]在場(chǎng)景中的坐標(biāo)位置為:position=(j,-i)。例如map[1][4]對(duì)應(yīng)的tile的位置為(4,-1)。同時(shí),該元素的值為1,那么表示的是墻的方塊。程序?qū)崿F(xiàn)要點(diǎn)-地圖的生成為程序?qū)崿F(xiàn)的簡(jiǎn)便,可以把地圖的二維數(shù)組數(shù)據(jù)映射到一維數(shù)組上,便于遍歷。設(shè)二維數(shù)組為map[m][n],一維數(shù)組為b[m*n],則他們的對(duì)應(yīng)關(guān)系為:b[i*n+j]=map[i][j]。假設(shè)tile的長(zhǎng)寬都為1,地圖二維數(shù)組大小為9*9,則二維數(shù)組中的map[2][1]對(duì)應(yīng)一維數(shù)組中的b[2*9+1]=b[19],也就是說(shuō),對(duì)于數(shù)組元素b[19]對(duì)應(yīng)其實(shí)際的坐標(biāo)為(-1,2)。雖然一維數(shù)組對(duì)于人來(lái)說(shuō)不是很直觀,但把二維數(shù)組轉(zhuǎn)換成一位數(shù)組更有利于程序方便的實(shí)現(xiàn)。因此,在設(shè)計(jì)地圖時(shí)用二維數(shù)組來(lái)思考,在進(jìn)行程序操作,如角色移動(dòng)時(shí),用一維數(shù)組表示。程序?qū)崿F(xiàn)要點(diǎn)-地圖的生成為程序?qū)崿F(xiàn)的簡(jiǎn)便,可以把地圖的二維數(shù)組數(shù)據(jù)映射到一維數(shù)組上,便于遍歷。設(shè)二維數(shù)組為map[m][n],一維數(shù)組為b[m*n],則他們的對(duì)應(yīng)關(guān)系為:b[i*n+j]=map[i][j]。假設(shè)tile的長(zhǎng)寬都為1,地圖二維數(shù)組大小為9*9,則二維數(shù)組中的map[2][1]對(duì)應(yīng)一維數(shù)組中的b[2*9+1]=b[19],也就是說(shuō),對(duì)于數(shù)組元素b[19]對(duì)應(yīng)其實(shí)際的坐標(biāo)為(-1,2)。雖然一維數(shù)組對(duì)于人來(lái)說(shuō)不是很直觀,但把二維數(shù)組轉(zhuǎn)換成一位數(shù)組更有利于程序方便的實(shí)現(xiàn)。因此,在設(shè)計(jì)地圖時(shí)用二維數(shù)組表示,在進(jìn)行程序其他操作,如角色移動(dòng)時(shí),用一維數(shù)組表示。地圖數(shù)組除了用于生成地圖之外,還作為游戲邏輯的判斷,實(shí)時(shí)記錄游戲的狀態(tài),也稱(chēng)為地圖快照!程序?qū)崿F(xiàn)要點(diǎn)-角色位置以及移動(dòng)方向與數(shù)組的對(duì)應(yīng)關(guān)系設(shè)地圖左上角為原點(diǎn),即map[0][0],對(duì)應(yīng)一維數(shù)組上為b[0]。那么當(dāng)角色位于map[i][j],即一維數(shù)組的b[i*9+j]。此處以map[4][4](即b[4*9+4]=b[40])為例,則:角色上方一個(gè)方格的二維表示為map[3][4],一維表示為b[3*9+4]=b[4*9+4-9]=b[31];角色下方一個(gè)方格的二維表示為map[5][4],一維表示為b[5*9+4]=b[4*9+4+9]=b[49];角色左側(cè)一個(gè)方格的二維表示為map[4][3],一維表示為b[4*9+3]=b[4*9+4-1]=b[39];角色右側(cè)一個(gè)方格的二維表示為map[4][5],一維表示為b[4*9+5]=b[4*9+4+1]=b[41];設(shè)地圖左上角為原點(diǎn),即map[0][0],對(duì)應(yīng)一維數(shù)組上為b[0]。那么當(dāng)角色位于map[i][j],即一維數(shù)組的b[i*9+j]時(shí),此處以map[4][4](即b[4*9+4]=b[40])為例,則:角色上方一個(gè)方格的二維表示為map[3][4],一維表示為b[3*9+4]=b[4*9+4-9]=b[31];角色下方一個(gè)方格的二維表示為map[5][4],一維表示為b[5*9+4]=b[4*9+4+9]=b[49];角色左側(cè)一個(gè)方格的二維表示為map[4][3],一維表示為b[4*9+3]=b[4*9+4-1]=b[39];角色右側(cè)一個(gè)方格的二維表示為map[4][5],一維表示為b[4*9+5]=b[4*9+4+1]=b[41];從以上可以推斷:角色往上移動(dòng)一格,在一維數(shù)組中索引-9;角色往下移動(dòng)一格,在一維數(shù)組中索引+9;角色往左移動(dòng)一格,在一維數(shù)組中索引-1;角色往右移動(dòng)一格,在一維數(shù)組中索引+1;程序?qū)崿F(xiàn)要點(diǎn)-角色位置以及移動(dòng)方向與數(shù)組的對(duì)應(yīng)關(guān)系設(shè)地圖左上角為原點(diǎn),即map[0][0],對(duì)應(yīng)一維數(shù)組上為b[0]。那么當(dāng)角色位于map[i][j],即一維數(shù)組的b[i*9+j]時(shí),此處以map[4][4](即b[4*9+4]=b[40])為例,則:角色上方一個(gè)方格的二維表示為map[3][4],一維表示為b[3*9+4]=b[4*9+4-9]=b[31];角色下方一個(gè)方格的二維表示為map[5][4],一維表示為b[5*9+4]=b[4*9+4+9]=b[49];角色左側(cè)一個(gè)方格的二維表示為map[4][3],一維表示為b[4*9+3]=b[4*9+4-1]=b[39];角色右側(cè)一個(gè)方格的二維表示為map[4][5],一維表示為b[4*9+5]=b[4*9+4+1]=b[41];從以上可以推斷:角色往上移動(dòng)一格,在一維數(shù)組中索引-9;角色往下移動(dòng)一格,在一維數(shù)組中索引+9;角色往左移動(dòng)一格,在一維數(shù)組中索引-1;角色往右移動(dòng)一格,在一維數(shù)組中索引+1;因此,我們可以使用一個(gè)枚舉類(lèi)型來(lái)表示四個(gè)移動(dòng)方向:publicenumDirection{Up=-9,Down=9,Left=-1,Right=1}程序?qū)崿F(xiàn)要點(diǎn)-角色位置以及移動(dòng)方向與數(shù)組的對(duì)應(yīng)關(guān)系設(shè)地圖左上角為原點(diǎn),即map[0][0],對(duì)應(yīng)一位數(shù)組上為b[0]。那么當(dāng)角色位于map[i][j],即一維數(shù)組的b[i*9+j]時(shí),此處以map[4][4](即b[4*9+4]=b[40])為例,則:角色上方一個(gè)方格的二維表示為map[3][4],一維表示為b[3*9+4]=b[4*9+4-9]=b[31];角色下方一個(gè)方格的二維表示為map[5][4],一維表示為b[5*9+4]=b[4*9+4+9]=b[49];角色左側(cè)一個(gè)方格的二維表示為map[4][3],一維表示為b[4*9+3]=b[4*9+4-1]=b[39];角色右側(cè)一個(gè)方格的二維表示為map[4][5],一維表示為b[4*9+5]=b[4*9+4+1]=b[41];從以上可以推斷:角色往上移動(dòng)一格,在一維數(shù)組中索引-9;角色往下移動(dòng)一格,在一維數(shù)組中索引+9;角色往左移動(dòng)一格,在一維數(shù)組中索引-1;角色往右移動(dòng)一格,在一維數(shù)組中索引+1;因此,我們可以使用一個(gè)枚舉類(lèi)型來(lái)表示四個(gè)移動(dòng)方向:publicenumDirection{Up=-9,Down=9,Left=-1,Right=1}程序?qū)崿F(xiàn)要點(diǎn)-角色位置以及移動(dòng)方向與數(shù)組的對(duì)應(yīng)關(guān)系角色可移動(dòng)的情況角色移動(dòng)方向前方為空地角色移動(dòng)方向前方為目標(biāo)點(diǎn)角色移動(dòng)方向前方為箱子,箱子前方為空地角色移動(dòng)方向前方為箱子,箱子前方為目標(biāo)點(diǎn)角色當(dāng)前位置在目標(biāo)點(diǎn)上,移動(dòng)方向前方為目標(biāo)點(diǎn)角色當(dāng)前位置在目標(biāo)點(diǎn)上,移動(dòng)方向前方為空地角色移動(dòng)方向前方為箱子,箱子在目標(biāo)點(diǎn)上,前方為目標(biāo)點(diǎn)角色移動(dòng)方向前方為箱子,箱子在目標(biāo)點(diǎn)上,前方為空地角色當(dāng)前位置在目標(biāo)點(diǎn)上,移動(dòng)方向前方為箱子,箱子前方為空地角色當(dāng)前位置在目標(biāo)點(diǎn)上,移動(dòng)方向前方為箱子,箱子前方為目標(biāo)點(diǎn)角色移動(dòng)方向前方為墻面,不可移動(dòng)箱子移動(dòng)方向前方為墻面,不可移動(dòng)箱子移動(dòng)方向前方為其他箱子,不可移動(dòng)角色可移動(dòng)的情況(部分)角色的位置狀態(tài)角色位置為空地角色位置為目標(biāo)點(diǎn)角色下一個(gè)位置為空地角色下一個(gè)位置為目標(biāo)點(diǎn)角色下一個(gè)位置為箱子角色下一個(gè)位置為墻角色下一個(gè)位置為在目標(biāo)點(diǎn)上的箱子箱子下一個(gè)位置為空地箱子下一個(gè)位置為目標(biāo)點(diǎn)箱子下一個(gè)位置為墻箱子下一個(gè)位置為箱子箱子下一個(gè)位置為在目標(biāo)點(diǎn)上的箱子省略角色可移動(dòng)的情況(部分)角色的位置狀態(tài)角色位置為空地角色位置為目標(biāo)點(diǎn)角色下一個(gè)位置為空地角色下一個(gè)位置為目標(biāo)點(diǎn)角色下一個(gè)位置為箱子角色下一個(gè)位置為墻角色下一個(gè)位置為在目標(biāo)點(diǎn)上的箱子箱子下一個(gè)位置為空地箱子下一個(gè)位置為目標(biāo)點(diǎn)箱子下一個(gè)位置為墻箱子下一個(gè)位置為箱子箱子下一個(gè)位置為在目標(biāo)點(diǎn)上的箱子省略每個(gè)移動(dòng)方向:總共有23種情況角色可移動(dòng)的情況(部分)角色的位置狀態(tài)角色位置為空地角色位置為目標(biāo)點(diǎn)角色下一個(gè)位置為空地角色下一個(gè)位置為目標(biāo)點(diǎn)角色下一個(gè)位置為箱子角色下一個(gè)位置為墻角色下一個(gè)位置為在目標(biāo)點(diǎn)上的箱子箱子下一個(gè)位置為空地箱子下一個(gè)位置為目標(biāo)點(diǎn)箱子下一個(gè)位置為墻箱子下一個(gè)位置為箱子箱子下一個(gè)位置為在目標(biāo)點(diǎn)上的箱子省略每個(gè)移動(dòng)方向:總共有23種情況代碼如何實(shí)現(xiàn)?角色移動(dòng)偽代碼—采用if—else的情況角色移動(dòng)偽代碼—采用if—else的情況代碼邏輯混亂,不易修改與調(diào)試,可讀性差。角色移動(dòng)偽代碼—采用SwitchSwitch(角色前方位置狀態(tài)){ case前方為空: break; case前方為目標(biāo)點(diǎn): break; case前方為箱子: switch(箱子前方狀態(tài)){ case前方為空: break; case前方為目標(biāo)點(diǎn): break; } break; case前方為箱子在目標(biāo)點(diǎn)上: switch(箱子前方狀態(tài)): case前方為空: break; case前方為目標(biāo)點(diǎn): break; break; default:
不可移動(dòng); break;}????????????角色移動(dòng)偽代碼—采用SwitchSwitch(角色前方位置狀態(tài)){ case前方為空: break; case前方為目標(biāo)點(diǎn): break; case前方為箱子: switch(箱子前方狀態(tài)){ case前方為空: break; case前方為目標(biāo)點(diǎn): break; } break; case前方為箱子在目標(biāo)點(diǎn)上: switch(箱子前方狀態(tài)): case前方為空: break; case前方為目標(biāo)點(diǎn): break; break; default:
不可移動(dòng); break;}????????????代碼較簡(jiǎn)潔,邏輯清晰,較易修改與調(diào)試,可讀性較好。程序?qū)崿F(xiàn)要點(diǎn)-角色的移動(dòng),地圖刷新1 向右移動(dòng):獲取到按鍵”→”,此時(shí)dir=9。將角色目前位置的數(shù)組值變?yōu)?,下一目標(biāo)移動(dòng)位置的數(shù)組值變?yōu)?,刷新地圖數(shù)組(游戲狀態(tài)快照);2 向上移動(dòng):獲取到按鍵”↑”,此時(shí)dir=-9。將角色目前位置的數(shù)組值變?yōu)?,下一目標(biāo)移動(dòng)位置的數(shù)組值變?yōu)?,刷新地圖數(shù)組(游戲狀態(tài)快照);3 向下移動(dòng):獲取到按鍵”↓”,此時(shí)dir=9。將角色目前位置的數(shù)組值變?yōu)?,下一目標(biāo)移動(dòng)位置的數(shù)組值變?yōu)?,刷新地圖數(shù)組(游戲狀態(tài)快照);4 向左移動(dòng):獲取到按鍵”←”,此時(shí)dir=-1。將角色目前位置的數(shù)組值變?yōu)?,下一目標(biāo)移動(dòng)位置的數(shù)組值變?yōu)?,刷新地圖數(shù)組(游戲狀態(tài)快照); 遇到障礙物的時(shí)候:跳出遍歷,返回false。111111111120010000103010111103010191111311191011000091010001001010001111011111000111111111102010000103010111103010191111311191011000091010001001010001111011111000程序?qū)崿F(xiàn)要點(diǎn)-箱子的移動(dòng),地圖刷新箱子的移動(dòng)與角色的移動(dòng)算法類(lèi)似,只是除了刷新角色位置之外,還需刷新箱子的位置。移動(dòng)箱子的功能:設(shè)定dir控制角色在數(shù)組內(nèi)的移動(dòng)距離。1向右移動(dòng):獲取到按鍵”→”,此時(shí)dir=1。將角色目前位置的數(shù)組值變?yōu)?,下一目標(biāo)移動(dòng)位置的數(shù)組值變?yōu)?,下二目標(biāo)移動(dòng)位置的數(shù)組值變?yōu)?,刷新地圖數(shù)組(游戲狀態(tài)快照)2 向上移動(dòng):獲取到按鍵”↑”,此時(shí)dir=-9。將角色目前位置的數(shù)組值變?yōu)?,下一目標(biāo)移動(dòng)位置的數(shù)組值變?yōu)?,下二目標(biāo)移動(dòng)位置的數(shù)組值變?yōu)?,刷新地圖數(shù)組(游戲狀態(tài)快照);3 向下移動(dòng):獲取到按鍵”↓”,此時(shí)dir=9。將角色目前位置的數(shù)組值變?yōu)?,下一目標(biāo)移動(dòng)位置的數(shù)組值變?yōu)?,下二目標(biāo)移動(dòng)位置的數(shù)組值變?yōu)?,刷新地圖數(shù)組(游戲狀態(tài)快照);4 向左移動(dòng):獲取到按鍵”←”,此時(shí)dir=-1。將角色目前位置的數(shù)組值變?yōu)?,下一目標(biāo)移動(dòng)位置的數(shù)組值變?yōu)?,下二目標(biāo)移動(dòng)位置的數(shù)組值變?yōu)?,刷新地圖數(shù)組(游戲狀態(tài)快照);遇到障礙物的時(shí)候:跳出遍歷,返回false。111111111100010000123010111103010191111311191011000091010001001010001111011111000111111111100010000102310111103010191111311191011000091010001001010001111011111000程序?qū)崿F(xiàn)要點(diǎn)-角色和箱子的移動(dòng),地圖刷新以上兩種情況都是假設(shè)角色或者箱子不在目標(biāo)點(diǎn)上,如果角色或者箱子在目標(biāo)點(diǎn)上,應(yīng)該如何刷新地圖數(shù)組呢?111111111100010000100010111103010191111311191011000031010001021010001111011111000111111111100010000100010111103010191111311131011000021010001001010001111011111000111111111100010000100010111103010191111311191011000010101000102101000111101111100011111111110001000010001011110301019111131111110110000101010001001010001111011111000目標(biāo)點(diǎn)信息被刪除程序?qū)崿F(xiàn)要點(diǎn)-勝利條件的判斷創(chuàng)建一個(gè)計(jì)數(shù)變量,設(shè)置為當(dāng)前關(guān)卡中的目標(biāo)點(diǎn)的數(shù)量。只要當(dāng)箱子被移動(dòng)到目標(biāo)點(diǎn)時(shí),該變量-1。當(dāng)箱子移出目標(biāo)點(diǎn)時(shí),該變量+1。當(dāng)該變量為0時(shí),游戲結(jié)束?!锻葡渥印酚螒騼?nèi)容總結(jié)地圖的生成。角色位置以及移動(dòng)方向與數(shù)組的對(duì)應(yīng)關(guān)系。分析角色可移動(dòng)的情況。角色的移動(dòng)。箱子的移動(dòng)。勝利條件判斷。《推箱子》游戲內(nèi)容總結(jié)地圖的生成。《推箱子》游戲內(nèi)容總結(jié)角色位置以及移動(dòng)方向與數(shù)組的對(duì)應(yīng)關(guān)系。《推箱子》游戲內(nèi)容總結(jié)角色可移動(dòng)的情況。角色的位置狀態(tài)角色位置為空地角色位置為目標(biāo)點(diǎn)角色下一個(gè)位置為空地角色下一個(gè)位置為目標(biāo)點(diǎn)角色下一個(gè)位置為箱子角色下一個(gè)位置為墻角色下一個(gè)位置為在目標(biāo)點(diǎn)上的箱子箱子下一個(gè)位置為空地箱子下一個(gè)位置為目標(biāo)點(diǎn)箱子下一個(gè)位置為墻箱子下一個(gè)位置為箱子箱子下一個(gè)位置為在目標(biāo)點(diǎn)上的箱子省略《推箱子》游戲內(nèi)容總結(jié)角色的移動(dòng)。111111111120010000103010111103010191111311191011000091010001001010001111011111000111111111102010000103010111103010191111311191011000091010001001010001111011111000《推箱子》游戲內(nèi)容總結(jié)箱子的移動(dòng)。111111111100010000123010111103010191111311191011000091010001001010001111011111000111111111100010000102310111103010191111311191011000091010001001010001111011111000《推箱子》游戲內(nèi)容總結(jié)勝利條件判斷.創(chuàng)建一個(gè)計(jì)數(shù)變量,設(shè)置為當(dāng)前關(guān)卡中的目標(biāo)點(diǎn)的數(shù)量。只要當(dāng)箱子被移動(dòng)到目標(biāo)點(diǎn)時(shí),該變量-1。當(dāng)箱子移出目標(biāo)點(diǎn)時(shí),該變量+1。當(dāng)該變量為0時(shí),游戲結(jié)束。作業(yè)按照書(shū)本里的步驟,實(shí)現(xiàn)整個(gè)游戲,并導(dǎo)出為可運(yùn)行在PC平臺(tái)的exe運(yùn)行程序。30分嘗試修改場(chǎng)景地圖,增加多個(gè)關(guān)卡。30分選做:嘗試修改和導(dǎo)出為Android或者IOS版本的觸屏版本。20分選做:為游戲加入主界面。20分***地圖的生成基于Tile的2D場(chǎng)景設(shè)計(jì)可以利用更加專(zhuān)業(yè)的軟件如Tilemap等來(lái)制作地圖數(shù)據(jù),一般導(dǎo)出格式為XML等,然后再導(dǎo)入到各個(gè)引擎中,利用相應(yīng)算法,重新生成地圖。該方法可以擴(kuò)展到3D的基于規(guī)則形狀(如立方體,類(lèi)似《我的世界》。)Unity中現(xiàn)在也提供了一定功能的基于2DTile場(chǎng)景的搭建?;赥ile場(chǎng)景搭建,由多種規(guī)則圖形的tile組成(可以是正方形、六邊形、菱形等規(guī)律tile),利用二維或者多維數(shù)組記錄場(chǎng)景數(shù)據(jù)?;诓煌螤畹膖ile地圖生成算法:/~amitp/game-programming/grids/俄羅斯方塊(Tetris)Unity2017經(jīng)典游戲開(kāi)發(fā)教程:算法分析與實(shí)現(xiàn)《俄羅斯方塊》游戲介紹1984年6月,在俄羅斯科學(xué)院計(jì)算機(jī)中心工作的數(shù)學(xué)家“帕基特諾夫”利用空閑時(shí)間編出一個(gè)游戲程序,用來(lái)測(cè)試當(dāng)時(shí)一種計(jì)算機(jī)的性能。帕基特諾夫愛(ài)玩拼圖,從拼圖游戲里得到靈感,設(shè)計(jì)出了俄羅斯方塊。游戲基本規(guī)則有一塊用于擺放方塊的平面虛擬場(chǎng)地,其標(biāo)準(zhǔn)大?。盒袑挒?0,列高為20,以一個(gè)小方塊為一個(gè)單位。有一組由4個(gè)方塊組成的規(guī)則圖形(中文通稱(chēng)為方塊),共有7種,分別以S、Z、L、J、I、O、T這7個(gè)字母的形狀來(lái)命名。玩家可以以90度為單位旋轉(zhuǎn)方塊;以格子為單位左右移動(dòng)方塊;讓方塊加速下落。當(dāng)區(qū)域中的某一行格子全部由方塊填滿(mǎn),則該行方塊會(huì)消失并成為玩家的得分。刪除的行越多,得分越高。當(dāng)方塊堆到區(qū)域最上方而無(wú)法消除時(shí),則該游戲結(jié)束。演示效果.gif基本流程初始化階段移動(dòng)旋轉(zhuǎn)滿(mǎn)行判斷與消除本章內(nèi)容介紹--《俄羅斯方塊》游戲資源導(dǎo)入、方塊切割與預(yù)制體制作、場(chǎng)景設(shè)置初始化地圖方塊類(lèi)(Block)的編寫(xiě)初始化方塊移動(dòng)方塊消除滿(mǎn)行方塊附加功能—控制方塊下落速度附加功能—顯示下一個(gè)方塊的樣式本章核心要點(diǎn)整個(gè)游戲的地圖快照,用不同數(shù)字記錄場(chǎng)景當(dāng)前狀態(tài)。本章核心思路是使用二維數(shù)組,用不同的數(shù)值表示不同的方塊和狀態(tài)。滿(mǎn)行判斷與消除。一、資源的導(dǎo)入資源導(dǎo)入、方塊切割與預(yù)制體制作、場(chǎng)景設(shè)置。二、初始化地圖初始化地圖二維數(shù)組用二維數(shù)組生成當(dāng)前地圖狀態(tài)負(fù)責(zé)記錄游戲場(chǎng)景狀態(tài)、繪制背景以地圖的數(shù)值為依據(jù)進(jìn)行邊界判斷每次移動(dòng)方塊,都要更新地圖共有4種情況墻=-1空格=0固定方塊=8(方塊不可以再操作時(shí))游戲中的方塊=自身的形態(tài)數(shù)值(即方塊的狀態(tài))三、方塊類(lèi)(Block)的編寫(xiě)初始化方塊的形狀用二維數(shù)組,通過(guò)數(shù)字存儲(chǔ)方塊的四種變換形態(tài),用一個(gè)[4][16]的二維數(shù)組,4表示方塊的四種不同旋轉(zhuǎn)朝向,16用于記錄方塊的樣式。根據(jù)方塊類(lèi)型決定方塊的變換形態(tài)存儲(chǔ)原則方塊由小方塊組成,數(shù)字代表一個(gè)小的組成方塊用數(shù)組抽象表示方塊形態(tài),有數(shù)字表示有小方塊,0表示沒(méi)有小方塊數(shù)字與當(dāng)前方塊類(lèi)型有關(guān),不同類(lèi)型的方塊,數(shù)值不同二維數(shù)組中每個(gè)大括號(hào)里的數(shù)組,都表示一種形態(tài)的方塊獲取操作獲取方塊狀態(tài)、獲取方塊組當(dāng)前位置變換操作旋轉(zhuǎn)方塊、重置方塊、上下左右移動(dòng)方塊基本流程初始化階段移動(dòng)旋轉(zhuǎn)滿(mǎn)行判斷與消除四、初始化方塊—方塊在地圖中的隨機(jī)生成把7種方塊放置在一個(gè)一維數(shù)組中,然后用隨機(jī)遍歷的方法在場(chǎng)景中生成兩個(gè)方塊,一個(gè)用于當(dāng)前方塊的控制,一個(gè)用于下一個(gè)方塊的控制。五、移動(dòng)和旋轉(zhuǎn)方塊—位置坐標(biāo)修改左右移動(dòng)或旋轉(zhuǎn)鍵盤(pán)響應(yīng)后,移動(dòng),后判斷移動(dòng)左=>方塊位置x-1右=>方塊位置x+1旋轉(zhuǎn)=>方塊狀態(tài)數(shù)組里取下一狀態(tài)撞到左右墻壁?撞到底部?撞到固定方塊?滿(mǎn)足其一,撤銷(xiāo)移動(dòng)移動(dòng)更新地圖(旋轉(zhuǎn))五、移動(dòng)和旋轉(zhuǎn)方塊—邊界判斷左右移動(dòng)或旋轉(zhuǎn)。不可可以移動(dòng)的條件,遍歷Block的每一個(gè)元素,如果該元素不為零,那么就要進(jìn)行以下的判斷。碰到左右邊界。碰到底部。碰到其他方塊。-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-155-1-155-1-1-1-1-1-1-1-13-1-1333-1-13383-1-1888888883-1-18888888-1-1-1-1-1-1-1-1-1-1-1-1移動(dòng)邊界判定不可左右移動(dòng)五、移動(dòng)方塊—向下移動(dòng)向下移動(dòng)碰撞判斷撞到底部=>方塊存在小方塊位置<0撞到其他方塊=>地圖信息為8地圖更新固定方塊信息將當(dāng)前移動(dòng)的方塊狀態(tài)變更為8更新地圖變更地圖二維數(shù)組里的數(shù)值鍵盤(pán)響應(yīng)或間隔一定時(shí)間后,先移動(dòng),后判斷撞到底部?撞到其他方塊?滿(mǎn)足其一,地圖更新固定方塊信息移動(dòng)更新地圖……六、消除滿(mǎn)行方塊流程
碰撞判斷撞到頂部=>地圖最上面一行存在數(shù)值8方塊到達(dá)底部或其他方塊后撞到頂部?不滿(mǎn)足滿(mǎn)足,游戲結(jié)束滿(mǎn)行?滿(mǎn)足,刪除該行數(shù)據(jù)不滿(mǎn)足,生成方塊上方固定方塊數(shù)據(jù)下移-188-1-188-1-1888888888-1-18888888-1-1-1-1-1-1-1-1-1-1-1-1遍歷最上面一行,存在數(shù)值8六、消除滿(mǎn)行方塊滿(mǎn)行判斷地圖一行一行遍歷(除去邊界)若掃描到非8,跳出此行,遍歷下一行地圖上一行數(shù)值全為8即為滿(mǎn)行滿(mǎn)行消除從滿(mǎn)行的該行往上的所有行,固定方塊數(shù)據(jù)全部下移-188-1-188-1-1888888888-1-18888888-1-1-1-1-1-1-1-1-1-1-1-1一整行為8-188-1-188-1-1-1-18888888-1-1-1-1-1-1-1-1-1-1-1-1消除一整行,上方殘留數(shù)據(jù)全部下移一行七、游戲結(jié)束判斷遍歷最頂行的數(shù)值,如果有一個(gè)數(shù)值為8,則表示游戲結(jié)束。-1-1-188-1-188-1-188-1-188-1-188-1-188-1-188-1-188-1-188-1-18855-1-18855-1-188-1-188-1-188-1-188-1-18833-1-18883-1-1888888883-1-18888888-1-1-1-1-1-1-1-1-1-1-1-1八、附加功能,方塊自動(dòng)下落速度控制實(shí)現(xiàn)一個(gè)節(jié)奏計(jì)時(shí)器,按照一定時(shí)間間隔運(yùn)行方塊角落邏輯。八、附加功能,提示下一個(gè)方塊在場(chǎng)景中的右側(cè),顯示出下一個(gè)要下落的方塊類(lèi)型。使用一個(gè)4*4的二維數(shù)組,用于顯示方塊提示。八、附加功能,代碼的重復(fù)代碼優(yōu)化作業(yè)按照書(shū)本里的步驟,實(shí)現(xiàn)整個(gè)游戲,并導(dǎo)出為可運(yùn)行在PC平臺(tái)的exe運(yùn)行程序。30分嘗試實(shí)現(xiàn),隨著分?jǐn)?shù)的增加,方塊下降的速度越快。30分嘗試添加4種新的方塊類(lèi)型。20分華容道Unity2017經(jīng)典游戲開(kāi)發(fā)教程:算法分析與實(shí)現(xiàn)《華容道》游戲介紹華容道是古老的中國(guó)民間益智游戲.華容道取自《三國(guó)演義》中的赤壁戰(zhàn)爭(zhēng):“曹瞞兵敗走華容,正與關(guān)公狹路逢。只為當(dāng)初恩義重,放開(kāi)金鎖走蛟龍”這一故事情節(jié)。其變化多端、百玩不厭的特點(diǎn)與魔方、獨(dú)立鉆石棋一起被國(guó)外智力專(zhuān)家并稱(chēng)為“智力游戲界的三個(gè)不可思議”。它與七巧板、九連環(huán)等中國(guó)傳統(tǒng)益智玩具還有個(gè)代名詞叫作“中國(guó)的難題”。華容道的現(xiàn)在樣式是1932年JohnHaroldFleming在英國(guó)申請(qǐng)的專(zhuān)利,并且還附上橫刀立馬的解法。游戲規(guī)則容道的棋盤(pán)是一個(gè)帶20個(gè)方塊的棋盤(pán),棋盤(pán)下方有一個(gè)兩方格寬的出口,僅供曹操逃走。華容道游戲中的方塊有四種:大正形(2×2);橫長(zhǎng)方形(2×1);豎長(zhǎng)方形(1×2);小正方形(1×1)。游戲華容道有不同的開(kāi)局,根據(jù)5個(gè)矩形塊的放法分類(lèi),有一橫式,二橫式,三橫式,四橫式,五橫式。如橫刀立馬近在咫尺小燕還巢比翼橫空過(guò)五關(guān)水泄不通等。棋盤(pán)上僅有兩個(gè)空格可供棋子移動(dòng)。玩家需要通過(guò)鼠標(biāo)移動(dòng)棋子,讓曹操?gòu)钠灞P(pán)最下方的中部?jī)蓚€(gè)空格中逃出,則游戲勝利。2×22×11×21×1游戲規(guī)則本例子將實(shí)現(xiàn)“橫刀立馬”的樣式。本章內(nèi)容介紹--《華容道》游戲資源的導(dǎo)入、攝像機(jī)和背景設(shè)置,棋子預(yù)制體的制作。棋子類(lèi)(Chess)的編寫(xiě)。棋盤(pán)盤(pán)面布局的生成。分析棋子可移動(dòng)的情況判斷選中的棋子。判斷棋子移動(dòng)方向。判斷棋子類(lèi)型。判斷棋子是否可以移動(dòng)。移動(dòng)棋子并更新棋盤(pán)狀態(tài)。游戲勝利判斷。資源的導(dǎo)入、攝像機(jī)和背景設(shè)置,棋子預(yù)制體的制作。棋子類(lèi)(Chess)的編寫(xiě)。使用枚舉類(lèi)型編寫(xiě)棋子的類(lèi)型。初始化、生成棋子對(duì)象。根據(jù)棋子類(lèi)型為棋子的寬高賦值。(后續(xù))設(shè)置曹操目標(biāo)點(diǎn)。(后續(xù))曹操是否到達(dá)目標(biāo)點(diǎn)的判斷函數(shù)。棋盤(pán)盤(pán)面布局的生成
將所有棋子對(duì)象存進(jìn)數(shù)組里,并用Chess類(lèi)方法實(shí)例化棋子對(duì)象。設(shè)棋子的錨點(diǎn)在左上角。棋子位置通過(guò)硬編碼方式進(jìn)行設(shè)置。用二維數(shù)組初始化棋盤(pán)快照棋盤(pán)快照作用:用以記錄當(dāng)前盤(pán)面的狀態(tài),主要用于判斷被選擇的棋子是否可以被移動(dòng)到下一個(gè)位置以及勝利條件的判斷等。棋盤(pán)狀態(tài)含義棋子已占用——1棋盤(pán)邊界——1棋子未占用——0注意:增加兩行兩列表示棋盤(pán)邊界(1,1)(1,3)(1,5)(2,5)(4,5)(2,3)(2,2)(3,2)(4,3)(4,1)移動(dòng)棋子的實(shí)現(xiàn)
判斷選中的棋子。判斷棋子移動(dòng)方向。判斷棋子類(lèi)型。判斷棋子是否可以移動(dòng)。移動(dòng)棋子并更新棋盤(pán)狀態(tài)。判斷選中的棋子 獲取鼠標(biāo)點(diǎn)擊坐標(biāo)。
鼠標(biāo)點(diǎn)擊=>獲取鼠標(biāo)點(diǎn)擊坐標(biāo)(屏幕坐標(biāo))=>轉(zhuǎn)換成
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度城市綜合體配套基礎(chǔ)設(shè)施承包合同
- 2024年電視劇市場(chǎng)深度調(diào)研分析及投資前景研究預(yù)測(cè)報(bào)告
- 2025年度呼叫中心行業(yè)市場(chǎng)調(diào)研與分析合作協(xié)議
- 【可行性報(bào)告】2025年雜志期刊行業(yè)項(xiàng)目可行性分析報(bào)告
- 中國(guó)山東服裝市場(chǎng)競(jìng)爭(zhēng)格局及投資前景展望報(bào)告
- 貧困申請(qǐng)書(shū)格式樣本
- 鋁餅行業(yè)行業(yè)發(fā)展趨勢(shì)及投資戰(zhàn)略研究分析報(bào)告
- 年產(chǎn)xxx萬(wàn)平方米鋁箔項(xiàng)目資金申請(qǐng)報(bào)告范文模板
- 客房領(lǐng)班申請(qǐng)書(shū)
- 2025年高壓氣筒項(xiàng)目投資可行性研究分析報(bào)告
- 傳統(tǒng)運(yùn)動(dòng)療法易筋經(jīng)教案5
- GB/T 8014.1-2005鋁及鋁合金陽(yáng)極氧化氧化膜厚度的測(cè)量方法第1部分:測(cè)量原則
- GB/T 3860-2009文獻(xiàn)主題標(biāo)引規(guī)則
- 股票基礎(chǔ)知識(shí)(入市必讀)-PPT
- 雅思閱讀題型與技巧課件
- 招商銀行房地產(chǎn)貸款壓力測(cè)試
- 公文與公文寫(xiě)作課件
- 車(chē)削成形面和表面修飾加工課件
- 基于振動(dòng)信號(hào)的齒輪故障診斷方法研究
- 義務(wù)教育物理課程標(biāo)準(zhǔn)(2022年版word版)
- 醫(yī)療器械分類(lèi)目錄2002版
評(píng)論
0/150
提交評(píng)論