游戲程序設(shè)計(jì)報(bào)告_第1頁(yè)
游戲程序設(shè)計(jì)報(bào)告_第2頁(yè)
游戲程序設(shè)計(jì)報(bào)告_第3頁(yè)
游戲程序設(shè)計(jì)報(bào)告_第4頁(yè)
游戲程序設(shè)計(jì)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩17頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

游戲程序設(shè)計(jì)課程報(bào)告報(bào)告題目太空大戰(zhàn)游戲程序設(shè)計(jì)學(xué)院名稱信息科學(xué)與技術(shù)學(xué)院專業(yè)名稱軟件工程學(xué)生姓名學(xué)生學(xué)號(hào)任課教師報(bào)告成績(jī)教務(wù)處制2015年07月04日

目錄TOC\o"1-3"\h\u第1章引言 21.1游戲設(shè)計(jì)背景 21.2游戲規(guī)則 31.3主要研究?jī)?nèi)容 5第2章游戲開發(fā)工具和關(guān)鍵技術(shù)簡(jiǎn)介 52.1開發(fā)工具 52.2關(guān)鍵技術(shù) 5第3章游戲程序總體設(shè)計(jì) 73.1游戲總體流程: 73.2游戲類圖: 8第4章游戲程序?qū)崿F(xiàn)與測(cè)試 104.1敵人碰撞邏輯的實(shí)現(xiàn): 104.2終極BOSS的移動(dòng)實(shí)現(xiàn): 114.3玩家移動(dòng)邏輯實(shí)現(xiàn) 134.4玩家碰撞邏輯實(shí)現(xiàn): 144.5游戲界面GUI顯示邏輯實(shí)現(xiàn): 144.6敵人生成邏輯實(shí)現(xiàn): 18第五章 收獲 20第六章 參考文獻(xiàn) 20第1章引言1.1游戲設(shè)計(jì)背景本次設(shè)計(jì)游戲?yàn)橐豢铒w行射擊類游戲,名字為太空大戰(zhàn)。該游戲具有普通游戲一樣的功能,比如場(chǎng)景設(shè)計(jì),紋理貼圖,人物移動(dòng),碰撞檢測(cè),生命值等元素。和團(tuán)隊(duì)一起設(shè)計(jì)并實(shí)現(xiàn)該游戲一方面鞏固課堂學(xué)到的知識(shí),學(xué)以致用,加深理論知識(shí)的理解,另一方面也鍛煉了自己的實(shí)際編碼能力和團(tuán)隊(duì)協(xié)作的能力,是一次難得又寶貴的開發(fā)經(jīng)歷。目前市面上的飛行射擊游戲還算火爆,隨著智能手機(jī)的普及,人們?cè)絹?lái)越多的使用手機(jī)玩手機(jī)游戲,其中以休閑類游戲?yàn)榇?,比如成?jī)火爆過(guò)的《憤怒的小鳥》,《flappybird》,《雷電3D》,《現(xiàn)代戰(zhàn)爭(zhēng)》等游戲都廣受好評(píng)。1.2游戲規(guī)則本款太空大戰(zhàn)游戲分為兩種模式:挑戰(zhàn)模式和生存模式。玩家可在游戲主界面進(jìn)行選擇,如下圖:其中挑戰(zhàn)模式分為4個(gè)關(guān)卡,每個(gè)關(guān)卡的難度依次遞增,玩家必須消滅一定數(shù)量的敵人,得到規(guī)定的分?jǐn)?shù)才可以進(jìn)入下一關(guān)。每一關(guān)的敵人會(huì)有所不同,難度也依次增加。最后一關(guān)為挑戰(zhàn)終極BOSS,消滅BOSS后即可通關(guān)。下圖分別為第二關(guān)和終極BOSS:生存模式中沒(méi)有關(guān)卡限制,以計(jì)分為主,隨著玩家分?jǐn)?shù)的增加,游戲難度會(huì)逐漸加大,以敵人數(shù)量增加和類型增多來(lái)表現(xiàn),玩家每次得到一百分,自己生命值就會(huì)增加一,初始生命為10,玩家生命耗盡則游戲結(jié)束,如下圖:1.3主要研究?jī)?nèi)容在本次太空大戰(zhàn)游戲設(shè)計(jì)中,我主要負(fù)責(zé)編碼實(shí)現(xiàn),精確碰撞技術(shù)的研究等內(nèi)容。第2章游戲開發(fā)工具和關(guān)鍵技術(shù)簡(jiǎn)介2.1開發(fā)工具本次游戲開發(fā)語(yǔ)言使用C#采用Unity3d4.6游戲引擎開發(fā)代碼編寫使用VS2012模型制作采用3dMax20122.2關(guān)鍵技術(shù)游戲中設(shè)計(jì)的關(guān)鍵技術(shù)主要有物體的精確碰撞檢測(cè),背景動(dòng)畫的循環(huán)播放。精確碰撞檢測(cè):物體的精確碰撞實(shí)現(xiàn)方法有很多,在這個(gè)游戲中使用的是制作模型來(lái)達(dá)到精確碰撞的目的。首先在3dMax中制作出敵人的模型和一個(gè)同模型相接近的骨骼,并依附在模型中一起打包成FBX格式的模型,然后在Unity3d中直接導(dǎo)入該模型,就可以直接使用之前制作好的骨骼來(lái)做精確碰撞處理,如下圖:背景動(dòng)畫的循環(huán)播放:實(shí)現(xiàn)背景的循環(huán)播放方法也很多,常見的比如直接使用2張可以前后對(duì)接的圖片,當(dāng)一張圖片播放完成后直接在后面接入另一張圖片,重復(fù)此過(guò)程,即可達(dá)到動(dòng)畫循環(huán)的目的。在這個(gè)有些中,我直接使用的Unity3d中的動(dòng)畫系統(tǒng)來(lái)制作UV動(dòng)畫,如下圖:第3章游戲程序總體設(shè)計(jì)3.1游戲總體流程:首先玩家進(jìn)入游戲主界面,進(jìn)行選擇,點(diǎn)擊退出則直接退出游戲。選擇挑戰(zhàn)模式則進(jìn)入游戲,游戲失敗可以選擇繼續(xù)或者返回主界面,選擇生存模式則當(dāng)聲明值耗盡時(shí)顯示玩家分?jǐn)?shù)并顯示回退按鈕退回到主界面,選擇游戲幫助,則進(jìn)入幫助界面。3.2游戲類圖:敵人類圖:游戲中有4種敵人,如上圖所示,其中最原始的敵人是Enemy類,其它3中敵人都繼承于Enemy,只是重寫了移動(dòng)方法和少量屬性。玩家類圖:玩家類中有MovwTo()方法,該方法實(shí)現(xiàn)玩家追隨鼠標(biāo)移動(dòng)的方法,在手機(jī)上即讓玩家追隨手指移動(dòng)。其中的OnTriggerEnter()方法檢測(cè)碰撞并作出相應(yīng)的邏輯計(jì)算。子彈類:子彈類分為玩家子彈和敵人子彈,其中敵人子彈繼承于玩家子彈,重新了碰撞檢測(cè)邏輯,由于Unity3d可直接在面板中設(shè)置腳本屬性的值,因此每種敵人的子彈類不需要再重新寫一個(gè)類,只需要依附EnemyRocket腳本后再重新設(shè)置值即可。游戲程序?qū)崿F(xiàn)與測(cè)試4.1敵人碰撞邏輯的實(shí)現(xiàn):voidOnTriggerEnter(Colliderother){if(other.tag.CompareTo("PlayerRocket")==0)//如果子彈發(fā)生碰撞{Rocketrocket=other.GetComponent<Rocket>();//獲取子彈對(duì)象的引用if(rocket!=null){m_life-=rocket.power;//減少生命值if(m_life<=0)//敵機(jī)生命值用盡就銷毀{if(GlobalPramameters.gameModel=="SurviveModel")//如果是生存模式{SurviveModelManage.Instance.AddScore(m_point);if(SurviveModelManage.Instance.GetScore()-100*GlobalPramameters.lifeAddCount>=0){mplayer.m_life+=1;//增加生命GlobalPramameters.lifeAddCount+=1;}}elseGameManager.Instance.AddScore(m_point);//消滅敵人后增加分?jǐn)?shù)Instantiate(m_explosionFX,m_transform.position,Quaternion.identity);//播放爆炸特效Destroy(this.gameObject);}}}if(other.tag.CompareTo("Player")==0&&this.gameObject.tag.CompareTo("Model_Helicopters_Apache")!=0){m_life=0;Instantiate(m_explosionFX,m_transform.position,Quaternion.identity);//播放爆炸特效Destroy(this.gameObject);}if(other.tag.CompareTo("bound")==0){m_life=0;Instantiate(m_explosionFX,m_transform.position,Quaternion.identity);//播放爆炸特效Destroy(this.gameObject);}}4.2終極BOSS的移動(dòng)實(shí)現(xiàn):protectedoverridevoidUpdateMove(){m_fireTimer-=Time.deltaTime;if(m_fireTimer<=0){m_fireTimer=1;if(m_player!=null){Vector3relativePos=m_transform.position-m_player.position;//敵機(jī)位置減去玩家位置,得到一個(gè)向量差Vector3leftPos1=m_transform.position;//左邊發(fā)射導(dǎo)彈位置Vector3leftPos2=m_transform.position;//左邊發(fā)射導(dǎo)彈位置Vector3rightPos1=m_transform.position;//右邊發(fā)射導(dǎo)彈位置Vector3rightPos2=m_transform.position;//右邊發(fā)射導(dǎo)彈位置leftPos1.x-=0.9f;leftPos2.x-=1.3f;rightPos2.x+=0.9f;rightPos1.x+=1.2f;Instantiate(m_rocket,leftPos1,Quaternion.LookRotation(relativePos));//讓子彈朝著玩家飛Instantiate(m_rocket,leftPos2,Quaternion.LookRotation(relativePos));//讓子彈朝著玩家飛Instantiate(m_rocket,rightPos2,Quaternion.LookRotation(relativePos));//讓子彈朝著玩家飛Instantiate(m_rocket,rightPos1,Quaternion.LookRotation(relativePos));//讓子彈朝著玩家飛}}//前進(jìn):Z方向直線往下走floatrx=Mathf.Sin(Time.time-GlobalPramameters.time)*Time.deltaTime*6.0f;//左右移動(dòng)floatrz=0f;int[]myArray={1,2};floatelement=myArray[Random.Range(0,myArray.Length)];if(element%2==0)rz=Mathf.Sin(Time.time)*Time.deltaTime*(-1.0f);//上下移動(dòng)elserz=Mathf.Sin(Time.time)*Time.deltaTime*(1.0f);//上下移動(dòng)m_transform.Translate(newVector3(rx,0,rz));}4.3玩家移動(dòng)邏輯實(shí)現(xiàn)voidMoveTo(){if(Input.GetMouseButton(0)){Vector3ms=Input.mousePosition;//獲得鼠標(biāo)屏幕的位置Rayray=Camera.main.ScreenPointToRay(ms);//將屏幕位置轉(zhuǎn)為射線RaycastHithitinfo;//用來(lái)記錄射線碰撞信息booliscast=Physics.Raycast(ray,outhitinfo,1000,m_inputMask);//產(chǎn)生射線if(iscast){m_targetPos=hitinfo.point;//如果射中目標(biāo),記錄射線碰撞點(diǎn)}}Vector3pos=Vector3.MoveTowards(this.transform.position,m_targetPos,(m_speed+20)*Time.deltaTime);//獲得朝目標(biāo)移動(dòng)的位置,第三個(gè)參數(shù)數(shù)移動(dòng)的最大速度this.m_transform.position=pos;//更新當(dāng)前的位置}4.4玩家碰撞邏輯實(shí)現(xiàn):voidOnTriggerEnter(Colliderother){if(other.tag.CompareTo("PlayerRocket")!=0&&other.tag.CompareTo("Quad")!=0){if(other.tag.CompareTo("HelicoptersRocket")==0)m_life-=2;elsem_life-=1;if(m_life<=0){Instantiate(m_explosionFX,m_transform.position,Quaternion.identity);//播放爆炸特效Destroy(this.gameObject);}}}4.5游戲界面GUI顯示邏輯實(shí)現(xiàn):voidOnGUI(){//游戲暫停if(Time.timeScale==0){if(nextLevel){switch(GlobalPramameters.currentLevel){case1:GUI.skin.label.fontSize=50;//放大字體GUI.Label(newRect(0,Screen.height*0.2f,Screen.width,60),"通關(guān)成功");GUI.skin.label.fontSize=20;//進(jìn)入下一關(guān)按鈕if(GUI.Button(newRect(Screen.width*0.5f-50,Screen.height*0.4f,100,30),"進(jìn)入下一關(guān)")){Application.LoadLevel("level_2");//載入下一關(guān)}break;case2:GUI.skin.label.fontSize=50;//放大字體GUI.Label(newRect(0,Screen.height*0.2f,Screen.width,60),"通關(guān)成功");GUI.skin.label.fontSize=20;//進(jìn)入下一關(guān)按鈕if(GUI.Button(newRect(Screen.width*0.5f-50,Screen.height*0.4f,100,30),"進(jìn)入下一關(guān)")){Application.LoadLevel("level_3");//載入下一關(guān)}break;case3:GUI.skin.label.fontSize=50;//放大字體GUI.Label(newRect(0,Screen.height*0.2f,Screen.width,60),"通關(guān)成功");GUI.skin.label.fontSize=20;//進(jìn)入下一關(guān)按鈕if(GUI.Button(newRect(Screen.width*0.5f-50,Screen.height*0.4f,100,30),"挑戰(zhàn)終極BOSS")){GlobalPramameters.time=Time.time;Application.LoadLevel("level_4");//載入下一關(guān)}break;default:break;}}elseGamePause();}if(m_player!=null){m_life=(int)m_player.m_life;//獲得生命值}else//游戲結(jié)束{m_life=0;GUI.skin.label.fontSize=50;//放大字體GUI.Label(newRect(0,Screen.height*0.2f,Screen.width,60),"游戲失敗");GUI.skin.label.fontSize=20;if(GUI.Button(newRect(Screen.width*0.5f-50,Screen.height*0.5f,100,30),"返回主菜單")){Application.LoadLevel("start");//讀取關(guān)卡m_score=0;m_life=GlobalPramameters.playerLife;GlobalPramameters.currentLevel=0;}}if(GlobalPramameters.currentLevel==4&&Helicopters_Apache==null){GUI.skin.label.fontSize=50;//放大字體GUI.Label(newRect(0,Screen.height*0.2f,Screen.width,60),"YOUAREWINNER!");GUI.skin.label.fontSize=20;//進(jìn)入下一關(guān)按鈕if(GUI.Button(newRect(Screen.width*0.5f-50,Screen.height*0.4f,100,30),"返回主菜單")){Application.LoadLevel("start");//讀取關(guān)卡m_score=0;m_life=GlobalPramameters.playerLife;GlobalPramameters.currentLevel=0;}}GUI.skin.label.fontSize=15;GUI.Label(newRect(150,5,100,30),"生命值:"+m_life);//顯示生命值//顯示記錄GUI.skin.label.alignment=TextAnchor.LowerCenter;GUI.Label(newRect(0,5,Screen.width,30),"記錄:"+m_hisore);//顯示當(dāng)前得分GUI.Label(newRect(0,25,Screen.width,30),"得分:"+m_score);}4.6敵人生成邏輯實(shí)現(xiàn):voidUpdate(){canInstance=false;if(m_gameModel=="SurviveModel"){//控制生成不同敵人的時(shí)機(jī)currentScore=SurviveModelManage.Instance.GetScore();if(currentScore>=350)canInstance=true;elseif(currentScore>=250&&this.gameObject.tag.CompareTo("Model_Helicopters_Apache")!=0)canInstance=true;elseif(currentScore>=100&&(this.gameObject.tag.CompareTo("Enemy")==0||this.gameObject.tag.CompareTo("SuperEnemy")==0))canInstance=true;elseif((this.gameObject.tag.CompareTo("Enemy")==0))canInstance=true;}//控制挑戰(zhàn)模式下游戲難度if(GlobalPramameters.currentLevel==3&&this.m_enemy.tag.CompareTo("Model_Helicopters_Transport")==0)enemyNumber=25.0f;elseif(GlobalPramameters.enemyCount>20)enemyNumber=5.0f;elseif(GlobalPramameters.enemyCount>10)enemyNumber=10.0f;elseenemyNumber=15.0f;m_timer-=Time.deltaTime;if(m_timer<=0){m_timer=Random.value*enemyNumber;//Random.value隨機(jī)生成0.0到1.0的數(shù)if(GlobalPramameters.currentLevel==3

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論