版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
實(shí)驗(yàn)塔防式游戲詳細(xì)設(shè)計(jì)之一一、實(shí)驗(yàn)?zāi)康亩?shí)驗(yàn)要求三、實(shí)驗(yàn)設(shè)備計(jì)算機(jī)、Python2.7、Pygame1.9.2四、實(shí)驗(yàn)內(nèi)容一、創(chuàng)立游戲場(chǎng)景和卡通人物#1-Importlibraryimportpygamefrompygame.localsimport*#2–初始化游戲場(chǎng)景,即根本畫(huà)布pygame.init()width,height=640,480screen=pygame.display.set_mode((width,height))#3–通過(guò)裝載圖像的方式畫(huà)出一個(gè)卡通人物player=pygame.image.load("resources/images/dude.png")#4–游戲的主循環(huán)while1:
#5-clearthescreenbeforedrawingitagain
screen.fill(0)
#6-drawthescreenelements
screen.blit(player,(100,100))
#7-updatethescreen
pygame.display.flip()
#8–主循環(huán)中的事件循環(huán)
foreventinpygame.event.get():
#checkiftheeventistheXbutton
ifevent.type==pygame.QUIT:
#ifitisquitthegame
pygame.quit()
exit(0)代碼解釋?zhuān)簩?dǎo)入pygame庫(kù),這一步能讓你使用庫(kù)里提供的功能初始化pygame,設(shè)置展示窗口加載作為兔子的圖片不停地循環(huán)執(zhí)行接下來(lái)的局部在給屏幕畫(huà)任何東西之前用黑色進(jìn)行填充在屏幕的〔100,100〕坐標(biāo)出添加你加載的兔子圖片更新屏幕檢查一些新的事件,如果有退出命令,那么終止程序的執(zhí)行。二、豐富場(chǎng)景在#3的結(jié)尾處,在添加玩家圖片的后面,加上以下的代碼:12grass=pygame.image.load("resources/images/grass.png")castle=pygame.image.load("resources/images/castle.png")這段代碼加載圖片并將它們放在變量里?,F(xiàn)在它們需要被畫(huà)在屏幕上。但是當(dāng)你檢查了草的圖片后,發(fā)現(xiàn)它不會(huì)覆蓋整個(gè)屏幕,它的分辨率是640x480。添加到game.py里#6的代碼:1234567forxinrange(width/grass.get_width()+1):
foryinrange(height/grass.get_height()+1):
screen.blit(grass,(x*100,y*100))screen.blit(castle,(0,30))screen.blit(castle,(0,135))screen.blit(castle,(0,240))screen.blit(castle,(0,345))三、互動(dòng)元素設(shè)計(jì)接下來(lái)你需要加上一些真正的游戲的元素了,比方讓兔子能夠隨著按鍵移動(dòng)。為了做到這一點(diǎn),首先,你需要實(shí)現(xiàn)一個(gè)方法,用來(lái)記錄在某一時(shí)刻那個(gè)鍵被按下??梢酝ㄟ^(guò)新建一個(gè)按鍵狀態(tài)的隊(duì)列來(lái)存放每個(gè)你想在游戲里用到的按鍵。把以下代碼參加到game.py里#2后面:12keys=[False,False,False,False]playerpos=[100,100]這段代碼是不言自明的,key這個(gè)隊(duì)列用來(lái)記錄幾個(gè)按鍵的情況:W、A、S、D。隊(duì)列中的每一項(xiàng)對(duì)應(yīng)一個(gè)按鍵——第一個(gè)對(duì)應(yīng)W,第二個(gè)對(duì)應(yīng)A等等。playerpos這個(gè)變量表示程序畫(huà)出玩家的位置。因?yàn)檫@個(gè)游戲會(huì)讓玩家向不同的方向移動(dòng),用一個(gè)變量來(lái)表示玩家的位置并且能夠依據(jù)這個(gè)變量將玩家畫(huà)出來(lái)的方案是非常適合的?,F(xiàn)在你需要修改現(xiàn)在畫(huà)出玩家的代碼,需要用上playerpos變量。把#6局部的代碼進(jìn)行修改:從1screen.blit(player,(100,100))改成:1screen.blit(player,playerpos)在#8的結(jié)尾,就在event.py==pygame.QUIT后面,添加一下的代碼〔與pygame.QUIT保持同級(jí)別縮進(jìn)〕:123456789101112131415161718ifevent.type==pygame.KEYDOWN:
ifevent.key==K_w:
keys[0]=True
elifevent.key==K_a:
keys[1]=True
elifevent.key==K_s:
keys[2]=True
elifevent.key==K_d:
keys[3]=Trueifevent.type==pygame.KEYUP:
ifevent.key==pygame.K_w:
keys[0]=False
elifevent.key==pygame.K_a:
keys[1]=False
elifevent.key==pygame.K_s:
keys[2]=False
elifevent.key==pygame.K_d:
keys[3]=False首先,你檢查是否有一個(gè)鍵被按下或放開(kāi)。然后,檢查是哪一個(gè)鍵被按下或放開(kāi)了,如果被按下或放開(kāi)的鍵是你使用的,你就更新記錄按鍵的變量。最終,你需要更新playerpos變量〔兔子的當(dāng)前位置〕作為按鍵后的反響。這實(shí)際上是非常簡(jiǎn)單的。在8#代碼區(qū)后面添加兔子移動(dòng)的步長(zhǎng):#9-Moveplayerifkeys[0]:playerpos[1]-=5elifkeys[2]:playerpos[1]+=5ifkeys[1]:playerpos[0]-=5elifkeys[3]:playerpos[0]+=5四、控制鼠標(biāo)操作精靈好的,現(xiàn)在你的兔子在你按鍵的時(shí)候可以移動(dòng)了,但是如果你能用鼠標(biāo)讓兔子朝向你選擇的方向不是更酷嗎?這樣它就不會(huì)總是朝向一個(gè)方向了。用三角定理實(shí)現(xiàn)它會(huì)非常簡(jiǎn)單。看一下下面的插圖:在上圖中,如果〔5,3〕是兔子的位置,〔2,4〕是現(xiàn)在鼠標(biāo)的位置,你可以通過(guò)三角定理來(lái)得出需要旋轉(zhuǎn)的角度。然后,你知道了旋轉(zhuǎn)的角度后,以就可以來(lái)旋轉(zhuǎn)你的兔子了。如果你對(duì)這局部感到有點(diǎn)疑惑,不要擔(dān)憂——這沒(méi)有關(guān)系。但這是你為什么需要在數(shù)學(xué)課上集中精力的原因。在游戲編程中會(huì)用得到它的。現(xiàn)在,你需要接受你的游戲里的概念。為了實(shí)現(xiàn)它,你可以使用PyGameSurface.rotate(degrees)函數(shù)。atatn2函數(shù)是來(lái)自Python的math庫(kù)。所以把以下代碼加到#1局部:1importmath然后,把#6局部的最后一行用一下代碼替換:123456#6.1-Setplayerpositionandrotationposition=pygame.mouse.get_pos()angle=math.atan2(position[1]-(playerpos[1]+32),position[0]-(playerpos[0]+26))playerrot=pygame.transform.rotate(player,360-angle*57.29)playerpos1=(playerpos[0]-playerrot.get_rect().width/2,playerpos[1]-playerrot.get_rect().height/2)screen.blit(playerrot,playerpos1)我們來(lái)瀏覽一下以上代碼的根本結(jié)構(gòu)。首先獲取鼠標(biāo)和玩家的位置。然后將它們使用atan2函數(shù)。然后,獲取通過(guò)atan2函數(shù)得出的角度和弧度。當(dāng)兔子被旋轉(zhuǎn)的時(shí)候,它的位置將會(huì)改變。所以你需要計(jì)算兔子新的位置,然后將其在屏幕上顯示出來(lái)。再次運(yùn)行游戲,如果你只是按WASD這幾個(gè)鍵,那么這個(gè)游戲跟以前還是一樣的。但是如果你移動(dòng)鼠標(biāo),兔子也開(kāi)始旋轉(zhuǎn)了,相當(dāng)酷!五增加攻擊能力現(xiàn)在你的兔子可以四處移動(dòng)了,是時(shí)候來(lái)添加更多的功能了。讓兔子用箭頭射向它們的敵人怎么樣?這一步會(huì)有一點(diǎn)復(fù)雜,因?yàn)槟阈枰櫵械募^,更新它們,旋轉(zhuǎn)它們,在它們跑出屏幕的時(shí)候刪除它們。首先,在#2聲明的局部加上必要的變量的聲明。12acc=[0,0]arrows=[]第一個(gè)變量會(huì)跟蹤玩家的精度,第二個(gè)變量會(huì)跟蹤箭頭。這個(gè)精度的變量本質(zhì)上是一個(gè)數(shù)字組成的列表,記錄了射出的箭頭數(shù)和被擊中的獾的數(shù)量。之后我們會(huì)用到這些信息用來(lái)計(jì)算射擊精確度。接下來(lái),在#3局部結(jié)尾加載箭頭的圖片。1arrow=pygame.image.load("resources/images/bullet.png")現(xiàn)在,當(dāng)玩家點(diǎn)擊鼠標(biāo),就需要射出一支箭頭。在#8局部加上以下代碼:1234ifevent.type==pygame.MOUSEBUTTONDOWN:
position=pygame.mouse.get_pos()
acc[1]+=1
arrows.append([math.atan2(position[1]-(playerpos1[1]+32),position[0]-(playerpos1[0]+26)),playerpos1[0]+32,playerpos1[1]+32])這段代碼會(huì)檢查是否鼠標(biāo)被點(diǎn)擊了,如果點(diǎn)擊了,它就會(huì)得到鼠標(biāo)的位置并且根據(jù)玩家和光標(biāo)的位置計(jì)算出箭頭旋轉(zhuǎn)角度。旋轉(zhuǎn)角度的值存放在arrows這個(gè)數(shù)組里。接下來(lái),你需要真的在屏幕上畫(huà)出箭頭來(lái)。在#6局部加上以下代碼:12345678910111213#6.2-Drawarrowsforbulletinarrows:
index=0
velx=math.cos(bullet[0])*10
vely=math.sin(bullet[0])*10
bullet[1]+=velx
bullet[2]+=vely
ifbullet[1]<-64orbullet[1]>640orbullet[2]<-64orbullet[2]>480:
arrows.pop(index)
index+=1
forprojectileinarrows:
arrow1=pygame.transform.rotate(arrow,360-projectile[0]*57.29)
screen.blit(arrow1,(projectile[1],projectile[2]))vely和velx的值是根據(jù)三角定理算出來(lái)的。10是箭頭的速度。if表達(dá)式是檢查箭頭是否超出了屏幕范圍,如果超出,就刪除這個(gè)箭頭。第二個(gè)for表達(dá)式是循環(huán)來(lái)把箭頭根據(jù)相應(yīng)的旋轉(zhuǎn)畫(huà)出來(lái)。試著運(yùn)行游戲。當(dāng)你點(diǎn)擊鼠標(biāo)時(shí),你的兔子就可以射出剪頭了:D六、增加游戲的反派精靈好吧,現(xiàn)在有了城堡,并且你有一個(gè)英雄可以移動(dòng)和射出箭頭。還差什么呢?攻擊城堡的敵人可以被英雄用箭頭射了!在這一步,你將會(huì)隨機(jī)創(chuàng)立出一些獾沖向城堡。在游戲的進(jìn)程中會(huì)有越來(lái)越多的獾冒出來(lái)。所以,我們來(lái)列個(gè)接下來(lái)要做的事情的清單。添加一個(gè)壞蛋的列表更新壞蛋的信息,并且檢查它們是否超出屏幕范圍展示這些壞蛋第一步,在#2局部加上一下代碼:1234badtimer=100badtimer1=0badguys=[[640,100]]healthvalue=194以上的代碼里定義了一個(gè)定時(shí)器,使得游戲里可以經(jīng)過(guò)一段時(shí)間后就新建一只獾。在#3局部結(jié)尾處添加以下代碼:12badguyimg1=pygame.image.load("resources/images/badguy.png")badguyimg=badguyimg1第一行跟前面加載圖片的代碼很相似。第二行聲明了一個(gè)圖片的復(fù)制。接下來(lái),你需要更新并且顯示這些壞蛋了。在#6.2局部加上以下代碼:12345678910111213141516#6.3-Drawbadgersifbadtimer==0:
badguys.append([640,random.randint(50,430)])
badtimer=100-(badtimer1*2)
ifbadtimer1>=35:
badtimer1=35
else:
badtimer1+=5index=0forbadguyinbadguys:
ifbadguy[0]<-64:
badguys.pop(index)
badguy[0]-=7
index+=1forbadguyin
溫馨提示
- 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年度綠色建材采購(gòu)與施工一體化服務(wù)合同4篇
- 2025年度美容院消防安全管理服務(wù)合同4篇
- 2025年老舊小區(qū)改造工程服務(wù)合同
- 二零二五年度離婚前財(cái)產(chǎn)分割專(zhuān)項(xiàng)合同4篇
- 二零二五年度古建筑泥工修繕工程承包合同8篇
- 2025年個(gè)人房產(chǎn)抵押貸款合同范本2篇
- 2025年度農(nóng)藥產(chǎn)品安全評(píng)價(jià)與風(fēng)險(xiǎn)評(píng)估合同
- 2025年度個(gè)人名下房產(chǎn)出售合同范本2篇
- 課題申報(bào)參考:民國(guó)時(shí)期華東地區(qū)傳統(tǒng)體育史料搜集與輯錄研究
- 課題申報(bào)參考:面向能源結(jié)構(gòu)轉(zhuǎn)型的摻氫天然氣負(fù)荷預(yù)測(cè)及其儲(chǔ)能布局優(yōu)化研究
- 2024年全國(guó)職業(yè)院校技能大賽高職組(研學(xué)旅行賽項(xiàng))考試題庫(kù)(含答案)
- 2025年溫州市城發(fā)集團(tuán)招聘筆試參考題庫(kù)含答案解析
- 2025年中小學(xué)春節(jié)安全教育主題班會(huì)課件
- 2025版高考物理復(fù)習(xí)知識(shí)清單
- 除數(shù)是兩位數(shù)的除法練習(xí)題(84道)
- 2025年度安全檢查計(jì)劃
- 2024年度工作總結(jié)與計(jì)劃標(biāo)準(zhǔn)版本(2篇)
- 全球半導(dǎo)體測(cè)試探針行業(yè)市場(chǎng)研究報(bào)告2024
- 反走私課件完整版本
- 2024年注冊(cè)計(jì)量師-一級(jí)注冊(cè)計(jì)量師考試近5年真題附答案
- 四年級(jí)下冊(cè)數(shù)學(xué)知識(shí)點(diǎn)總結(jié)
評(píng)論
0/150
提交評(píng)論