青少年如何使用 Python 開始遊戲開發

oschina發表於2013-08-08

  這是一篇由教程團隊成員Julian Meyer發表的文章,一個12歲的python開發人員。你可以在Google+Twitter上找到他。

  你可曾想過如何建立視訊遊戲嗎?它不像你想象的那麼複雜!

  在本教程中,您將建立一個簡單的遊戲叫做兔子和獾,在這裡作為英雄的兔子要保衛城堡反擊進攻的獾群。:O

  寫這個遊戲,你將使用Python。不,我指的並不是一條大蛇!:]

  Python是一種計算機程式語言。我們就本教程選擇Python,Python是一種易於上手、有趣而且很容易學的語言。

  如果你剛接觸Python,開始之前先檢出這本書 - 深入Python:怎樣像電腦科學家一樣思考,這將使你提升速度。

  然後回到這裡,準備開始—— 有一場小兔子和獾之間的戰爭即將發生。繼續閱讀將加入戰爭吧!

  開始: 安裝Python

  如果你想在Windows電腦上嘗試本教程,你需要安裝Python,記住要安裝2.7.3版本而不是3.3.0!執行完安裝程式後,在開始選單程式資料夾中會有IDLE,執行IDL。

  如果你使用Mac,Python已經安裝了!只需開啟一個終端(/Applications/Utilities/Terminal.app),輸入python然後按回車。

  注意:如果你從python.org安裝Python(如果你想獲得PyGame需要這樣做),那麼你也需要在Mac上進入IDLE。它應該在“Applications/Python 2.7”資料夾內。

  如果操作正確的話,你將會看到類似輸出:

Python 2.7.3 (v2.7.3:70274d53c1dd, Apr  9 2012, 20:52:43) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>

  注意:如果你想退出Python提示窗(三個尖括號提示:>>>),你可以通過在提示窗裡輸入exit()或按Ctrl+D。

  一旦你在Python提示窗了,測試Python是否正常工作的話輸入print 1+1,然後按回車或換行,它將輸出2。你已經寫了你的第一個Python程式。

  現在你知道Python工作正常,為使用Python寫遊戲你需要安裝PyGame。

  PyGame是一個使寫遊戲變簡單的Python庫,它提供如影像處理、聲音回放等你可以很容易新增都遊戲中的功能。

  到這來下載你係統適合的PyGame,確認你下載的是一個Python2.7版本。

  注意:從上面連結下載的PyGame安裝檔案不能與Apple的Mac上預設安裝的Python一起工作,為使用PyGame你需要從python.org上下載安裝Python,或者你可以通過MacPorts安裝Python和PyGame。

  要檢驗PyGame安裝是否正確的話,開啟IDLE或通過終端執行Python,在Python提示符處輸入import pygames,如果回車後沒有輸出的話你安裝成功了。

  如果,另一方面,輸出了下附類似錯誤,PyGame沒有正確安裝。

Python 2.7.2 (default, Jun 20 2012, 16:23:33) 
[GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pygame
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named pygame
>>>

  如果你遇到類似的錯誤,在論壇上發出來我將幫助你讓它正常。

  從檔案執行Python程式碼

  雖然你可以在Python提示符下執行短的Python程式碼,但如果你工作在一個大的程式(比如遊戲)裡,你可能想要將你的程式碼儲存到一個檔案,這樣你就不必一遍又一遍地鍵入它了。

  有幾種方法可以執行Python程式檔案。一種方法是使用一個純文字編輯器,不如記事本(Windows)或TextEdit(Mac)。開啟一個新的文字檔案,輸入你的Python程式碼(像print 1 + 1)。然後儲存它為asXXX.py(XXX可以是任何描述性的檔名稱)。

  使用Windows的話,通過雙擊這個檔案來執行它。在Mac上,開啟終端,輸入python,然後拖動你儲存的檔案到終端視窗並按Enter。

  另一種方法是鍵入程式碼類到IDLE,也就是你在這個教程中需要做的方式。執行IDLE - 只需在終端輸入IDLE。 然後選擇文,然後選擇File\New Window,會出現一個你可以輸入程式碼的文字編輯器視窗。你可以通過File\Save儲存你更改的程式碼,通過執行Run\Run Module(F5)執行程式碼。

  請注意執行選單隻在你已有一個檔案在編輯器視窗開啟時有效。

  新增遊戲資源

  你幾乎已經可以開始建立你的遊戲了。但沒有一些震撼的影像和聲音效果的遊戲又算什麼呢?我已經收集了遊戲所需要的所的圖形和聲音效果並把它們壓縮成了一個ZIP存檔,你可以在這裡下載。

  下載檔案後,在你的硬碟上建立一個遊戲使用的資料夾,將resources資料夾解壓到這個資料夾中,這樣你的遊戲資料夾有了名為resources的子資料夾,各種資源在resources資料夾裡面分組顯示如下:

  兔子和獾的遊戲你已經準備就緒。:]

 第一步:(編寫簡單的)Hello Bunny(嘿,兔子)

  執行IDLE開發環境,向上一節提到的那樣,開啟一個新的文字編輯窗。在編輯窗鍵入以下程式碼:

# 1 - Import library
import pygame
from pygame.locals import *
 
# 2 - Initialize the game
pygame.init()
width, height = 640, 480
screen=pygame.display.set_mode((width, height))
 
# 3 - Load images
player = pygame.image.load("resources/images/dude.png")
 
# 4 - keep looping through
while 1:
    # 5 - clear the screen before drawing it again
    screen.fill(0)
    # 6 - draw the screen elements
    screen.blit(player, (100,100))
    # 7 - update the screen
    pygame.display.flip()
    # 8 - loop through the events
    for event in pygame.event.get():
        # check if the event is the X button 
        if event.type==pygame.QUIT:
            # if it is quit the game
            pygame.quit() 
            exit(0)

  把它儲存到你的遊戲目錄下(即資源子目錄)並命名為itgame.py。

  讓我們逐段分析以上程式碼:

  1. 匯入PyGame庫。這一步讓你在你的程式中使用來自庫中的函式。

  2. 初始化PyGame並設定顯示視窗。

  3. 載入你想要給bunny使用的圖片。

  4. 迴圈執行以下縮排的程式碼。

  5. 在繪圖前,將螢幕填充成黑色。

  6. 將之前載入進來的bunny圖片以100*100的大小顯示在螢幕上。

  7. 更新螢幕。

  8. 檢查任何新事件如果有的話,否則轉到退出命令,退出程式。

  注意:根據PyGame的文件,你不需要呼叫pygame.quit()因為解析器關閉時會自動呼叫它。然而,至少在Mac OS上,這個遊戲會在退出時掛起除非pygame.quite被呼叫。

  如果現在執行這段程式碼(在Idle選單欄點選 “Run\Run Module"),你應該可以看到一個如下所示的螢幕:

青少年如何使用 Python 開始遊戲開發

  耶,兔子就顯示在螢幕上了,並準備做動作!

  但是隻有一隻兔子顯示在一個黑漆漆的螢幕上,這個遊戲看起來很嚇人且很孤單。接下來要做的就是稍微美化一下咯。

 第二步:新增布景

  我們首先給遊戲場景新增背景圖片,可以通過呼叫一組screen.blit()來完成背景新增。

  在程式碼的#3 小節,載入角色影像之後新增下面的程式碼:

grass = pygame.image.load("resources/images/grass.png")
castle = pygame.image.load("resources/images/castle.png")

  這些程式碼載入圖片然後賦給指定的變數,然後把它們畫到螢幕上。但如果你檢查草地的圖片,你會發現它沒有覆蓋整個640 x 480的螢幕,所以你必須平鋪使草地的圖片完全覆蓋螢幕。

  在#6小節的開始(把兔子畫在螢幕上之前),新增以下程式碼到game.py:

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 ))

  正如你所見,首先把x座標通過for迴圈遞增,在這個迴圈中再把y座標迴圈遞增,並且將草地畫在使用迴圈生成的x、y座標上。緊接著的一組程式碼只是將城堡畫在螢幕上。

  你現在執行這個程式,你會看到像如下的結果:

  從現在開始,變得好看點了! :]

 第三步:讓兔子動起來

  下面你需要新增一些真正的遊戲元素,比如讓兔子響應鍵盤的按鍵。

  要做到這一點,你需要實現好一個方法記錄哪一個鍵在某一時刻被按下。你可以簡單的使用一個陣列儲存在遊戲需要使用的鍵的按下狀態。

  新增如下程式碼到game.py的#2小節結束(在你設了螢幕高和寬度之後):

keys = [False, False, False, False]
playerpos=[100,100]

  這段程式碼是非常明瞭。陣列keys按WASD的順序記錄它們的狀態。陣列的每個元素對應一個鍵,第一個是W,第二個是A等等。

  playerpos變數定義程式開始繪製遊戲角色的起始位置。因為這個遊戲將移動遊戲角色到不同的位置,設定一個儲存角色位置的變數,然後便可以簡單地將角色繪製到這個位置。

  現在你需要修改現有的程式碼來繪製角色,使用新的playerpos變數,將# 6的程式:

screen.blit(player, (100,100))

  改為:

screen.blit(player, playerpos)

  接下來,基於哪些按鍵被按下更新鍵陣列,PyGame通過新增event.key事件使檢測按鍵很容易實現。

  在# 8檢測event.type==pygame.QUIT之後,新增這些程式碼(如果有塊縮排的話使用與pygame.QUIT相同的縮排級):

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語句拆分也不是很複雜的。

  首先你要檢測一是否有鍵被按下或釋放,然後你需要檢測哪個鍵被按下或者釋放,如果被按下或者釋放的鍵是你要使用的鍵,根據鍵值更新相應的鍵變數。

  最後,你需要更新playerpos變數作為鍵按下的響應,這太簡單了。

  將下附程式碼新增到game.py的末尾(使用相同的縮排級,使用和for迴圈相同的縮排級)

# 9 - Move player
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鍵,哈哈,起效了!

 第四步: 旋轉兔子

  是的,你的兔子現在可以隨著你的按鍵移動,但用滑鼠來旋轉兔子朝向到你選擇的方向豈不更酷,所以它不是所有時間都朝向一個方向。使用三角函式來實現,這很簡單。

  看一下下面的圖解:

  上圖中,如果(5,3)是兔子的位置,(2,4)是當前滑鼠的位置,你可以通過對兩點間距離的不同應用atan2三角函式獲得旋轉角度(z)。當然,一旦你知道旋轉角,你可以輕鬆相應地旋轉兔子。:]

  如果你對這部分有點困惑,不要擔心,你依然可以繼續。但這就是你應該在數學課上用功的原因!:]在遊戲程式設計時你會一直使用這個東西。

  現在你需要將這個原理應用到你的遊戲上,為做到這一點,你可以使用PyGameSurface.rotate(度數)函式, 順便說一下,記住,Z值是弧度。:[

  atan2函式在Python的math庫總,所有先在#1結尾處增加:

import math

  然後,將#6最後一行(player.blit這行)替換成下面的程式碼:

# 6.1 - Set player position and rotation
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函式,之後,你將atan2返回的弧度轉化成度數(將弧度乘以近似57.29或360/2π)。

  因為兔子會旋轉,它的位置也將會改變。所以現在計算兔子的新位置並把它顯示在螢幕。

  再次執行這個遊戲。如果你只按了“WASD”鍵,那麼這個遊戲應該和之前完全一樣,但如果你移動你的滑鼠兔子也會隨之旋轉,酷!

 第五步:射擊吧,兔子!

  現在你的兔子已經可以自由活動了,是時候給它新增更多的動作了。讓兔子可以用劍射擊敵人怎麼樣?它可不是隻溫順的兔斯基!

  這一步稍微有點複雜,因為你必須記錄所有射出的劍,更新它們的位置、旋轉並且在它們飛出螢幕後刪除它們。

  首先,在初始化小節(#2小節)的結束新增必要的變數:

acc=[0,0]
arrows=[]

  第一個變數記錄玩家的射擊精度,第二個變數記錄所有的劍。精度變數acc實際上是一個包含射擊數量和命中獾 次數的列表。最後我們可以使用這些資訊來計算精度的百分比。

  接下來,在section #3的末尾載入弓箭影像:

arrow = pygame.image.load("resources/images/bullet.png")

  現在當玩家點選滑鼠,弓箭就要射出。在section #8的末尾加入以下程式碼作為新的事件控制程式碼(event handler):

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])

  這些程式碼檢查是否有滑鼠點選,如果有它會讀取滑鼠位置,並根據玩家的旋轉和指標的位置計算出弓箭的旋轉。這個旋轉儲存在arrows陣列裡。

  接下來你需要真正在螢幕上畫出弓箭了。在section #6.1之後插入以下程式碼:

# 6.2 - Draw arrows
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]))

  運用基本的三角函式可以計算出vely和velx。10是弓箭的速度。if語句檢查弓箭是否飛出邊界,如果是則刪除該弓箭。第二個for語句迴圈過arrows陣列並畫出相應旋轉的弓箭。

  試試執行程式。你應該有一隻兔兔在你點選滑鼠時發射弓箭了。(。☉౪ ⊙。)

 第六步:拿起武器!獾!

  好的,你有了一個城堡和可以移動和射擊的英雄。但少了什麼東西呢?攻擊城堡的敵人!


(炸掉你的城堡!)

  在這個步驟中,你將建立幾隻隨機生成並跑向城堡的獾。隨著遊戲的進展會有越來越多的獾。所以,讓我們做一個列表看看需要做那些工作。

  1、把壞傢伙們新增到一個陣列列表;

  2、每幀每幀的更新這個陣列並檢查他們是否都出現在螢幕上;

  3、顯示這些壞傢伙。

  很容易,是吧:]

  首先,把下面這段程式碼新增到section #2後面:

badtimer=100
badtimer1=0
badguys=[[640,100]]
healthvalue=194

  上面這段程式碼設定了一個計時器(以及其他一些值)以便每過一段時間在遊戲中增加一隻新的獾。你每幀每幀的減少 badtimer直到0, 然後就生成一個新的獾。

  現在把下面這段程式碼新增到section #3後面:

badguyimg1 = pygame.image.load("resources/images/badguy.png")
badguyimg=badguyimg1

  上面程式碼的第一行類似於前面所有的圖片載入程式碼。第二行程式碼設定了一個圖片副本以便於這個壞傢伙能更容易動起來。

  下一步,你必須更新並且顯示這個壞傢伙。把下面程式碼新增到section #6.2之後

# 6.3 - Draw badgers
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]<-64:
		badguys.pop(index)
	badguy[0]-=7
	index+=1
for badguy in badguys:
	screen.blit(badguyimg, badguy)

  仔細的看下這段程式碼,:] 第一行檢查badtimer是否為0,以badtimer至今為止已經執行的次數為基礎,建立一個新的獾並再次設定badtimer。第一個for迴圈更新獾的X座標,並檢查是否在螢幕上。如果不再螢幕上就刪除掉。第二個佛如迴圈繪製所有獾。

  為了在上述程式碼中使用隨機函式,我們必須引入 random 庫:

import random

  最後,在 while 語句後面新增下面一行程式碼用來讓 badtimer 值減1:

badtimer-=1

  再次執行遊戲來測試上述程式碼,現在你將看到真正的遊戲,你可以發射、移動、轉向,而且獾也嘗試跑向你。

  但等等,為什麼不是獾炸燬這座城堡嗎?馬上搞定!

  在#6.3小節中每一個迴圈前的 index += 1 之前新增如下程式碼:

# 6.3.1 - Attack castle
badrect=pygame.Rect(badguyimg.get_rect())
badrect.top=badguy[1]
badrect.left=badguy[0]
if badrect.left<64:
	healthvalue -= random.randint(5,20)
	badguys.pop(index)
# 6.3.3 - Next bad guy

  這段程式碼非常簡單,如果獾的x座標值小於64,則刪除這傢伙然後隨機遞減5到20點的城堡的生命值。(在後面你可以顯示生命值到螢幕上)

  現在你構建並執行程式,你將看到一堆獾攻擊城堡後消失。雖然你不能看到但獾確實降低了城堡的生命值。

 第七步:獾與箭的碰撞

  現在獾可以攻擊你的城堡但你的箭卻對它們沒有任何效果!兔子該如何保護自己的家園?

  是時候讓箭可以殺死獾,你才可以保護你的城堡贏得遊戲!首先,你必須迴圈檢查每個壞蛋,在檢查時以需要迴圈檢查所有的箭是不是和獾碰撞了。如果箭碰到了獾則刪除箭和獾,並且遞增命中值。

  在#6.3.1小節後新增如下程式碼:

#6.3.2 - Check for collisions
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語句後是PyGame內建的檢查兩個矩形是否相交的函式。其他語句只是按上面解釋執行。

  如果你現在執行程式,你會發現已經可以射擊並殺死獾了。

 第八步:新增生命值和時鐘顯示

  遊戲現在進展良好,有攻擊者和守衛者。現在你還需要一種方式顯示分數,看看這些兔子幹得怎麼樣。

  最簡單的方式是新增一個HUD(平視顯示器)顯示當前城堡的健康狀況。也可以新增一個時鐘顯示城堡被保護了多久。

  首先新增時鐘,在#7小節前新增如下程式碼:

# 6.4 - Draw clock
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)

  上面程式碼簡單的使用PyGame預設字型建立字型並設定尺寸為24。然後使用字型渲染時間到表面上。之後廣西被定位並繪製到螢幕上。

  下一步新增生命條。在繪製生命條之前你需要載入它的背景圖。新增如下程式碼到#3小節結束:

healthbar = pygame.image.load("resources/images/healthbar.png")
health = pygame.image.load("resources/images/health.png")

  第一個是紅色圖用來鋪滿生命條。第二個綠色圖顯示當前生命值。

  現在新增如下程式碼到#6.4節(你上一步新增的)之後來將生命條畫到螢幕上:

# 6.5 - Draw health bar
screen.blit(healthbar, (5,5))
for health1 in range(healthvalue):
	screen.blit(health, (health1+8,8))

  上面的程式碼首先畫出全紅色的生命條,然後根據城堡的剩餘的生命繪製綠色生命條。

  現在你構建並執行程式,你可以看到時鐘和生命條。

 第九步:判斷輸贏

  這是什麼?如果你玩得足夠久,即使你的命令值降到了0,遊戲還是繼續!不僅僅如此,你也還可以繼續射擊獾。這應該行不通的,但現在就是這樣。你需要新增某種贏/輸形式的場景讓這個遊戲值得玩。

  所以我們現在新增輸贏條件和各自的畫面。你可以退出主遊戲迴圈並進入輸贏介面的迴圈。在輸贏迴圈中,你可以檢查使用者是輸了還是贏了,並顯示相應的介面。

  下面是一個判斷輸贏的基本方法:

  如果超過了時間(90000毫秒或90秒):

  • 停止執行遊戲
  • 設定遊戲的結果為贏了

  如果城堡被摧毀了:

  • 停止執行遊戲
  • 設定遊戲結果為輸了

  計算準確度的方法。

  注:使用acc[0]*1.0 只是將acc[0]轉換成float浮點型別,如果你不這麼轉換,則除法操作將返回一個整數值比如1或2而不是1.5。

  將下面的程式碼加到game.py末尾:

    #10 - Win/Lose check
    if pygame.time.get_ticks()>=90000:
        running=0
        exitcode=1
    if healthvalue<=0:
        running=0
        exitcode=0
    if acc[1]!=0:
        accuracy=acc[0]*1.0/acc[1]*100
    else:
        accuracy=0
# 11 - Win/lose display        
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()

  這是截至目前最長的程式碼塊,但不是最複雜的。

  第一個if語句檢查是否到時間,第二個檢查城堡是否被摧毀,第三個計算你的準確率。之後,一個快速的if語句檢查你是勝利還是失敗了,並顯示正確的影像。

  當然,如果你想顯示勝利與失敗的螢幕影像,那麼這些影像必須先被載入。將下面的程式碼新增到# 3結束的地方:

gameover = pygame.image.load("resources/images/gameover.png")
youwin = pygame.image.load("resources/images/youwin.png")

  另一點,更改#4處:

# 4 - keep looping through
while 1:
    badtimer-=1

  更改為:

# 4 - keep looping through
running = 1
exitcode = 0
while running:
    badtimer-=1

  running變數跟蹤遊戲是否結束,exitcode變數跟蹤玩家是贏了還是輸了。

  再次執行遊戲,現在你可以嘗試勝利或死亡!酷!:]

 第10步: 免費的音樂和聲音效果!

  這個遊戲看起來相當棒,可是有聲音嗎?是不是太安靜了點呢?增加一點點音效會讓整個遊戲的感覺變得更棒。

  PyGame 載入並播放聲音的方法非常簡單。首先你需要初始化混音器,程式碼如下:

pygame.mixer.init()

  然後載入要播放的聲音,並設定音量大小:

# 3.1 - Load audio
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)

  最上程式碼中大多數是簡單載入音訊檔案和配置的音訊音量,但要注意pygame.mixer.music.load這一行——這一行載入遊戲的背景音樂,下一行設定背景音樂一直重複。

  注意音訊配置。:] 現在,你所需要做的就是按需要播放各種聲音效果。像下面每段註釋程式碼那樣做:

# section 6.3.1 after if badrect.left<64:
hit.play()
# section 6.3.2 after if badrect.colliderect(bullrect):
enemy.play()
# section 8, after if event.type==pygame.MOUSEBUTTONDOWN:
shoot.play()

  多次執行遊戲,你會發現你現在有碰撞的背景音樂和射擊的聲音效果,遊戲讓人感覺更逼真了!:]

 從哪裡開始?

  你應該為自己感到自豪:你剛剛建立完成一個有趣的遊戲,裡面充滿了音樂,音效,一個殺手兔子,神風特攻隊獾和更多東西。我告訴你你可以做到!:]

  你可以在這裡下載最終的遊戲原始碼。

  這時,在遊戲中隨意擴充你的創造力!也許可以試著換成與你自己的繪畫風格,或新增不同的武器或不同型別的怪物到遊戲中!

  在完成這個教程中你有問題或評論嗎? 如果有,請加入我們論壇的討論中! 我很期待你的來信。

  原文地址:beginning-game-programming-for-teens-with-python

相關文章