(游戲展示) 愛玩游戲的你是不是也經(jīng)常想要自己動手制作游戲呢,?沒問題,!今天我們就手把手教你用Python寫出有趣的小游戲! 不管你是學生還是家長,,我們都希望可以一起來學習計算機思維,。如果你之前有關(guān)注我們公眾號的話,相信你已經(jīng)了解到為什么Python是最適合青少年學習的編程語言(點擊藍色文字自動跳轉(zhuǎn)),。 我們今天要制作的小游戲是Bunnies vs. Badgers (兔獾大作戰(zhàn)),。游戲中的兔子通過射箭抵御獾的進攻,從而保衛(wèi)自己的四個堡壘,。 (最終效果) 準備工作:安裝Python 在這篇文章中,,我們使用的是Python2.7 Windows32位下載地址:https://www./ftp/python/2.7.13/python-2.7.13.msi Windows64位下載地址:https://www./ftp/python/2.7.13/python-2.7.13.amd64.msi Mac下載地址:https://www./ftp/python/2.7.13/python-2.7.13-macosx10.6.pkg 成功安裝后,你將在“所有程序”中找到IDLE, 這是Python的集成開發(fā)學習環(huán)境(Integrated Development and Learning Environment),。運行IDLE就可以開始愉快地寫碼了,! 如果你要想要測試一下Python是否正常運行,,可以試著輸入print 1+1并按回車鍵。如果輸出的是2,,那么恭喜你,!你的Python是正常的! 接下來你需要安裝PyGame來用Python做游戲,。 PyGame是Python的一個庫(library),。Python有很多這樣的庫,庫內(nèi)自帶能完成各種功能的許多函數(shù)(functions),。例如,,我們可以使用PyGame導入游戲的圖片,音頻等 —— PyGame讓制作Python小游戲變得更簡單了,! PyGame Windows下載地址:http:///ftp/pygame-1.9.1.win32-py2.7.msi PyGame Mac 下載地址:http:///ftp/pygame-1.9.1release--32bit-py2.7-macosx10.3.dmg 為了測試PyGame是否正常運行,,你可以打開IDLE并輸入import pygame,如果沒有出現(xiàn)任何提示,,PyGame就安裝成功了,! 運行文件中的Python代碼 在之前的測試中,我們使用了print和import寫了兩行短代碼,,但如果我們要寫一些比較大的程序(比如游戲),,就需要把代碼保存在一個文件里。在IDLE中,,只要點擊File – New Window新建文件就能將你寫的代碼保存在這個文件中,。 添加游戲素材 我們馬上就可以開始寫游戲了!不過在此之前,,我們需要一些圖像和音頻素材,。你可以拉到文章最后,掃碼關(guān)注碼趣學院獲取素材壓縮包,! 解壓縮文件后,,你將得到一個名為resources 的文件夾,所有的音頻(audio)和圖像(images)文件已經(jīng)分類放好了,!你需要做的是為你的游戲創(chuàng)建一個文件夾,,如上圖的PyGame,然后將resources文件夾放在PyGame文件夾內(nèi),。 我們現(xiàn)在可以開始做小兔子和獾了,! 第一步:添加小兔子 首先,打開IDLE并新建窗口,,然后在編輯窗口內(nèi)輸入以下代碼: # 1 – 導入pygame庫 import pygame from pygame.locals import * # 2 – 初始化游戲 pygame.init() width, height = 640, 480 screen=pygame.display.set_mode((width, height)) # 3 – 載入圖片 player = pygame.image.load('resources/images/dude.png') # 4 – 不斷循環(huán) while 1: # 5 – 每次繪圖前清除屏幕 screen.fill(0) # 6 – 繪制屏幕組成元素 screen.blit(player, (100,100)) # 7 – 刷新屏幕 pygame.display.flip() # 8 – 循環(huán)事件 for event in pygame.event.get(): # 檢驗事件是否是X鍵 if event.type==pygame.QUIT: # 如果是的話就退出游戲 pygame.quit() exit(0) 將寫好的代碼文件保存在你的PyGame文件夾中(我們剛剛創(chuàng)建的),,并將文件命名為game.py。 現(xiàn)在讓我們一步步分析上面的代碼: 1. 導入pygame庫 這一步讓你可以直接使用pygame庫內(nèi)的函數(shù)來實現(xiàn)各種功能(如導入圖像,,音頻等),。 2. 初始化游戲 初始化游戲并設(shè)置一個640 x 480的窗口。 3. 載入圖片 載入小兔子的圖片,。 4. 不斷循環(huán) 循環(huán)執(zhí)行被縮進(前面有空格)的代碼,。 小提示:Python使用縮進來區(qū)分代碼塊,所以縮進在Python中十分重要,。 5. 每次繪圖前清除屏幕 每次繪圖前先用黑色填充整個窗口,。 6. 繪制屏幕組成元素 在坐標x=100,y=100的地方放上小兔子,。 7. 刷新屏幕 8. 循環(huán)事件 檢查是否有新的事件(event),,在這里,這個事件是退出(quit)命令,。如果有的話,,退出程序。 小提示:其實根據(jù)PyGame規(guī)定,,你不需要使用pygame.quit()就能夠退出程序,,因為當編譯器關(guān)閉的時候程序會自動關(guān)閉。但是在Mac中,,如果不用pygame.quit(),,游戲不會自動停止。 如果你執(zhí)行上面的代碼(在IDLE的菜單欄中點Run或Run Module),,你將會看到一個類似下圖的窗口: 我們可以看到,,小兔子已經(jīng)在屏幕上做好準備了! 但是這一片黑黑的屏幕看上去略嚇人,,而且屏幕上孤零零的一只小兔子似乎十分孤獨…讓我們加點背景和其他東西吧~ 第二步:制作游戲場景 現(xiàn)在我們要制作游戲場景,,這只需要多用幾次screen.blit()就可以做到。 在代碼的第三部分 (#3 )載入小兔子圖片后,,加上下面兩行代碼: grass = pygame.image.load('resources/images/grass.png') castle = pygame.image.load('resources/images/castle.png') 這兩行代碼載入了兩張不同的圖片并把圖片分別放入了不同的變量(variable)中?,F(xiàn)在這兩張圖片就能出現(xiàn)在屏幕上了。不過你會發(fā)現(xiàn),,由grass.png載入的草坪背景不能覆蓋整個640 x 480的窗口,。這意味著你必須調(diào)整圖片來完全覆蓋窗口。 在第六部分(#6)的開頭添加以下代碼(在確定小兔子位置之前):
for x in range(width/grass.get_width()+1): for y in range(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)) 讓我們一起來看看上面的代碼~for語句先使用x進行循環(huán),。在這一層循環(huán)中,,代碼又通過y進行內(nèi)層循環(huán),然后把草坪圖片放在循環(huán)得到的x, y 坐標上,。接下來的幾行代碼在屏幕上放置堡壘(castle),。 如果你現(xiàn)在執(zhí)行程序,你將看到下圖的場景: 是不是比剛才好多了,?:) 第三步:讓小兔子動起來,! 接下來我們要真正開始加入游戲元素啦,!比如通過按鍵盤讓小兔子動起來。 首先,,我們需要讓程序追蹤玩家什么時候按下了什么鍵,。將下面兩行代碼添加到第二部分(#2)的末尾(在設(shè)定游戲窗口的高和寬之后):
keys = [False, False, False, False] playerpos=[100,100] 在這兩行代碼中,我們創(chuàng)建了一個名為keys的數(shù)組(array),,其中有4個False值,,每個值對應W、A,、S,、D中的一個按鍵。 變量playerpos對應小兔子位置坐標,。因為在游戲進行的過程中,,小兔子會不斷移動,所以用一個變量儲存小兔子的位置更加方便,。 現(xiàn)在,,我們要修改現(xiàn)有的代碼,把小兔子圖片放在playerpos對應的坐標上,。把第六部分(#6)中的這行代碼: screen.blit(player, (100, 100)) 改為: screen.blit(player, playerpos) 接下來,,我們要使用PyGame自帶的event.key函數(shù)來檢測玩家按下了什么鍵,并相應地將keys內(nèi)的False值改為True,。
在第八部分(#8)的最后,,緊接著event.type == pygame.QUIT后,加上這些代碼(縮進和pygame.QUIT的if代碼塊相同):
if event.type == pygame.KEYDOWN: if event.key==K_w: keys[0]=True elif event.key==K_a: keys[1]=True elif event.key==K_s: keys[2]=True elif event.key==K_d: keys[3]=True if event.type == pygame.KEYUP: if event.key==pygame.K_w: keys[0]=False elif event.key==pygame.K_a: keys[1]=False elif event.key==pygame.K_s: keys[2]=False elif event.key==pygame.K_d: keys[3]=False 哇哦,!這里有好多行代碼呢,!不過如果我們將這些代碼拆分來看,其實并不是太難,。
首先,,我們要看看是否(if)有鍵被按下或者松開了,接著檢測是哪個鍵被按下或者松開了,。如果檢測到的鍵是W,、A、S,、D中的某一個,,就相應更新keys數(shù)列中的值。
接著,,你需要根據(jù)玩家按下的鍵更新playerpos變量,,這個非常簡單,只需要把下面代碼加到目前所寫的代碼最后(使用一個縮進,,和for循環(huán)同一層)
# 9 – 移動小兔子 if keys[0]: playerpos[1]-=5 elif keys[2]: playerpos[1]+=5 if keys[1]: playerpos[0]-=5 elif keys[3]: playerpos[0]+=5 這些代碼檢測哪個鍵被按下了,,并對小兔子的x或y坐標做相應的增減,。
運行游戲,你會看到和剛才相似的場景,。試著按按WASD,,你的小兔子動起來了! 第四步:讓小兔子轉(zhuǎn)向 現(xiàn)在,,你的小兔子可以根據(jù)你的按鍵移動了! 不過現(xiàn)在小兔子一直面向右邊,。如果能用鼠標讓小兔子面對不同的方向,,不就更酷了嗎!我們只需要用一些簡單的三角函數(shù)知識就能解決這個問題,。
讓我們一起看看下面的插圖 如上圖,,假設(shè)(5,3)是小兔子的位置,,(2,,4)是鼠標的位置,旋轉(zhuǎn)角度z就可以由三角函數(shù)atan2來求出(diff x和diff y分別為x,、y坐標的差),。求出旋轉(zhuǎn)角度z以后,我們便可以相應地讓小兔子轉(zhuǎn)向,。
如果你沒有完全理解這部分也沒關(guān)系,,你還是可以繼續(xù)我們的教程!不過我們應該能夠由此意識到數(shù)學在編程中的重要性,。
現(xiàn)在我們要把上面的數(shù)學式用到我們的游戲里了,。我們可以用surface.rotate(degress)函數(shù)來讓小兔子轉(zhuǎn)向。 小提示:用atan2求出的z值是用弧度制(radians)表示的,。 atan2函數(shù)來自Python 的math庫,。所以我們要先把下面這行代碼加到第一部分(#1)開頭: import math 接著,把第六部分(#6)的最后一行(帶有player.blit的這行)改成下面的代碼:
# 6.1 – 設(shè)定小兔子的位置并讓它轉(zhuǎn)向 position = 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) 讓我們一起看看上面的代碼,。首先,,我們要知道鼠標的位置和小兔子的位置。接著,,我們atan2函數(shù)得到角度,。然后,我們要將atan2函數(shù)得到的角度從弧度制(radians)轉(zhuǎn)化為角度制(degrees)(把弧度乘以57.29或者360/2π),。
因為小兔子被轉(zhuǎn)向了,,它的位置也會相應改變。所以最后我們要計算小兔子的新位置,,然后讓小兔子走到屏幕上相應的地方,。
再次運行游戲?,F(xiàn)在,如果你移動你的鼠標,,小兔子也會跟著轉(zhuǎn)動了,! 第五步:小兔子,射擊,! 你的小兔子已經(jīng)能夠轉(zhuǎn)動了,,現(xiàn)在讓我們給它添加一些動作,!讓小兔子在敵人來襲的時候向敵人射箭,!
這一步可能稍微有些復雜,,因為你需要用代碼不停追蹤弓箭的位置,,計算弓箭射出的角度,并在它們超出屏幕范圍時把它們刪掉。
首先,,在第二部分(#2)末尾添加一些要用到的變量:
acc=[0,0] arrows=[] 第一個變量acc檢測玩家的準確度,第二個變量arrows用于追蹤所有弓箭,。變量acc實際上是一個由兩個數(shù)字組成的列表(list),,它記錄了射擊的次數(shù)和被擊中的獾的數(shù)量,我們要用這兩個數(shù)字來計算精確度百分比。
接著,,在第三部分(#3)末尾載入弓箭的圖像: arrow = pygame.image.load('resources/images/bullet.png') 當玩家點擊鼠標的時候,,需要有弓箭射出,。把下面的代碼加到第八部分(#8)末尾來實現(xiàn)這一功能:
if event.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]) 這些代碼檢測玩家是否點擊了鼠標。如果點擊了鼠標,,就記下鼠標的位置,并根據(jù)小兔子的位置和鼠標的位置得出弓箭射出的角度,。這些角度值被記錄在arrows列表中,。
我們現(xiàn)在要讓弓箭顯示在屏幕上,,把下面的代碼加在#6.1末尾:
# 6.2 – 在屏幕上顯示弓箭 for bullet in arrows: index=0 velx=math.cos(bullet[0])*10 vely=math.sin(bullet[0])*10 bullet[1]+=velx bullet[2]+=vely if bullet[1]<-64 or bullet[1]>640 or bullet[2]<-64 or bullet[2]>480: arrows.pop(index) index+=1 for projectile in arrows: arrow1 = pygame.transform.rotate(arrow, 360-projectile[0]*57.29) screen.blit(arrow1, (projectile[1], projectile[2])) 弓箭的x、y坐標velx和vely的值都是用基本的三角函數(shù)計算出來的。10是弓箭的速度。if語句用于檢測弓箭是否超出了窗口范圍,如果超出的話,,就把超出的弓箭從列表中刪去,。第二個for語句對所有弓箭進行循環(huán),,并畫出它們正確的位置和角度,。
現(xiàn)在運行游戲, 你應該能讓小兔子在你點擊鼠標的時候射擊了,! 第六步:獾,,拿起你們的武器! 好,現(xiàn)在我們造出了堡壘,,也有了保衛(wèi)城堡的主角兔子,,是時候讓敵人上場了,!
在這一步中,,我們要讓獾隨機地從不同方向出現(xiàn)并沖向堡壘。在游戲進行的過程中,,獾也會變得越來越多,。我們先列個清單,看看我們需要做些什么: 1. 把敵人獾加到一個列表(list)中 2. 每過一幀就更新一次獾的位置,,并檢測它們是否超出了屏幕范圍 3. 把獾顯示在屏幕上 首先,,把下面的代碼加到第二部分(#2)的末尾:
badtimer=100 badtimer1=0 badguys=[[640,100]] healthvalue=194 上面的代碼設(shè)置了一個計時器和一些其他的變量,所以每隔一段時間,,游戲里就會出現(xiàn)一只新的獾,。每過一幀,計時器badtimer就減少1,,直到它的值變?yōu)?,,這時讓一只新的獾出現(xiàn)在屏幕上。
把下面兩行代碼加到第三部分(#3)末尾:
badguyimg1 = pygame.image.load('resources/images/badguy.png') badguyimg=badguyimg1 第一行和前面其他載入圖片等代碼都差不多,。第二行復制了獾的圖像,。
接著,你需要更新獾的位置,,讓它們相應地顯示在屏幕上,。把下面的代碼加到#6.2后面:
# 6.3 – 在屏幕上顯示獾 if badtimer==0: badguys.append([640, random.randint(50,430)]) badtimer=100-(badtimer1*2) if badtimer1>=35: badtimer1=35 else: badtimer1+=5 index=0 for badguy in badguys: if badguy[0]<> badguys.pop(index) badguy[0]-=7 index+=1 for badguy in badguys: screen.blit(badguyimg, badguy) 第一行代碼檢查badtimer是否為0,如果是的話,,就產(chǎn)生一只新獾,,并根據(jù)badtimer已經(jīng)被重設(shè)的次數(shù)來重新設(shè)置badtimer的值。第一個for循環(huán)更新了獾的x坐標,,檢測獾是否超出了屏幕范圍,,如果超出的話,就把它刪除出列表,。第二個for循環(huán)讓所有在屏幕范圍內(nèi)的獾顯示在屏幕上,。
為了使用上面的random函數(shù),,我們需要用到random庫,。在第一部分末尾加上這行代碼: import random 最后,把這行代碼加到第四部分(#4)的while語句后面,,這樣每一幀結(jié)束后badtimer的值就減少1: badtimer-=1 再次運行游戲,,現(xiàn)在小兔子可以射擊,移動,,轉(zhuǎn)向,,而獾也在試著沖向堡壘。 不過等等…為什么獾碰到堡壘時也沒能摧毀它們呢,?讓我們趕緊補上一些代碼 …
把這些代碼加到#6.3的index+=1之前:
# 6.3.1 – 攻擊堡壘 badrect=pygame.Rect(badguyimg.get_rect()) badrect.top=badguy[1] badrect.left=badguy[0] if badrect.left<> healthvalue -= random.randint(5,20) badguys.pop(index) # 6.3.3 - 下一個敵人 這些代碼比較簡單,。如果某只獾的x坐標小于64,,就刪掉那只獾,并把堡壘的健康值(health value)隨機地減少5到20點(之后,,我們將把健康值顯示在屏幕上),。
現(xiàn)在運行游戲,你應該能看到一群獾沖向堡壘,,并在成功攻擊堡壘后消失,。雖然你現(xiàn)在不能看見,但是堡壘的健康值也在相應地減少,。 第七步:成功擊中敵人,! 獾在攻擊你的堡壘,不過小兔子的弓箭卻傷害不了他們,,這怎么行,?在這一步中我們要讓弓箭能夠射殺敵人。
為了讓弓箭射殺敵人,,我們要對所有的獾進行循環(huán),,并在這一層循環(huán)中,對所有的弓箭進行循環(huán),,檢測這些弓箭是否射到了獾,。如果射到了,就刪掉獾和弓箭,,并給準確度acc加1點,。
在#6.3.1之后加上這些代碼:
#6.3.2 - 檢測弓箭是否射中獾 index1=0 for bullet in arrows: bullrect=pygame.Rect(arrow.get_rect()) bullrect.left=bullet[1] bullrect.top=bullet[2] if badrect.colliderect(bullrect): acc[0]+=1 badguys.pop(index) arrows.pop(index1) index1+=1 在這些代碼中有一點需要注意。If語句中的.colliderect是pygame自帶的函數(shù),,能夠檢測兩個矩形是否相交,。剩下的代碼執(zhí)行的任務就和前面解釋的一樣。
如果你執(zhí)行這個程序,,會發(fā)現(xiàn)小兔子能夠射殺敵人了,! 第八步:顯示健康值和時間 現(xiàn)在游戲進行得很不錯了!我們現(xiàn)在需要不斷記錄分數(shù),,看看小兔子的防守做得怎么樣,。我們可以在屏幕左上角加一個“血槽”來表示現(xiàn)在堡壘的健康值,并在屏幕右上角顯示存活的時間,。
首先把下面的代碼加在第七部分(#7)開頭,,讓屏幕右上角顯示時間:
# 6.4 – 顯示時間 font = pygame.font.Font(None, 24) survivedtext = font.render(str((90000-pygame.time.get_ticks())/60000)+':'+str((90000-pygame.time.get_ticks())/1000%60).zfill(2), True, (0,0,0)) textRect = survivedtext.get_rect() textRect.topright=[635,5] screen.blit(survivedtext, textRect) 上面的代碼設(shè)置了一個字號為24 的新字體,font.render把這個新字體用于屏幕上所有的函數(shù),。接著,,我們把文字放在屏幕右上角(topright)并顯示在屏幕上。 現(xiàn)在我們加“血槽”,。不過在此之前,,我們需要先加載血槽的圖像,。把下面兩行代碼加到第三部分(#3)末尾:
healthbar = pygame.image.load('resources/images/healthbar.png') health = pygame.image.load('resources/images/health.png') 第一張圖片healthbar.png是用于整個血槽的紅色圖片。第二張圖片health.png是用于顯示當下健康值的綠色圖片,。 現(xiàn)在把下面的代碼添加在#6.4之后
# 6.5 – 顯示血槽 screen.blit(healthbar, (5,5)) for health1 in range(healthvalue): screen.blit(health, (health1+8,8)) 這幾行代碼首先顯示出整個紅色血槽,,然后根據(jù)當下的健康值改變綠色的部分。
運行程序,,你現(xiàn)在能夠看到左上角的血槽和右上角的時間,。 第九步:揭曉勝負 到目前為止,即使你的血槽空了,,游戲還能繼續(xù),,你還能繼續(xù)攻擊敵人。為了解決這個問題,,我們需要加上決定勝負的條件,。
為了確定勝負,我們需要退出主循環(huán),,進入勝負循環(huán),。在勝負循環(huán)中,你需要知道玩家是贏了還是輸了,,然后把勝負顯示在屏幕上,。
現(xiàn)在我們確定一下大致的勝負規(guī)則:
如果存活到了規(guī)定時間(90000ms 或 90s): · 停止運行游戲 · 把游戲結(jié)果設(shè)置為1(即勝利)
如果堡壘都被摧毀了 · 停止運行游戲 · 把游戲結(jié)果設(shè)置為0(即失敗) 計算出射擊的精確度acc
把這些代碼加到最后:
#10 – 勝負判斷 if pygame.time.get_ticks()>=90000: running=0 exitcode=1 if healthvalue<> running=0 exitcode=0 if acc[1]!=0: accuracy=acc[0]*1.0/acc[1]*100 else: accuracy=0 # 11 –在屏幕上顯示勝負 if exitcode==0: pygame.font.init() font = pygame.font.Font(None, 24) text = font.render('Accuracy: '+str(accuracy)+'%', True, (255,0,0)) textRect = text.get_rect() textRect.centerx = screen.get_rect().centerx textRect.centery = screen.get_rect().centery+24 screen.blit(gameover, (0,0)) screen.blit(text, textRect) else: pygame.font.init() font = pygame.font.Font(None, 24) text = font.render('Accuracy: '+str(accuracy)+'%', True, (0,255,0)) textRect = text.get_rect() textRect.centerx = screen.get_rect().centerx textRect.centery = screen.get_rect().centery+24 screen.blit(youwin, (0,0)) screen.blit(text, textRect) while 1: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() exit(0) pygame.display.flip() 小提示:其中,,acc[0] * 1.0是把acc[0]轉(zhuǎn)化為浮點數(shù),。如果不將其轉(zhuǎn)化為浮點數(shù)的話,計算的結(jié)果將是整數(shù)而不是小數(shù),。 第一個if語句檢測時間是否用完,。第二個if語句檢測堡壘是否被摧毀。第三個if語句計算玩家的設(shè)計精準度,。在第十一部分(#11)中,,if語句檢測玩家的勝負情況并顯示相應的圖片。
為了顯示與勝負相關(guān)的圖片,,我們需要先加載這些圖片,。把下面的兩行代碼加到第三部分(#3)末尾:
gameover = pygame.image.load('resources/images/gameover.png') youwin = pygame.image.load('resources/images/youwin.png') 最后,把第四部分(#4)中的:
# 4 – 不斷循環(huán) while 1: badtimer-=1 改為: # 4 – 不斷循環(huán) running = 1 exitcode = 0 while running: badtimer-=1 變量running判定游戲是否結(jié)束,,變量exitcode判定玩家是贏了還是輸了,。
再次執(zhí)行游戲,,現(xiàn)在我們能知道輸贏情況了,! 第十步:音樂和音效 最后,讓我們給游戲加點音樂和音效吧,!
首先,,我們需要把下面這行代碼加到第二部分(#2)末尾: pygame.mixer.init() 然后把這些代碼加到第三部分(#3)末尾來加載音效并設(shè)置音量:
# 3.1 – 載入音頻 hit = pygame.mixer.Sound('resources/audio/explode.wav') enemy = pygame.mixer.Sound('resources/audio/enemy.wav') shoot = pygame.mixer.Sound('resources/audio/shoot.wav') hit.set_volume(0.05) enemy.set_volume(0.05) shoot.set_volume(0.05) pygame.mixer.music.load('resources/audio/moonlight.wav') pygame.mixer.music.play(-1, 0.0) pygame.mixer.music.set_volume(0.25) 上面這塊代碼大部分都是用于加載音效文件以及設(shè)置音量的,。不過注意pygame.mixer.music.load這一行 —— 這行用于加載背景音樂,它的下一行則是讓音樂不斷重復播放,。
現(xiàn)在,,我們需要讓音效根據(jù)我們的需要進行播放。根據(jù)注釋(#后)的內(nèi)容把代碼放在相應的位置:
# 放在# 6.3.1 if badrect.left<> hit.play() # 放在#6.3.2 if badrect.colliderect(bullrect):之后 enemy.play() # 放在#8, if event.type==pygame.MOUSEBUTTONDOWN:之后 shoot.play() 運行游戲,,現(xiàn)在我們有背景音樂和各種音效了,! 大功告成! 你該為自己感到驕傲,!你剛剛做了一個帶有音樂,,音效,防御者,,攻擊者和其他各種有趣元素的游戲,!
當然,你也可以在這些代碼的基礎(chǔ)上加入自己的創(chuàng)新,!比如把獾換成狐貍,,或者升級小兔子的武器等等。
|
|