《游戲開發基礎-基于Unity游戲引擎》全套教學課件_第1頁
《游戲開發基礎-基于Unity游戲引擎》全套教學課件_第2頁
《游戲開發基礎-基于Unity游戲引擎》全套教學課件_第3頁
《游戲開發基礎-基于Unity游戲引擎》全套教學課件_第4頁
《游戲開發基礎-基于Unity游戲引擎》全套教學課件_第5頁
已閱讀5頁,還剩279頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

Unity游戲引擎介紹全套可編輯PPT課件什么是游戲引擎一款完整的游戲引擎,能夠提供給游戲開發者穩定的底層框架和完善的游戲創作工具,使得開發者更加關心游戲的內容和可玩性,不用再去過多地擔心游戲程序的底層細節,而且能夠讓開發出來的游戲產品更加穩定可靠。有了游戲引擎,游戲的開發過程更加簡單,同時大大降低開發成本、縮短開發周期,進而降低研發的風險。出于以上原因,越來越多的開發者傾向于使用健全的游戲引擎來制作自己的游戲。正因為有龐大的市場需求,游戲引擎的市場才逐漸形成。UnrealEngine4(虛幻引擎,UE4)CryEngineCocos2DUnityEngine什么是游戲引擎簡單地說,引擎就是“用于控制所有游戲功能的主程序,從計算圖形圖像、碰撞、物理系統和物體的相對位置,到接受玩家的輸入,以及按照正確的音量輸出聲音等等。”無論是2D游戲還是3D游戲,無論是角色扮演游戲、即時策略游戲、冒險解謎游戲或是動作射擊游戲,哪怕是一個只有1兆的小游戲,都有這樣一段起控制作用的代碼。經過不斷的進化,如今的游戲引擎已經發展為一套由多個子系統共同構成的復雜系統,從建模渲染、動畫到光影、粒子特效,從物理系統、碰撞檢測到文件管理、網絡特性,還有專業的所見即所得編輯工具和插件,幾乎涵蓋了開發過程中的所有重要環節。總而言之,游戲引擎是一種可復用的、適應性較強的游戲開發中間件,游戲開發人員可以使用同一套游戲引擎來開發出不同的游戲產品甚至可以很方便地把同一款游戲產品發布到不同的運行平臺上。/madewith資源商店提供了各種免費或者付費的資源和插件。Unity的下載與安裝Unity官方地址:Unity的下載與安裝Unity下載地址(點擊首頁的“獲取Unity”進入):/cnUnity的下載與安裝點擊“使用個人版”進入下載頁面->下載Windows版安裝程序(如果是蘋果Mac操作系統,請選擇MacOSX版的安裝程序),下載Unity安裝助手Unity的下載與安裝運行Unity安裝助手Unity的下載與安裝運行Unity安裝助手運行Unity雙擊Unity圖標,打開UnityUnity游戲工程的構成結構Project工程:一個游戲便是一個工程;Scene場景:一個游戲包括一個或者多個游戲場景/關卡。GameObject游戲對象:構成游戲的各種對象,例如場景模型、角色以及其他抽象(如某種控制模塊)的但是確實存在于場景中的對象。Component組件:是Unity的核心架構。每個游戲對象由一個或者多個組件構成,每種組件賦予游戲對象某種功能。Script腳本:是實現Component的腳本程序,現在Unity支持C#語言(一種與Java語言類似的語言,只要會Java,上手C#非常簡單)。Unity中定義的重要概念資源(Assets):在3D游戲的制作過程中,需要用到各種各樣的資源,這些資源包括模型、貼圖、聲音、程序腳本等等。在Unity3D中通通被稱為資源(Asset),可以把資源比喻成3D游戲制作過程中的原材料,通過原材料的不同組合和利用,便形成了一個游戲產品。Unity中定義的重要概念工程(Project):在Unity3D中,工程就是一個游戲項目。這個工程包括了該游戲場景所需要的各種資源,還有關卡、場景和游戲對象等等。在創建一個新的游戲之前,必須先創建一個游戲工程。游戲工程可以想象成實現游戲的工廠。它里面有游戲的資源倉庫、制作游戲的裝配間和打包輸出的車間等等。Unity中定義的重要概念場景(Scenes):場景可以想象成一個游戲界面,或者一個游戲關卡。在一個打開的場景中,游戲開發者通過編輯器為該場景組裝各種游戲資源,這些資源被放置到場景中之后成為一個個游戲對象,通過這些游戲對象實現該游戲關卡中的各種功能。場景相當于制作游戲過程中不同部分的不同車間,在不同的車間中,搭建不同的場景。。Unity中定義的重要概念游戲對象(GameObject):游戲對象是組成游戲場景必不可少的對象。各種各樣的游戲對象通過資源的組裝并加入到游戲場景中,只有某種資源被放置在游戲場景中,才會生成游戲對象。游戲對象根據功能的需要有不同的屬性,通過這些屬性來控制游戲對象的不同行為。。Unity中定義的重要概念組件(Component),在Unity3D中是用于控制游戲對象屬性的集合。每一個組件包括了游戲對象的某種特定的功能屬性,例如Transform組件,用于控制物體的位置、旋轉和縮放。可以通過組件中的參數來修改物體的屬性,甚至你通過編寫一個腳本程序并把該程序添加到游戲對象中,成為它的一個組件,并利用監視器(Inspector)來編輯你想要的屬性值。簡而言之,組件其實就是定義了游戲對象的屬性和行為。Unity中定義的重要概念腳本(Scripts):我們知道,游戲與其他娛樂方式(電影、圖書、電視、廣播等等)的最大區別在于可互動性。互動性是游戲的最基本特征之一,而程序腳本便是實現可互動性的最有利的工具。通過編寫程序可以控制游戲中的每一個游戲對象,我們可以讓他們根據我們的需要改變他們的狀態和行為。最新版本的Unity支持C#程序語言。Unity支持使用C++、Java等其他語言編寫的插件。Unity中定義的重要概念預置(Prefabs):有的時候我們會在Unity3D中為游戲對象添加各種組件,并設置好它的屬性和行為,最后需要反復利用這些已經修改好的對象。Unity3D為我們提供了一種保存這種設置的方法,該種方法稱為保存預置(Prefab)。界面與操作介紹Unity中的C#程序基本語法變量聲明(變量名規定首字母為小寫,使用駝峰命名法):[public/private][int/float/bool/double/string/GameObect]ValName=[defaultVal];如publicintscore=0;privatefloatspeedVal=20f;函數聲明(函數名規定首字母為大寫,使用駝峰命名法):[public/private]returnValFunctionName(ParametersList){FunctionBlock}如publicintHurtCharacter(intdamageVal){damage-=damageVal;}類的聲明(類名規定首字母為大寫,使用駝峰命名法):[public/private]ClassName:[SuperClass]{}學習要點:語法與Java的語法非常類似,只是一些表達方式有所區分,如繼承的表達在java中是extends,在C#中用的是冒號:。在編程的學習中,不要刻意追求某種語言的好與壞,只有是否合適,沒有最好的。同時,掌握了基本的編程思想(如面向對象編程、面向過程編程、數據結構以及相關算法)后,基本上可以做到語言無關。使用Unity中的C#進行程序編程,除了面向對象的基本語法之外,還需要了解它所提供的API,同時要熟悉一些常用的API。Unity手冊:

/Manual/index.htmlUnity腳本APIDocumentation:

/ScriptReference/index.htmlUnity中的關鍵事件回調機制在游戲的整個運行機制中,最關鍵的一個架構便是游戲大循環,如果使用C++或者java等實現一個游戲時,基本上都要使用到大(主)循環。但是在游戲引擎中,該大循環已經給你封裝起來,只為你提供相關的調用接口,所以需要熟悉這些接口的調用時機和作用。Unity中的關鍵事件回調機制Awake():一個游戲對象被創建之前會被調用一次,主要用于初始化一些參數。Start():一個游戲對象被激活時調用一次,也是用于初始化一些參數。Update():游戲大循環的入口,每一幀會被調用一次,直到游戲結束。該函數主要用于監聽和更新各種事件和參數。比如監聽鍵盤輸入,使游戲對象改變位置等等。OnEnable():當一個游戲對象被激活時調用一次。OnDisable():當一個游戲對象失效時,但未銷毀時被調用一次。其他回調函數:在Unity中,如果函數前面帶有On介詞,那么便表示為回調函數。要使得腳本具有以上回調函數功能,該類需要繼承自Unity的MonoBehavior類。其他回調函數可以參考文檔:

/Manual/ExecutionOrder.html代碼演示創建一個腳本,名為:EventTest輸入一下代碼:保存后把代碼掛在場景中的MainCamera對象上。點擊運行,觀察控制臺。

游戲開發基礎

--打地鼠游戲制作(Whac-A-Mole)浙江傳媒學院:張帆本章內容介紹—打地鼠游戲洞口位置的計算和存儲。地鼠出現的頻率控制。地鼠的隨機生成和銷毀。游戲時間和分數。當時間少于15秒時增加地鼠出現頻率。實現錘子的擊打動畫。為游戲加上音效。重新開始游戲。導出游戲。《打地鼠》游戲介紹《打地鼠》(原名:Whac-A-Mole)最早可以追溯到1976年由美國創意工程股份有限公司(CreativeEngineering,Inc.)推出的一款有償街機游戲。游戲規則在一定時間內,地鼠隨機出現在洞口,玩家要在它出現的時候擊中它,擊中加分,反之地鼠會自動消失,時間耗盡則游戲結束。隨著游戲時間的減少,老鼠出現的頻率越來越高,存在的時間也越來越短,游戲難度逐步上升。所需圖片資源-Sprite游戲背景洞口地鼠錘子SortLayer—用于圖片資源的繪制順序程序實現要點洞口位置的存儲結構和計算。地鼠出現的頻率控制。地鼠的隨機生成和銷毀。游戲時間和分數。開始初始化洞口位置隨機位置生成地鼠是否打到地鼠計時結束游戲結束否是生成被打到地鼠圖像并計分一定時間后銷毀地鼠否是否程序實現要點洞口位置的存儲結構和計算。地鼠出現的頻率控制。地鼠的隨機生成和銷毀。游戲時間和分數。GameController:用于洞口生成以及判斷游戲進程。Mole:用于控制地鼠的消失、判斷是否地鼠被打到以及計分。Beaten:用于地鼠被打到后的銷毀工作。Timer:用于計時。Restart:用于游戲重啟。ChangeCursor:用于錘子的打擊反饋動畫。程序實現要點洞口位置的存儲結構和計算。(思考,應該使用什么數據結構呢?)地鼠出現的頻率控制。地鼠的隨機生成和銷毀。游戲時間和分數。程序實現要點洞口位置的存儲結構和計算。9個洞口的位置和狀態可用3x3二維數組存儲。地鼠出現的頻率控制。地鼠的隨機生成和銷毀。游戲時間和分數。[2,0][2,1][2,2][1,0][1,1][1,2][0,0][0,1][0,2]9個洞口對應的二維數組的行列索引,每個元素保存了該洞口的具體位置以及是否有地鼠的狀態。注:該例子以左下角對應數據的索引號[0,0]。程序實現要點洞口位置的存儲結構和計算。9個洞口的位置和狀態可用3x3二維數組存儲。為后續隨機索引方便,把二維數組映射成一維數組。(思考:如何把二維數組映射到一位數組呢?)地鼠出現的頻率控制。地鼠的隨機生成和銷毀。游戲時間和分數。[2,0][2,1][2,2][1,0][1,1][1,2][0,0][0,1][0,2]把a[m][n]映射到b[k]的公式為:k=i*n+jm、n分別表示二維數組的行數和列數,i為元素所在行,j為元素所在列,同時0<=i<m,0<=j<n。程序實現要點洞口位置的存儲結構和計算。9個洞口的位置和狀態可用3x3二維數組存儲。為后續隨機索引方便,把二維數組映射成一維數組。每個洞口的位置,設相鄰洞口之間的橫向間隔為2個單位,縱向為1個單位。地鼠出現的頻率控制。地鼠的隨機生成和銷毀。游戲時間和分數。1個單位2個單位程序實現要點洞口位置的計算和存儲。地鼠出現的頻率控制。地鼠的隨機生成和銷毀。游戲時間和分數。程序實現要點洞口位置的計算和存儲。地鼠出現的頻率控制。地鼠的隨機生成和銷毀。游戲時間和分數。使用到InvokeRepeating()函數程序實現要點洞口位置的計算和存儲。地鼠出現的頻率控制。地鼠的隨機生成和銷毀。游戲時間和分數。使用到InvokeRepeating()函數函數說明:程序實現要點洞口位置的計算和存儲。地鼠出現的頻率控制。地鼠的隨機生成和銷毀。生成對象用Instantiate函數銷毀對象用Destroy函數游戲時間和分數。Instantiate函數文檔:/ScriptReference/Object.Instantiate.htmlDestroy函數文檔:/ScriptReference/Object.Destroy.html參數: obj:要銷毀的對象 t:執行該代碼之后多長時間后才把該對象銷毀。

如:Destroy(this.gameObject,3.0f);

執行該函數之后過3秒鐘把該對象銷毀掉。 ***this.gameObject或者直接使用gameObject表示掛載了當前組件腳本的對象。也就是自身。如地鼠對象掛載了該腳本,那么gameObject對象指的就是地鼠對象。程序實現要點洞口位置的計算和存儲。地鼠出現的頻率控制。地鼠的隨機生成和銷毀。銷毀對象用Destroy函數生成對象用Instantiate函數游戲時間和分數。程序實現要點洞口位置的計算和存儲。地鼠出現的頻率控制。地鼠的隨機生成和銷毀。銷毀對象用Destroy函數生成對象用Instantiate函數游戲時間和分數。Instantiate函數文檔:/ScriptReference/Object.Instantiate.htmlDestroy函數文檔:/ScriptReference/Object.Destroy.html參數: original:要生成的對象 position:在哪個位置生成該對象 rotation:對象生成后的初始朝向返回值:返回任何繼承自Object(Unity中的基類)的對象。程序實現要點洞口位置的計算和存儲。地鼠出現的頻率控制。地鼠的隨機生成和銷毀。銷毀對象用Destroy函數生成對象用Instantiate函數游戲時間和分數。Instantiate函數文檔:/ScriptReference/Object.Instantiate.htmlDestroy函數文檔:/ScriptReference/Object.Destroy.html參數: original:要生成的對象 position:在哪個位置生成該對象 rotation:對象生成后的初始朝向返回值:返回任何繼承自Object(Unity中的基類)的對象。如:Instantiate(Gophers,newVector3(0,0.4F,-0.1F),Quaternion.identity);//在(0,0.4,-0.1)的位置上生成一個地鼠。**Quaternion.identiy表示默認初始旋轉角度。***Quaternion為四元數,用于表示旋轉,可防止萬向鎖。程序實現要點洞口位置的計算和存儲。地鼠出現的頻率控制。地鼠的隨機生成和銷毀。銷毀對象用Destroy函數生成對象用Instantiate函數鼠標左鍵擊打地鼠。游戲時間和分數。Instantiate函數文檔:/ScriptReference/Object.Instantiate.htmlDestroy函數文檔:/ScriptReference/Object.Destroy.html程序實現要點洞口位置的計算和存儲。地鼠出現的頻率控制。地鼠的隨機生成和銷毀。游戲時間和分數。計時:配合回調函數Update()和靜態變量Time.deltaTime來實現。程序實現要點洞口位置的計算和存儲。地鼠出現的頻率控制。地鼠的隨機生成和銷毀。游戲時間和分數。計時:配合回調函數Update()和靜態變量Time.deltaTime來實現。**Update()函數是游戲制作的最關鍵函數之一,它在游戲大循環的每一幀調用一次,實現數據的更新,比如位置的改變等。程序實現要點洞口位置的計算和存儲。地鼠出現的頻率控制。地鼠的隨機生成和銷毀。游戲時間和分數。計時:配合回調函數Update()和靜態變量Time.deltaTime來實現。**Update()函數是游戲制作的最關鍵函數之一,它在游戲大循環的每一幀調用一次,實現數據的更新,比如位置的改變等。***Time.deltaTime則是兩幀之間的時間差,即Time.deltaTime=currentFrameTime–preFrameTime;程序實現要點洞口位置的計算和存儲。地鼠出現的頻率控制。地鼠的隨機生成和銷毀。游戲時間和分數。Summary洞口位置的計算和存儲。地鼠出現的頻率控制。地鼠的隨機生成和銷毀。游戲時間和分數。當時間少于15秒時增加地鼠出現頻率。實現錘子的擊打動畫。為游戲加上音效。重新開始游戲。導出游戲。關于OnMouseDown函數是Unity中的一種回調函數。當鼠標按下按鍵的事件發生時會被調用。以后在Unity中發現有函數的最前面有On修飾,則表示該函數是在某種狀態下會被觸發運行。《翻牌子》(Memory、PairsGame…)Unity2017經典游戲開發教程:算法分析與實現《翻牌子》游戲規則介紹又名《卡牌對對翻》或叫《記憶翻牌》等等。游戲規則:找到兩兩對應的牌子即可得分,找到所有對應的卡牌結束游戲。玩家每次可以翻開兩張牌,若一樣,則兩張牌將始終處于正面,否則,再次翻轉為背面。當所有卡牌配對成功后,計時停止,游戲結束。本章內容介紹--《記憶翻牌》游戲游戲資源導入與場景搭建。卡牌池生成和卡牌排列。洗牌。卡牌狀態。卡牌的配對。本章內容介紹--《記憶翻牌》游戲游戲資源導入與場景搭建。卡牌池生成和卡牌排列。洗牌。卡牌狀態。卡牌的配對。程序實現要點卡片排列和卡片池生成。洗牌(卡牌隨機生成)。卡片狀態。卡片的配對。程序實現要點卡片排列和卡片池生成。卡片在場景中的布局;該例子中共有12張卡牌,以3行4列的方式排列。使用一個數組來保存卡牌數據。洗牌(卡牌隨機生成)。卡片狀態。卡片的配對。程序實現要點卡片排列和卡片池生成。卡片在場景中的布局;該例子中共有12張卡牌,以3行4列的方式排列。使用一個數組來保存卡牌數據。洗牌(卡牌隨機生成)。卡片狀態。卡片的配對。(-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)以每張卡片的中心為錨點,以左下角卡片為起始點。坐標為originalX=-3,originalY=0;相鄰兩張卡片橫向間隔設為offsetX=2,縱向間隔設offsetY=2.5;則每張卡片相對于左下角卡片的位置為:(x,y)=(offsetX*j+originalX,offsetY*i+originalY)i和j分別表示第i行和第j列i=0i=1i=2J=0J=1J=2J=3程序實現要點卡片排列和卡片池生成。卡片在場景中的布局;該例子中共有12張卡牌,以3行4列的方式排列。使用一個數組來保存卡牌數據。洗牌(卡牌隨機生成)。共有12張牌,6種不同的牌面,每種牌面2張(如何確保每種卡片有2張?)。卡片狀態。卡片的配對。程序實現要點創建一個共有6個元素的一維數組images,用于存放6種不同的牌面。創建一個共有12個元素的一維數組numbers,并初始化給數組為:{0,0,1,1,2,2,3,3,4,4,5,5},每個元素的值代表images數組的對應索引值。對numbers數組進行洗牌,把元素中的數值打亂。按照場景卡牌的布局,在每一個對應的位置生成卡牌的牌面對象。根據i和j,從numbers數組中取出對應的image索引值,再按照該索引值找到每個牌面的圖像。Images數組初始的Numbers數組{0,0,1,1,2,2,3,3,4,4,5,5}洗牌后的Numbers數組{1,0,3,2,4,0,1,3,4,5,5,2}程序實現要點關于洗牌:可采取很多的方式來進行洗牌功能的操作。本例子的洗牌方式為:遍歷整個Numbers數組,獲得當前索引i的元素值。從當前元素的索引到最后元素的索引之間取隨機數r。對調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程序實現要點按照場景卡牌的布局(3行4列),在每一個對應的位置生成卡牌的牌面對象。根據i行和j列,從numbers數組中取出對應的image索引值,再按照該索引值找到每個牌面的圖像。Images數組洗牌后的Numbers數組{1,0,3,2,4,0,1,3,4,5,5,2}通過Numbers獲得Images中的卡片類型為:Images[number[i*gridCols+j]];如場景中第2行,第1列所對應的Numbers的索引值為2*4+1=9,即該卡牌對應Numbers中的元素為Numbers[9]=5,也就是獲得了Images所對應的第5個卡片,即Images[5]=方塊卡片,最后把該圖片對象賦值給對應位置的卡片對象即可。**Numbers中只是保存了Images對應的索引號,而Images才是保存了實際的圖片素材。程序實現要點卡片池生成和卡牌排列。洗牌(卡牌隨機生成)。卡片狀態:共有三種狀態:未被翻開狀態;翻開狀態配對成功狀態。卡片的配對。未被翻開狀態翻開狀態配對成功狀態狀態轉換圖程序實現要點卡片池生成。卡片狀態。卡片的配對。為每種類型設置不同的ID號,當有兩張牌處于翻開狀態時,判斷這兩張牌的ID號是否相等,如果相等,則表示配對成功,否則配對失敗。//偽代碼If(_firstRevealed.id==secondReveled.id){ //配對成功的操作,如加分等。}else{ //配對不成功的操作,如重新把牌翻回背面等。}關于協同程序(Coroutine)協同程序,即在主程序運行時同時開啟另一段邏輯處理,來協同當前程序的執行。最常見的用法是讓某個功能塊運行到某個位置并暫停該功能塊的運行,等到一定時間之后再繼續完成該功能塊的指令。用法:聲明一個返回值為Ienumerator的函數;在函數的某個位置編寫暫停語句:yieldreturnnewWaitForSeconds(1.5f);//讓該函數暫停1.5秒。在主線程的某個位置調用該協同程序,StartCoroutine(協同程序函數的函數名);/ScriptReference/Coroutine.html/ScriptReference/MonoBehaviour.StartCoroutine.html/ScriptReference/WaitForSeconds.html/ScriptReference/WaitForEndOfFrame.html/ScriptReference/MonoBehaviour.StopCoroutine.html拼圖(jigsawpuzzle)Unity2017經典游戲開發教程:算法分析與實現《拼圖》游戲介紹它的歷史可以追溯到1760年左右。英國雕刻師和制圖師約翰?斯皮爾斯伯里(JohnSpilsbury)將地圖貼在硬木板上,然后沿著國界線進行切割,制作了最原始的拼圖。最初的拼圖是具有教育意義的,拼圖所用的圖片有些附有適合青少年閱讀的短文,有些則用于向新興資產階級傳授歷史或地理知識。游戲規則將一張圖片分成若干份(碎片),玩家把這些碎片按照原圖的樣式拼接起來,則視為游戲成功。本章內容介紹--《拼圖》游戲游戲資源導入與場景搭建。碎片對象的生成與初始化位置。原圖與碎片位置的對應關系。鼠標拖拽移動碎片。碎片放置位置正確性判斷。工程創建與資源導入程序實現要點碎片對象的生成與初始化位置。原圖與碎片位置的對應關系。鼠標拖拽移動碎片。碎片放置位置正確性判斷。程序實現要點-碎片對象的生成與初始化位置碎片對象的生成使用Resources類來進行碎片圖片資源的讀入與對象生成,并保存在一個數組中。程序實現要點-原圖與碎片位置的對應關系使用二維數組來保存每個碎片的對象(本例子中共有3x3=9張碎片)。假設二維數組第一個元素[0,0]保存第一張碎片,最后一個元素[2,2]保存最后一張碎片。二維數組中的每個碎片對象對應一維數組碎片圖片的索引號為:圖片一維數組索引號=Row*ColNumber+Col其中:Row表示當前二維數組一個元素所在的行號,ColNumber表示二維數組每一行的列數,Col表示當前二維數組一個元素所在的列號。例如[1,2]對應的碎片需要獲取的圖片為一維數組里的索引號為:1*3+2=5的圖片。[0,0][0,1][0,2][1,0][2,0][1,1][1,2][2,2][2,1]程序實現要點-碎片的初始化位置碎片的初始化放置只需要使用隨機數(Random.Range)即可。程序實現要點-原圖與碎片位置的對應關系

1/2WWW程序實現要點-原圖與碎片位置的對應關系

WW[0,0][0,1][0,2][1,0][2,0][1,1][1,2][2,2][2,1]

1/2WWW程序實現要點-鼠標拖拽移動碎片判斷鼠標點擊的位置是否在碎片內:把鼠標的屏幕坐標轉換為世界坐標(Mx,My);獲取碎片的坐標(Sx,Sy).如果|Mx-Sx|<W/2,|My-Sy|<H/2,則表明鼠標的世界坐標位置在此碎片的范圍內,則判定碎片被選中。(此處不考慮圖層深度)實現被拖拽的碎片跟隨鼠標移動。獲得鼠標的屏幕坐標位置,并轉換為世界坐標下的位置。碎片新的坐標=鼠標的世界坐標+碎片位置與鼠標位置的偏移量。鼠標松開時,則進行碎片位置匹對判斷。程序實現要點-碎片放置位置正確性判斷

[0,0][0,1][0,2][1,0][2,0][1,1][1,2][2,2][2,1]A(x1,y1)B(x2,y2)程序實現要點-碎片放置位置正確性判斷

[0,0][0,1][0,2][1,0][2,0][1,1][1,2][2,2][2,1]A(x1,y1)B(x2,y2)程序實現要點-碎片放置位置正確性判斷

[0,0][0,1][0,2][1,0][2,0][1,1][1,2][2,2][2,1]A(x1,y1)B(x2,y2)程序實現要點-碎片放置位置正確性判斷

if(|X2–X1|<臨界值&&|Y2–Y1|<臨界值){碎片坐標=正確坐標}else{碎片回到原來的位置;}其他Sprite類為Unity中用于2D圖片的類GameObject為Unity中代表游戲對象的類。Transform類,用于保存游戲對象的位置、旋轉和縮放數據。Camera類,用于控制攝像機的行為和屬性等。Vector2/Vector3:數學中的二維向量和三維向量。Resources類,可用于載入保存在Resources目錄下的資源,包括圖片、音頻等等。Mathf類:實現了常用的數學計算函數,如絕對值(ABS)、正弦(Sin)等等。Start函數為回調函數,在MonoBehavior類中聲明,在子類中實現,一般用于初始化一個游戲對象。Update函數為回調函數,在MonoBehavior類中聲明,在子類中實現,每幀調用一起,用于數據(如位置數據,按鍵事件的監聽)的更新。是游戲開發中最重要的一個循環函數。Input.GetMouseButtonDown(0):監聽鼠標按鍵按下的事件。OnMyMouseUp()當鼠標按鍵彈起時響應。******建議查閱Unity的官方文檔,了解以上類和方法*******Manual用戶手冊(建議先整體瀏覽一遍,了解unity能提供的功能,同時最好用英文文檔,練習閱讀英文文檔):/Manual/index.html?_ga=2.6416242.1527791948.1533267545-1582799829.1481427680腳本手冊:/ScriptReference/index.html推箱子(Sokoban)Unity2017經典游戲開發教程:算法分析與實現《推箱子》游戲介紹推箱子是一個來自日本的電子游戲,其電子游戲最早于1981年由今林宏行編寫,并于1982年12月由日本的ThinkingRabbit公司發行,目的是在訓練玩家的邏輯思考能力。游戲規則這個游戲是在一個正方形的棋盤上進行的,每一個方塊表示一個地板或一面墻。地板可以通過,墻面不可以通過。地板上放置了箱子,一些地板被標記為存儲位置。玩家被限制在棋盤上,可以水平或垂直地移動到空的方塊上(永遠不會穿過墻或箱子)。箱子不得被推入其他箱子或墻壁,也不能被拉出。箱子的數量等于存儲位置的數量。當所有的箱子都安放在儲藏地點時,游戲勝利。本章內容介紹--《推箱子》游戲資源的導入、資源切割與角色動畫制作。地圖的生成。分析角色可移動的情況。角色位置以及移動方向與數組的對應關系。角色的移動。箱子的移動。勝利條件判斷。資源的導入、資源切割與角色動畫制作動畫狀態機幀動畫圖片素材程序實現要點地圖的生成。角色位置以及移動方向與數組的對應關系。分析角色可移動的情況。角色的移動。箱子的移動。勝利條件判斷。程序實現要點-地圖的生成使用二維數組的方式來思考地圖信息的存儲。每個元素中用不同的數字來標記不同的對象:0表示空白1表示墻2表示角色3表示箱子9表示終點10表示箱子在目標點上(為什么要設置該狀態?)11表示角色在目標點上(為什么要設置該狀態?)程序實現要點-地圖的生成通過遍歷地圖數組,讀取每個元素的數值,根據數值標記生成不同的地圖對象。程序實現要點-地圖的生成設坐標原點在地圖的左上角,向右為橫向x軸正方向,向下為縱向y軸負方向。那么二維數組map[m][n]的第i行第j列的元素為map[i][j],每個方塊(tile)的尺寸為1*1,則對應map[i][j]在場景中的坐標位置為:position=(j,-i)。例如map[1][4]對應的tile的位置為(4,-1)。同時,該元素的值為1,那么表示的是墻的方塊。程序實現要點-地圖的生成為程序實現的簡便,可以把地圖的二維數組數據映射到一維數組上,便于遍歷。設二維數組為map[m][n],一維數組為b[m*n],則他們的對應關系為:b[i*n+j]=map[i][j]。假設tile的長寬都為1,地圖二維數組大小為9*9,則二維數組中的map[2][1]對應一維數組中的b[2*9+1]=b[19],也就是說,對于數組元素b[19]對應其實際的坐標為(-1,2)。雖然一維數組對于人來說不是很直觀,但把二維數組轉換成一位數組更有利于程序方便的實現。因此,在設計地圖時用二維數組來思考,在進行程序操作,如角色移動時,用一維數組表示。程序實現要點-地圖的生成為程序實現的簡便,可以把地圖的二維數組數據映射到一維數組上,便于遍歷。設二維數組為map[m][n],一維數組為b[m*n],則他們的對應關系為:b[i*n+j]=map[i][j]。假設tile的長寬都為1,地圖二維數組大小為9*9,則二維數組中的map[2][1]對應一維數組中的b[2*9+1]=b[19],也就是說,對于數組元素b[19]對應其實際的坐標為(-1,2)。雖然一維數組對于人來說不是很直觀,但把二維數組轉換成一位數組更有利于程序方便的實現。因此,在設計地圖時用二維數組表示,在進行程序其他操作,如角色移動時,用一維數組表示。地圖數組除了用于生成地圖之外,還作為游戲邏輯的判斷,實時記錄游戲的狀態,也稱為地圖快照!程序實現要點-角色位置以及移動方向與數組的對應關系設地圖左上角為原點,即map[0][0],對應一維數組上為b[0]。那么當角色位于map[i][j],即一維數組的b[i*9+j]。此處以map[4][4](即b[4*9+4]=b[40])為例,則:角色上方一個方格的二維表示為map[3][4],一維表示為b[3*9+4]=b[4*9+4-9]=b[31];角色下方一個方格的二維表示為map[5][4],一維表示為b[5*9+4]=b[4*9+4+9]=b[49];角色左側一個方格的二維表示為map[4][3],一維表示為b[4*9+3]=b[4*9+4-1]=b[39];角色右側一個方格的二維表示為map[4][5],一維表示為b[4*9+5]=b[4*9+4+1]=b[41];設地圖左上角為原點,即map[0][0],對應一維數組上為b[0]。那么當角色位于map[i][j],即一維數組的b[i*9+j]時,此處以map[4][4](即b[4*9+4]=b[40])為例,則:角色上方一個方格的二維表示為map[3][4],一維表示為b[3*9+4]=b[4*9+4-9]=b[31];角色下方一個方格的二維表示為map[5][4],一維表示為b[5*9+4]=b[4*9+4+9]=b[49];角色左側一個方格的二維表示為map[4][3],一維表示為b[4*9+3]=b[4*9+4-1]=b[39];角色右側一個方格的二維表示為map[4][5],一維表示為b[4*9+5]=b[4*9+4+1]=b[41];從以上可以推斷:角色往上移動一格,在一維數組中索引-9;角色往下移動一格,在一維數組中索引+9;角色往左移動一格,在一維數組中索引-1;角色往右移動一格,在一維數組中索引+1;程序實現要點-角色位置以及移動方向與數組的對應關系設地圖左上角為原點,即map[0][0],對應一維數組上為b[0]。那么當角色位于map[i][j],即一維數組的b[i*9+j]時,此處以map[4][4](即b[4*9+4]=b[40])為例,則:角色上方一個方格的二維表示為map[3][4],一維表示為b[3*9+4]=b[4*9+4-9]=b[31];角色下方一個方格的二維表示為map[5][4],一維表示為b[5*9+4]=b[4*9+4+9]=b[49];角色左側一個方格的二維表示為map[4][3],一維表示為b[4*9+3]=b[4*9+4-1]=b[39];角色右側一個方格的二維表示為map[4][5],一維表示為b[4*9+5]=b[4*9+4+1]=b[41];從以上可以推斷:角色往上移動一格,在一維數組中索引-9;角色往下移動一格,在一維數組中索引+9;角色往左移動一格,在一維數組中索引-1;角色往右移動一格,在一維數組中索引+1;因此,我們可以使用一個枚舉類型來表示四個移動方向:publicenumDirection{Up=-9,Down=9,Left=-1,Right=1}程序實現要點-角色位置以及移動方向與數組的對應關系設地圖左上角為原點,即map[0][0],對應一位數組上為b[0]。那么當角色位于map[i][j],即一維數組的b[i*9+j]時,此處以map[4][4](即b[4*9+4]=b[40])為例,則:角色上方一個方格的二維表示為map[3][4],一維表示為b[3*9+4]=b[4*9+4-9]=b[31];角色下方一個方格的二維表示為map[5][4],一維表示為b[5*9+4]=b[4*9+4+9]=b[49];角色左側一個方格的二維表示為map[4][3],一維表示為b[4*9+3]=b[4*9+4-1]=b[39];角色右側一個方格的二維表示為map[4][5],一維表示為b[4*9+5]=b[4*9+4+1]=b[41];從以上可以推斷:角色往上移動一格,在一維數組中索引-9;角色往下移動一格,在一維數組中索引+9;角色往左移動一格,在一維數組中索引-1;角色往右移動一格,在一維數組中索引+1;因此,我們可以使用一個枚舉類型來表示四個移動方向:publicenumDirection{Up=-9,Down=9,Left=-1,Right=1}程序實現要點-角色位置以及移動方向與數組的對應關系角色可移動的情況角色移動方向前方為空地角色移動方向前方為目標點角色移動方向前方為箱子,箱子前方為空地角色移動方向前方為箱子,箱子前方為目標點角色當前位置在目標點上,移動方向前方為目標點角色當前位置在目標點上,移動方向前方為空地角色移動方向前方為箱子,箱子在目標點上,前方為目標點角色移動方向前方為箱子,箱子在目標點上,前方為空地角色當前位置在目標點上,移動方向前方為箱子,箱子前方為空地角色當前位置在目標點上,移動方向前方為箱子,箱子前方為目標點角色移動方向前方為墻面,不可移動箱子移動方向前方為墻面,不可移動箱子移動方向前方為其他箱子,不可移動角色可移動的情況(部分)角色的位置狀態角色位置為空地角色位置為目標點角色下一個位置為空地角色下一個位置為目標點角色下一個位置為箱子角色下一個位置為墻角色下一個位置為在目標點上的箱子箱子下一個位置為空地箱子下一個位置為目標點箱子下一個位置為墻箱子下一個位置為箱子箱子下一個位置為在目標點上的箱子省略角色可移動的情況(部分)角色的位置狀態角色位置為空地角色位置為目標點角色下一個位置為空地角色下一個位置為目標點角色下一個位置為箱子角色下一個位置為墻角色下一個位置為在目標點上的箱子箱子下一個位置為空地箱子下一個位置為目標點箱子下一個位置為墻箱子下一個位置為箱子箱子下一個位置為在目標點上的箱子省略每個移動方向:總共有23種情況角色可移動的情況(部分)角色的位置狀態角色位置為空地角色位置為目標點角色下一個位置為空地角色下一個位置為目標點角色下一個位置為箱子角色下一個位置為墻角色下一個位置為在目標點上的箱子箱子下一個位置為空地箱子下一個位置為目標點箱子下一個位置為墻箱子下一個位置為箱子箱子下一個位置為在目標點上的箱子省略每個移動方向:總共有23種情況代碼如何實現?角色移動偽代碼—采用if—else的情況角色移動偽代碼—采用if—else的情況代碼邏輯混亂,不易修改與調試,可讀性差。角色移動偽代碼—采用SwitchSwitch(角色前方位置狀態){ case前方為空: break; case前方為目標點: break; case前方為箱子: switch(箱子前方狀態){ case前方為空: break; case前方為目標點: break; } break; case前方為箱子在目標點上: switch(箱子前方狀態): case前方為空: break; case前方為目標點: break; break; default:

不可移動; break;}????????????角色移動偽代碼—采用SwitchSwitch(角色前方位置狀態){ case前方為空: break; case前方為目標點: break; case前方為箱子: switch(箱子前方狀態){ case前方為空: break; case前方為目標點: break; } break; case前方為箱子在目標點上: switch(箱子前方狀態): case前方為空: break; case前方為目標點: break; break; default:

不可移動; break;}????????????代碼較簡潔,邏輯清晰,較易修改與調試,可讀性較好。程序實現要點-角色的移動,地圖刷新1 向右移動:獲取到按鍵”→”,此時dir=9。將角色目前位置的數組值變為0,下一目標移動位置的數組值變為2,刷新地圖數組(游戲狀態快照);2 向上移動:獲取到按鍵”↑”,此時dir=-9。將角色目前位置的數組值變為0,下一目標移動位置的數組值變為2,刷新地圖數組(游戲狀態快照);3 向下移動:獲取到按鍵”↓”,此時dir=9。將角色目前位置的數組值變為0,下一目標移動位置的數組值變為2,刷新地圖數組(游戲狀態快照);4 向左移動:獲取到按鍵”←”,此時dir=-1。將角色目前位置的數組值變為0,下一目標移動位置的數組值變為2,刷新地圖數組(游戲狀態快照); 遇到障礙物的時候:跳出遍歷,返回false。111111111120010000103010111103010191111311191011000091010001001010001111011111000111111111102010000103010111103010191111311191011000091010001001010001111011111000程序實現要點-箱子的移動,地圖刷新箱子的移動與角色的移動算法類似,只是除了刷新角色位置之外,還需刷新箱子的位置。移動箱子的功能:設定dir控制角色在數組內的移動距離。1向右移動:獲取到按鍵”→”,此時dir=1。將角色目前位置的數組值變為0,下一目標移動位置的數組值變為2,下二目標移動位置的數組值變為3,刷新地圖數組(游戲狀態快照)2 向上移動:獲取到按鍵”↑”,此時dir=-9。將角色目前位置的數組值變為0,下一目標移動位置的數組值變為2,下二目標移動位置的數組值變為3,刷新地圖數組(游戲狀態快照);3 向下移動:獲取到按鍵”↓”,此時dir=9。將角色目前位置的數組值變為0,下一目標移動位置的數組值變為2,下二目標移動位置的數組值變為3,刷新地圖數組(游戲狀態快照);4 向左移動:獲取到按鍵”←”,此時dir=-1。將角色目前位置的數組值變為0,下一目標移動位置的數組值變為2,下二目標移動位置的數組值變為3,刷新地圖數組(游戲狀態快照);遇到障礙物的時候:跳出遍歷,返回false。111111111100010000123010111103010191111311191011000091010001001010001111011111000111111111100010000102310111103010191111311191011000091010001001010001111011111000程序實現要點-角色和箱子的移動,地圖刷新以上兩種情況都是假設角色或者箱子不在目標點上,如果角色或者箱子在目標點上,應該如何刷新地圖數組呢?111111111100010000100010111103010191111311191011000031010001021010001111011111000111111111100010000100010111103010191111311131011000021010001001010001111011111000111111111100010000100010111103010191111311191011000010101000102101000111101111100011111111110001000010001011110301019111131111110110000101010001001010001111011111000目標點信息被刪除程序實現要點-勝利條件的判斷創建一個計數變量,設置為當前關卡中的目標點的數量。只要當箱子被移動到目標點時,該變量-1。當箱子移出目標點時,該變量+1。當該變量為0時,游戲結束。《推箱子》游戲內容總結地圖的生成。角色位置以及移動方向與數組的對應關系。分析角色可移動的情況。角色的移動。箱子的移動。勝利條件判斷。《推箱子》游戲內容總結地圖的生成。《推箱子》游戲內容總結角色位置以及移動方向與數組的對應關系。《推箱子》游戲內容總結角色可移動的情況。角色的位置狀態角色位置為空地角色位置為目標點角色下一個位置為空地角色下一個位置為目標點角色下一個位置為箱子角色下一個位置為墻角色下一個位置為在目標點上的箱子箱子下一個位置為空地箱子下一個位置為目標點箱子下一個位置為墻箱子下一個位置為箱子箱子下一個位置為在目標點上的箱子省略《推箱子》游戲內容總結角色的移動。111111111120010000103010111103010191111311191011000091010001001010001111011111000111111111102010000103010111103010191111311191011000091010001001010001111011111000《推箱子》游戲內容總結箱子的移動。111111111100010000123010111103010191111311191011000091010001001010001111011111000111111111100010000102310111103010191111311191011000091010001001010001111011111000《推箱子》游戲內容總結勝利條件判斷.創建一個計數變量,設置為當前關卡中的目標點的數量。只要當箱子被移動到目標點時,該變量-1。當箱子移出目標點時,該變量+1。當該變量為0時,游戲結束。作業按照書本里的步驟,實現整個游戲,并導出為可運行在PC平臺的exe運行程序。30分嘗試修改場景地圖,增加多個關卡。30分選做:嘗試修改和導出為Android或者IOS版本的觸屏版本。20分選做:為游戲加入主界面。20分***地圖的生成基于Tile的2D場景設計可以利用更加專業的軟件如Tilemap等來制作地圖數據,一般導出格式為XML等,然后再導入到各個引擎中,利用相應算法,重新生成地圖。該方法可以擴展到3D的基于規則形狀(如立方體,類似《我的世界》。)Unity中現在也提供了一定功能的基于2DTile場景的搭建。基于Tile場景搭建,由多種規則圖形的tile組成(可以是正方形、六邊形、菱形等規律tile),利用二維或者多維數組記錄場景數據。基于不同形狀的tile地圖生成算法:/~amitp/game-programming/grids/俄羅斯方塊(Tetris)Unity2017經典游戲開發教程:算法分析與實現《俄羅斯方塊》游戲介紹1984年6月,在俄羅斯科學院計算機中心工作的數學家“帕基特諾夫”利用空閑時間編出一個游戲程序,用來測試當時一種計算機的性能。帕基特諾夫愛玩拼圖,從拼圖游戲里得到靈感,設計出了俄羅斯方塊。游戲基本規則有一塊用于擺放方塊的平面虛擬場地,其標準大小:行寬為10,列高為20,以一個小方塊為一個單位。有一組由4個方塊組成的規則圖形(中文通稱為方塊),共有7種,分別以S、Z、L、J、I、O、T這7個字母的形狀來命名。玩家可以以90度為單位旋轉方塊;以格子為單位左右移動方塊;讓方塊加速下落。當區域中的某一行格子全部由方塊填滿,則該行方塊會消失并成為玩家的得分。刪除的行越多,得分越高。當方塊堆到區域最上方而無法消除時,則該游戲結束。演示效果.gif基本流程初始化階段移動旋轉滿行判斷與消除本章內容介紹--《俄羅斯方塊》游戲資源導入、方塊切割與預制體制作、場景設置初始化地圖方塊類(Block)的編寫初始化方塊移動方塊消除滿行方塊附加功能—控制方塊下落速度附加功能—顯示下一個方塊的樣式本章核心要點整個游戲的地圖快照,用不同數字記錄場景當前狀態。本章核心思路是使用二維數組,用不同的數值表示不同的方塊和狀態。滿行判斷與消除。一、資源的導入資源導入、方塊切割與預制體制作、場景設置。二、初始化地圖初始化地圖二維數組用二維數組生成當前地圖狀態負責記錄游戲場景狀態、繪制背景以地圖的數值為依據進行邊界判斷每次移動方塊,都要更新地圖共有4種情況墻=-1空格=0固定方塊=8(方塊不可以再操作時)游戲中的方塊=自身的形態數值(即方塊的狀態)三、方塊類(Block)的編寫初始化方塊的形狀用二維數組,通過數字存儲方塊的四種變換形態,用一個[4][16]的二維數組,4表示方塊的四種不同旋轉朝向,16用于記錄方塊的樣式。根據方塊類型決定方塊的變換形態存儲原則方塊由小方塊組成,數字代表一個小的組成方塊用數組抽象表示方塊形態,有數字表示有小方塊,0表示沒有小方塊數字與當前方塊類型有關,不同類型的方塊,數值不同二維數組中每個大括號里的數組,都表示一種形態的方塊獲取操作獲取方塊狀態、獲取方塊組當前位置變換操作旋轉方塊、重置方塊、上下左右移動方塊基本流程初始化階段移動旋轉滿行判斷與消除四、初始化方塊—方塊在地圖中的隨機生成把7種方塊放置在一個一維數組中,然后用隨機遍歷的方法在場景中生成兩個方塊,一個用于當前方塊的控制,一個用于下一個方塊的控制。五、移動和旋轉方塊—位置坐標修改左右移動或旋轉鍵盤響應后,移動,后判斷移動左=>方塊位置x-1右=>方塊位置x+1旋轉=>方塊狀態數組里取下一狀態撞到左右墻壁?撞到底部?撞到固定方塊?滿足其一,撤銷移動移動更新地圖(旋轉)五、移動和旋轉方塊—邊界判斷左右移動或旋轉。不可可以移動的條件,遍歷Block的每一個元素,如果該元素不為零,那么就要進行以下的判斷。碰到左右邊界。碰到底部。碰到其他方塊。-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移動邊界判定不可左右移動五、移動方塊—向下移動向下移動碰撞判斷撞到底部=>方塊存在小方塊位置<0撞到其他方塊=>地圖信息為8地圖更新固定方塊信息將當前移動的方塊狀態變更為8更新地圖變更地圖二維數組里的數值鍵盤響應或間隔一定時間后,先移動,后判斷撞到底部?撞到其他方塊?滿足其一,地圖更新固定方塊信息移動更新地圖……六、消除滿行方塊流程

碰撞判斷撞到頂部=>地圖最上面一行存在數值8方塊到達底部或其他方塊后撞到頂部?不滿足滿足,游戲結束滿行?滿足,刪除該行數據不滿足,生成方塊上方固定方塊數據下移-188-1-188-1-1888888888-1-18888888-1-1-1-1-1-1-1-1-1-1-1-1遍歷最上面一行,存在數值8六、消除滿行方塊滿行判斷地圖一行一行遍歷(除去邊界)若掃描到非8,跳出此行,遍歷下一行地圖上一行數值全為8即為滿行滿行消除從滿行的該行往上的所有行,固定方塊數據全部下移-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消除一整行,上方殘留數據全部下移一行七、游戲結束判斷遍歷最頂行的數值,如果有一個數值為8,則表示游戲結束。-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八、附加功能,方塊自動下落速度控制實現一個節奏計時器,按照一定時間間隔運行方塊角落邏輯。八、附加功能,提示下一個方塊在場景中的右側,顯示出下一個要下落的方塊類型。使用一個4*4的二維數組,用于顯示方塊提示。八、附加功能,代碼的重復代碼優化作業按照書本里的步驟,實現整個游戲,并導出為可運行在PC平臺的exe運行程序。30分嘗試實現,隨著分數的增加,方塊下降的速度越快。30分嘗試添加4種新的方塊類型。20分華容道Unity2017經典游戲開發教程:算法分析與實現《華容道》游戲介紹華容道是古老的中國民間益智游戲.華容道取自《三國演義》中的赤壁戰爭:“曹瞞兵敗走華容,正與關公狹路逢。只為當初恩義重,放開金鎖走蛟龍”這一故事情節。其變化多端、百玩不厭的特點與魔方、獨立鉆石棋一起被國外智力專家并稱為“智力游戲界的三個不可思議”。它與七巧板、九連環等中國傳統益智玩具還有個代名詞叫作“中國的難題”。華容道的現在樣式是1932年JohnHaroldFleming在英國申請的專利,并且還附上橫刀立馬的解法。游戲規則容道的棋盤是一個帶20個方塊的棋盤,棋盤下方有一個兩方格寬的出口,僅供曹操逃走。華容道游戲中的方塊有四種:大正形(2×2);橫長方形(2×1);豎長方形(1×2);小正方形(1×1)。游戲華容道有不同的開局,根據5個矩形塊的放法分類,有一橫式,二橫式,三橫式,四橫式,五橫式。如橫刀立馬近在咫尺小燕還巢比翼橫空過五關水泄不通等。棋盤上僅有兩個空格可供棋子移動。玩家需要通過鼠標移動棋子,讓曹操從棋盤最下方的中部兩個空格中逃出,則游戲勝利。2×22×11×21×1游戲規則本例子將實現“橫刀立馬”的樣式。本章內容介紹--《華容道》游戲資源的導入、攝像機和背景設置,棋子預制體的制作。棋子類(Chess)的編寫。棋盤盤面布局的生成。分析棋子可移動的情況判斷選中的棋子。判斷棋子移動方向。判斷棋子類型。判斷棋子是否可以移動。移動棋子并更新棋盤狀態。游戲勝利判斷。資源的導入、攝像機和背景設置,棋子預制體的制作。棋子類(Chess)的編寫。使用枚舉類型編寫棋子的類型。初始化、生成棋子對象。根據棋子類型為棋子的寬高賦值。(后續)設置曹操目標點。(后續)曹操是否到達目標點的判斷函數。棋盤盤面布局的生成

將所有棋子對象存進數組里,并用Chess類方法實例化棋子對象。設棋子的錨點在左上角。棋子位置通過硬編碼方式進行設置。用二維數組初始化棋盤快照棋盤快照作用:用以記錄當前盤面的狀態,主要用于判斷被選擇的棋子是否可以被移動到下一個位置以及勝利條件的判斷等。棋盤狀態含義棋子已占用——1棋盤邊界——1棋子未占用——0注意:增加兩行兩列表示棋盤邊界(1,1)(1,3)(1,5)(2,5)(4,5)(2,3)(2,2)(3,2)(4,3)(4,1)移動棋子的實現

判斷選中的棋子。判斷棋子移動方向。判斷棋子類型。判斷棋子是否可以移動。移動棋子并更新棋盤狀態。判斷選中的棋子 獲取鼠標點擊坐標。

鼠標點擊=>獲取鼠標點擊坐標(屏幕坐標)=>轉換成

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論