一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

青少年如何使用 Python 開(kāi)始游戲開(kāi)發(fā)

 騰飛工作室 2013-11-23

    這是一篇由教程團(tuán)隊(duì)成員Julian Meyer發(fā)表的文章,一個(gè)12歲的python開(kāi)發(fā)人員。你可以在Google+Twitter上找到他。

  你可曾想過(guò)如何創(chuàng)建視頻游戲嗎?它不像你想象的那么復(fù)雜!

  在本教程中,您將創(chuàng)建一個(gè)簡(jiǎn)單的游戲叫做兔子和獾,在這里作為英雄的兔子要保衛(wèi)城堡反擊進(jìn)攻的獾群。:O

  寫這個(gè)游戲,你將使用Python。不,我指的并不是一條大蛇!:]

  Python是一種計(jì)算機(jī)編程語(yǔ)言。我們就本教程選擇Python,Python是一種易于上手、有趣而且很容易學(xué)的語(yǔ)言。

  如果你剛接觸Python,開(kāi)始之前先檢出這本書 - 深入Python:怎樣像計(jì)算機(jī)科學(xué)家一樣思考,這將使你提升速度。

  然后回到這里,準(zhǔn)備開(kāi)始—— 有一場(chǎng)小兔子和獾之間的戰(zhàn)爭(zhēng)即將發(fā)生。繼續(xù)閱讀將加入戰(zhàn)爭(zhēng)吧!

  開(kāi)始: 安裝Python

  如果你想在Windows電腦上嘗試本教程,你需要安裝Python,記住要安裝2.7.3版本而不是3.3.0!運(yùn)行完安裝程序后,在開(kāi)始菜單程序文件夾中會(huì)有IDLE,運(yùn)行IDL。

  如果你使用Mac,Python已經(jīng)安裝了!只需打開(kāi)一個(gè)終端(/Applications/Utilities/Terminal.app),輸入python然后按回車。

  注意:如果你從python.org安裝Python(如果你想獲得PyGame需要這樣做),那么你也需要在Mac上進(jìn)入IDLE。它應(yīng)該在“Applications/Python 2.7”文件夾內(nèi)。

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

1
2
3
4
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提示窗(三個(gè)尖括號(hào)提示:>>>),你可以通過(guò)在提示窗里輸入exit()或按Ctrl+D。

  一旦你在Python提示窗了,測(cè)試Python是否正常工作的話輸入print 1+1,然后按回車或換行,它將輸出2。你已經(jīng)寫了你的第一個(gè)Python程序。

  現(xiàn)在你知道Python工作正常,為使用Python寫游戲你需要安裝PyGame。

  PyGame是一個(gè)使寫游戲變簡(jiǎn)單的Python庫(kù),它提供如圖像處理、聲音回放等你可以很容易添加都游戲中的功能。

  到這來(lái)下載你系統(tǒng)適合的PyGame,確認(rèn)你下載的是一個(gè)Python2.7版本。

  注意:從上面鏈接下載的PyGame安裝文件不能與Apple的Mac上默認(rèn)安裝的Python一起工作,為使用PyGame你需要從python.org上下載安裝Python,或者你可以通過(guò)MacPorts安裝Python和PyGame。

  要檢驗(yàn)PyGame安裝是否正確的話,打開(kāi)IDLE或通過(guò)終端運(yùn)行Python,在Python提示符處輸入import pygames,如果回車后沒(méi)有輸出的話你安裝成功了。

  如果,另一方面,輸出了下附類似錯(cuò)誤,PyGame沒(méi)有正確安裝。

1
2
3
4
5
6
7
8
Python 2.7.2 (default, Jun 20 201216: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 1in <module>
ImportError: No module named pygame
>>>

  如果你遇到類似的錯(cuò)誤,在論壇上發(fā)出來(lái)我將幫助你讓它正常。

  從文件運(yùn)行Python代碼

  雖然你可以在Python提示符下運(yùn)行短的Python代碼,但如果你工作在一個(gè)大的程序(比如游戲)里,你可能想要將你的代碼保存到一個(gè)文件,這樣你就不必一遍又一遍地鍵入它了。

  有幾種方法可以運(yùn)行Python程序文件。一種方法是使用一個(gè)純文本編輯器,不如記事本(Windows)或TextEdit(Mac)。打開(kāi)一個(gè)新的文本文件,輸入你的Python代碼(像print 1 + 1)。然后保存它為asXXX.py(XXX可以是任何描述性的文件名稱)。

  使用Windows的話,通過(guò)雙擊這個(gè)文件來(lái)運(yùn)行它。在Mac上,打開(kāi)終端,輸入python,然后拖動(dòng)你保存的文件到終端窗口并按Enter。

  另一種方法是鍵入代碼類到IDLE,也就是你在這個(gè)教程中需要做的方式。運(yùn)行IDLE - 只需在終端輸入IDLE。 然后選擇文,然后選擇File\New Window,會(huì)出現(xiàn)一個(gè)你可以輸入代碼的文本編輯器窗口。你可以通過(guò)File\Save保存你更改的代碼,通過(guò)運(yùn)行Run\Run Module(F5)運(yùn)行代碼。

  請(qǐng)注意運(yùn)行菜單只在你已有一個(gè)文件在編輯器窗口打開(kāi)時(shí)有效。

  添加游戲資源

  你幾乎已經(jīng)可以開(kāi)始創(chuàng)建你的游戲了。但沒(méi)有一些震撼的圖像和聲音效果的游戲又算什么呢?我已經(jīng)收集了游戲所需要的所的圖形和聲音效果并把它們壓縮成了一個(gè)ZIP存檔,你可以在這里下載。

  下載文件后,在你的硬盤上創(chuàng)建一個(gè)游戲使用的文件夾,將resources文件夾解壓到這個(gè)文件夾中,這樣你的游戲文件夾有了名為resources的子文件夾,各種資源在resources文件夾里面分組顯示如下:

  兔子和獾的游戲你已經(jīng)準(zhǔn)備就緒。:]

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

  運(yùn)行IDLE開(kāi)發(fā)環(huán)境,向上一節(jié)提到的那樣,打開(kāi)一個(gè)新的文本編輯窗。在編輯窗鍵入以下代碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 1 - Import library
import pygame
from pygame.locals import *
  
# 2 - Initialize the game
pygame.init()
width, height = 640480
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. 導(dǎo)入PyGame庫(kù)。這一步讓你在你的程序中使用來(lái)自庫(kù)中的函數(shù)。

  2. 初始化PyGame并設(shè)置顯示窗口。

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

  4. 循環(huán)執(zhí)行以下縮進(jìn)的代碼。

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

  6. 將之前加載進(jìn)來(lái)的bunny圖片以100*100的大小顯示在屏幕上。

  7. 更新屏幕。

  8. 檢查任何新事件如果有的話,否則轉(zhuǎn)到退出命令,退出程序。

  注意:根據(jù)PyGame的文檔,你不需要調(diào)用pygame.quit()因?yàn)榻馕銎麝P(guān)閉時(shí)會(huì)自動(dòng)調(diào)用它。然而,至少在Mac OS上,這個(gè)游戲會(huì)在退出時(shí)掛起除非pygame.quite被調(diào)用。

  如果現(xiàn)在運(yùn)行這段代碼(在Idle菜單欄點(diǎn)擊 “Run\Run Module"),你應(yīng)該可以看到一個(gè)如下所示的屏幕:

  耶,兔子就顯示在屏幕上了,并準(zhǔn)備做動(dòng)作!

  但是只有一只兔子顯示在一個(gè)黑漆漆的屏幕上,這個(gè)游戲看起來(lái)很嚇人且很孤單。接下來(lái)要做的就是稍微美化一下咯。

 第二步:添加布景

  我們首先給游戲場(chǎng)景添加背景圖片,可以通過(guò)調(diào)用一組screen.blit()來(lái)完成背景添加。

  在代碼的#3 小節(jié),載入角色圖像之后添加下面的代碼:

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

  這些代碼載入圖片然后賦給指定的變量,然后把它們畫到屏幕上。但如果你檢查草地的圖片,你會(huì)發(fā)現(xiàn)它沒(méi)有覆蓋整個(gè)640 x 480的屏幕,所以你必須平鋪使草地的圖片完全覆蓋屏幕。

  在#6小節(jié)的開(kāi)始(把兔子畫在屏幕上之前),添加以下代碼到game.py:

1
2
3
4
5
6
7
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 ))

  正如你所見(jiàn),首先把x坐標(biāo)通過(guò)for循環(huán)遞增,在這個(gè)循環(huán)中再把y坐標(biāo)循環(huán)遞增,并且將草地畫在使用循環(huán)生成的x、y坐標(biāo)上。緊接著的一組代碼只是將城堡畫在屏幕上。

  你現(xiàn)在運(yùn)行這個(gè)程序,你會(huì)看到像如下的結(jié)果:

  從現(xiàn)在開(kāi)始,變得好看點(diǎn)了! :]

 第三步:讓兔子動(dòng)起來(lái)

  下面你需要添加一些真正的游戲元素,比如讓兔子響應(yīng)鍵盤的按鍵。

  要做到這一點(diǎn),你需要實(shí)現(xiàn)好一個(gè)方法記錄哪一個(gè)鍵在某一時(shí)刻被按下。你可以簡(jiǎn)單的使用一個(gè)數(shù)組保存在游戲需要使用的鍵的按下?tīng)顟B(tài)。

  添加如下代碼到game.py的#2小節(jié)結(jié)束(在你設(shè)了屏幕高和寬度之后):

1
2
keys = [False, FalseFalse, False]
playerpos=[100100]

  這段代碼是非常明了。數(shù)組keys按WASD的順序記錄它們的狀態(tài)。數(shù)組的每個(gè)元素對(duì)應(yīng)一個(gè)鍵,第一個(gè)是W,第二個(gè)是A等等。

  playerpos變量定義程序開(kāi)始繪制游戲角色的起始位置。因?yàn)檫@個(gè)游戲?qū)⒁苿?dòng)游戲角色到不同的位置,設(shè)置一個(gè)儲(chǔ)存角色位置的變量,然后便可以簡(jiǎn)單地將角色繪制到這個(gè)位置。

  現(xiàn)在你需要修改現(xiàn)有的代碼來(lái)繪制角色,使用新的playerpos變量,將# 6的程序:

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

  改為:

1
screen.blit(player, playerpos)

  接下來(lái),基于哪些按鍵被按下更新鍵數(shù)組,PyGame通過(guò)添加event.key事件使檢測(cè)按鍵很容易實(shí)現(xiàn)。

  在# 8檢測(cè)event.type==pygame.QUIT之后,添加這些代碼(如果有塊縮進(jìn)的話使用與pygame.QUIT相同的縮進(jìn)級(jí)):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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語(yǔ)句拆分也不是很復(fù)雜的。

  首先你要檢測(cè)一是否有鍵被按下或釋放,然后你需要檢測(cè)哪個(gè)鍵被按下或者釋放,如果被按下或者釋放的鍵是你要使用的鍵,根據(jù)鍵值更新相應(yīng)的鍵變量。

  最后,你需要更新playerpos變量作為鍵按下的響應(yīng),這太簡(jiǎn)單了。

  將下附代碼添加到game.py的末尾(使用相同的縮進(jìn)級(jí),使用和for循環(huán)相同的縮進(jìn)級(jí))

1
2
3
4
5
6
7
8
9
# 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

  這段代碼只是檢查哪個(gè)鍵被按下,然后添加或減去游戲角色的x或y位置(取決于按下的鍵)來(lái)移動(dòng)游戲角色。

  運(yùn)行這個(gè)游戲,你會(huì)得到根以前一樣的角色。試一下按WASD鍵,哈哈,起效了!

 第四步: 旋轉(zhuǎn)兔子

  是的,你的兔子現(xiàn)在可以隨著你的按鍵移動(dòng),但用鼠標(biāo)來(lái)旋轉(zhuǎn)兔子朝向到你選擇的方向豈不更酷,所以它不是所有時(shí)間都朝向一個(gè)方向。使用三角函數(shù)來(lái)實(shí)現(xiàn),這很簡(jiǎn)單。

  看一下下面的圖解:

  上圖中,如果(5,3)是兔子的位置,(2,4)是當(dāng)前鼠標(biāo)的位置,你可以通過(guò)對(duì)兩點(diǎn)間距離的不同應(yīng)用atan2三角函數(shù)獲得旋轉(zhuǎn)角度(z)。當(dāng)然,一旦你知道旋轉(zhuǎn)角,你可以輕松相應(yīng)地旋轉(zhuǎn)兔子。:]

  如果你對(duì)這部分有點(diǎn)困惑,不要擔(dān)心,你依然可以繼續(xù)。但這就是你應(yīng)該在數(shù)學(xué)課上用功的原因!:]在游戲編程時(shí)你會(huì)一直使用這個(gè)東西。

  現(xiàn)在你需要將這個(gè)原理應(yīng)用到你的游戲上,為做到這一點(diǎn),你可以使用PyGameSurface.rotate(度數(shù))函數(shù), 順便說(shuō)一下,記住,Z值是弧度。:[

  atan2函數(shù)在Python的math庫(kù)總,所有先在#1結(jié)尾處增加:

1
import math

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

1
2
3
4
5
6
# 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)

  讓我們梳理一下上面代碼的基本流程。首先獲取鼠標(biāo)和游戲角色的位置,然后你對(duì)兩個(gè)位置應(yīng)用atan2函數(shù),之后,你將atan2返回的弧度轉(zhuǎn)化成度數(shù)(將弧度乘以近似57.29或360/2π)。

  因?yàn)橥米訒?huì)旋轉(zhuǎn),它的位置也將會(huì)改變。所以現(xiàn)在計(jì)算兔子的新位置并把它顯示在屏幕。

  再次運(yùn)行這個(gè)游戲。如果你只按了“WASD”鍵,那么這個(gè)游戲應(yīng)該和之前完全一樣,但如果你移動(dòng)你的鼠標(biāo)兔子也會(huì)隨之旋轉(zhuǎn),酷!

 第五步:射擊吧,兔子!

  現(xiàn)在你的兔子已經(jīng)可以自由活動(dòng)了,是時(shí)候給它添加更多的動(dòng)作了。讓兔子可以用劍射擊敵人怎么樣?它可不是只溫順的兔斯基!

  這一步稍微有點(diǎn)復(fù)雜,因?yàn)槟惚仨氂涗浰猩涑龅膭?,更新它們的位置、旋轉(zhuǎn)并且在它們飛出屏幕后刪除它們。

  首先,在初始化小節(jié)(#2小節(jié))的結(jié)束添加必要的變量:

1
2
acc=[0,0]
arrows=[]

  第一個(gè)變量記錄玩家的射擊精度,第二個(gè)變量記錄所有的劍。精度變量acc實(shí)際上是一個(gè)包含射擊數(shù)量和命中獾 次數(shù)的列表。最后我們可以使用這些信息來(lái)計(jì)算精度的百分比。

  接下來(lái),在section #3的末尾加載弓箭圖像:

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

  現(xiàn)在當(dāng)玩家點(diǎn)擊鼠標(biāo),弓箭就要射出。在section #8的末尾加入以下代碼作為新的事件句柄(event handler):

1
2
3
4
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])

  這些代碼檢查是否有鼠標(biāo)點(diǎn)擊,如果有它會(huì)讀取鼠標(biāo)位置,并根據(jù)玩家的旋轉(zhuǎn)和指針的位置計(jì)算出弓箭的旋轉(zhuǎn)。這個(gè)旋轉(zhuǎn)儲(chǔ)存在arrows數(shù)組里。

  接下來(lái)你需要真正在屏幕上畫出弓箭了。在section #6.1之后插入以下代碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 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]))

  運(yùn)用基本的三角函數(shù)可以計(jì)算出vely和velx。10是弓箭的速度。if語(yǔ)句檢查弓箭是否飛出邊界,如果是則刪除該弓箭。第二個(gè)for語(yǔ)句循環(huán)過(guò)arrows數(shù)組并畫出相應(yīng)旋轉(zhuǎn)的弓箭。

  試試運(yùn)行程序。你應(yīng)該有一只兔兔在你點(diǎn)擊鼠標(biāo)時(shí)發(fā)射弓箭了。(?☉? ⊙?)

 第六步:拿起武器!獾!

  好的,你有了一個(gè)城堡和可以移動(dòng)和射擊的英雄。但少了什么東西呢?攻擊城堡的敵人!


(炸掉你的城堡!)

  在這個(gè)步驟中,你將創(chuàng)建幾只隨機(jī)生成并跑向城堡的獾。隨著游戲的進(jìn)展會(huì)有越來(lái)越多的獾。所以,讓我們做一個(gè)列表看看需要做那些工作。

  1、把壞家伙們添加到一個(gè)數(shù)組列表;

  2、每幀每幀的更新這個(gè)數(shù)組并檢查他們是否都出現(xiàn)在屏幕上;

  3、顯示這些壞家伙。

  很容易,是吧?:]

  首先,把下面這段代碼添加到section #2后面:

1
2
3
4
badtimer=100
badtimer1=0
badguys=[[640,100]]
healthvalue=194

  上面這段代碼設(shè)置了一個(gè)計(jì)時(shí)器(以及其他一些值)以便每過(guò)一段時(shí)間在游戲中增加一只新的獾。你每幀每幀的減少 badtimer直到0, 然后就生成一個(gè)新的獾。

  現(xiàn)在把下面這段代碼添加到section #3后面:

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

  上面代碼的第一行類似于前面所有的圖片加載代碼。第二行代碼設(shè)置了一個(gè)圖片副本以便于這個(gè)壞家伙能更容易動(dòng)起來(lái)。

  下一步,你必須更新并且顯示這個(gè)壞家伙。把下面代碼添加到section #6.2之后

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 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)

  仔細(xì)的看下這段代碼,:] 第一行檢查badtimer是否為0,以badtimer至今為止已經(jīng)運(yùn)行的次數(shù)為基礎(chǔ),創(chuàng)建一個(gè)新的獾并再次設(shè)置badtimer。第一個(gè)for循環(huán)更新獾的X坐標(biāo),并檢查是否在屏幕上。如果不再屏幕上就刪除掉。第二個(gè)佛如循環(huán)繪制所有獾。

  為了在上述代碼中使用隨機(jī)函數(shù),我們必須引入 random 庫(kù):

1
import random

  最后,在 while 語(yǔ)句后面添加下面一行代碼用來(lái)讓 badtimer 值減1:

1
badtimer-=1

  再次運(yùn)行游戲來(lái)測(cè)試上述代碼,現(xiàn)在你將看到真正的游戲,你可以發(fā)射、移動(dòng)、轉(zhuǎn)向,而且獾也嘗試跑向你。

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

  在#6.3小節(jié)中每一個(gè)循環(huán)前的 index += 1 之前添加如下代碼:

1
2
3
4
5
6
7
8
# 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

  這段代碼非常簡(jiǎn)單,如果獾的x坐標(biāo)值小于64,則刪除這家伙然后隨機(jī)遞減5到20點(diǎn)的城堡的生命值。(在后面你可以顯示生命值到屏幕上)

  現(xiàn)在你構(gòu)建并運(yùn)行程序,你將看到一堆獾攻擊城堡后消失。雖然你不能看到但獾確實(shí)降低了城堡的生命值。

 第七步:獾與箭的碰撞

  現(xiàn)在獾可以攻擊你的城堡但你的箭卻對(duì)它們沒(méi)有任何效果!兔子該如何保護(hù)自己的家園?

  是時(shí)候讓箭可以殺死獾,你才可以保護(hù)你的城堡贏得游戲!首先,你必須循環(huán)檢查每個(gè)壞蛋,在檢查時(shí)以需要循環(huán)檢查所有的箭是不是和獾碰撞了。如果箭碰到了獾則刪除箭和獾,并且遞增命中值。

  在#6.3.1小節(jié)后添加如下代碼:

1
2
3
4
5
6
7
8
9
10
11
#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

  這段代碼里有一個(gè)值得注意的地方,if語(yǔ)句后是PyGame內(nèi)建的檢查兩個(gè)矩形是否相交的函數(shù)。其他語(yǔ)句只是按上面解釋運(yùn)行。

  如果你現(xiàn)在運(yùn)行程序,你會(huì)發(fā)現(xiàn)已經(jīng)可以射擊并殺死獾了。

 第八步:添加生命值和時(shí)鐘顯示

  游戲現(xiàn)在進(jìn)展良好,有攻擊者和守衛(wèi)者?,F(xiàn)在你還需要一種方式顯示分?jǐn)?shù),看看這些兔子干得怎么樣。

  最簡(jiǎn)單的方式是添加一個(gè)HUD(平視顯示器)顯示當(dāng)前城堡的健康狀況。也可以添加一個(gè)時(shí)鐘顯示城堡被保護(hù)了多久。

  首先添加時(shí)鐘,在#7小節(jié)前添加如下代碼:

1
2
3
4
5
6
# 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,00))
textRect = survivedtext.get_rect()
textRect.topright=[635,5]
screen.blit(survivedtext, textRect)

  上面代碼簡(jiǎn)單的使用PyGame默認(rèn)字體創(chuàng)建字體并設(shè)置尺寸為24。然后使用字體渲染時(shí)間到表面上。之后廣西被定位并繪制到屏幕上。

  下一步添加生命條。在繪制生命條之前你需要載入它的背景圖。添加如下代碼到#3小節(jié)結(jié)束:

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

  第一個(gè)是紅色圖用來(lái)鋪滿生命條。第二個(gè)綠色圖顯示當(dāng)前生命值。

  現(xiàn)在添加如下代碼到#6.4節(jié)(你上一步添加的)之后來(lái)將生命條畫到屏幕上:

1
2
3
4
# 6.5 - Draw health bar
screen.blit(healthbar, (5,5))
for health1 in range(healthvalue):
    screen.blit(health, (health1+88))

  上面的代碼首先畫出全紅色的生命條,然后根據(jù)城堡的剩余的生命繪制綠色生命條。

  現(xiàn)在你構(gòu)建并運(yùn)行程序,你可以看到時(shí)鐘和生命條。

 第九步:判斷輸贏

  這是什么?如果你玩得足夠久,即使你的命令值降到了0,游戲還是繼續(xù)!不僅僅如此,你也還可以繼續(xù)射擊獾。這應(yīng)該行不通的,但現(xiàn)在就是這樣。你需要添加某種贏/輸形式的場(chǎng)景讓這個(gè)游戲值得玩。

  所以我們現(xiàn)在添加輸贏條件和各自的畫面。你可以退出主游戲循環(huán)并進(jìn)入輸贏界面的循環(huán)。在輸贏循環(huán)中,你可以檢查用戶是輸了還是贏了,并顯示相應(yīng)的界面。

  下面是一個(gè)判斷輸贏的基本方法:

  如果超過(guò)了時(shí)間(90000毫秒或90秒):

  • 停止運(yùn)行游戲
  • 設(shè)置游戲的結(jié)果為贏了

  如果城堡被摧毀了:

  • 停止運(yùn)行游戲
  • 設(shè)置游戲結(jié)果為輸了

  計(jì)算準(zhǔn)確度的方法。

  注:使用acc[0]*1.0 只是將acc[0]轉(zhuǎn)換成float浮點(diǎn)類型,如果你不這么轉(zhuǎn)換,則除法操作將返回一個(gè)整數(shù)值比如1或2而不是1.5。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
    #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(None24)
    text = font.render("Accuracy: "+str(accuracy)+"%", True, (255,00))
    textRect = text.get_rect()
    textRect.centerx = screen.get_rect().centerx
    textRect.centery = screen.get_rect().centery+24
    screen.blit(gameover, (00))
    screen.blit(text, textRect)
else:
    pygame.font.init()
    font = pygame.font.Font(None, 24)
    text = font.render("Accuracy: "+str(accuracy)+"%"True, (0255,0))
    textRect = text.get_rect()
    textRect.centerx = screen.get_rect().centerx
    textRect.centery = screen.get_rect().centery+24
    screen.blit(youwin, (00))
    screen.blit(text, textRect)
while 1:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit(0)
    pygame.display.flip()

  這是截至目前最長(zhǎng)的代碼塊,但不是最復(fù)雜的。

  第一個(gè)if語(yǔ)句檢查是否到時(shí)間,第二個(gè)檢查城堡是否被摧毀,第三個(gè)計(jì)算你的準(zhǔn)確率。之后,一個(gè)快速的if語(yǔ)句檢查你是勝利還是失敗了,并顯示正確的圖像。

  當(dāng)然,如果你想顯示勝利與失敗的屏幕圖像,那么這些圖像必須先被加載。將下面的代碼添加到# 3結(jié)束的地方:

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

  另一點(diǎn),更改#4處:

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

  更改為:

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

  running變量跟蹤游戲是否結(jié)束,exitcode變量跟蹤玩家是贏了還是輸了。

  再次運(yùn)行游戲,現(xiàn)在你可以嘗試勝利或死亡!酷!:]

 第10步: 免費(fèi)的音樂(lè)和聲音效果!

  這個(gè)游戲看起來(lái)相當(dāng)棒,可是有聲音嗎?是不是太安靜了點(diǎn)呢?增加一點(diǎn)點(diǎn)音效會(huì)讓整個(gè)游戲的感覺(jué)變得更棒。

  PyGame 加載并播放聲音的方法非常簡(jiǎn)單。首先你需要初始化混音器,代碼如下:

1
pygame.mixer.init()

  然后加載要播放的聲音,并設(shè)置音量大?。?/p>

1
2
3
4
5
6
7
8
9
10
# 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)

  最上代碼中大多數(shù)是簡(jiǎn)單加載音頻文件和配置的音頻音量,但要注意pygame.mixer.music.load這一行——這一行加載游戲的背景音樂(lè),下一行設(shè)置背景音樂(lè)一直重復(fù)。

  注意音頻配置。:] 現(xiàn)在,你所需要做的就是按需要播放各種聲音效果。像下面每段注釋代碼那樣做:

1
2
3
4
5
6
# 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()

  多次運(yùn)行游戲,你會(huì)發(fā)現(xiàn)你現(xiàn)在有碰撞的背景音樂(lè)和射擊的聲音效果,游戲讓人感覺(jué)更逼真了!:]

 從哪里開(kāi)始?

  你應(yīng)該為自己感到自豪:你剛剛創(chuàng)建完成一個(gè)有趣的游戲,里面充滿了音樂(lè),音效,一個(gè)殺手兔子,神風(fēng)特攻隊(duì)獾和更多東西。我告訴你你可以做到!:]

  你可以在這里下載最終的游戲源代碼。

  這時(shí),在游戲中隨意拓展你的創(chuàng)造力!也許可以試著換成與你自己的繪畫風(fēng)格,或添加不同的武器或不同類型的怪物到游戲中!

  在完成這個(gè)教程中你有問(wèn)題或評(píng)論嗎? 如果有,請(qǐng)加入我們論壇的討論中! 我很期待你的來(lái)信。

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

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    久久热九九这里只有精品| 亚洲欧美视频欧美视频| 麻豆最新出品国产精品| 亚洲人午夜精品射精日韩| 人妻少妇久久中文字幕久久| 国产成人亚洲欧美二区综| 最新午夜福利视频偷拍| 99热在线播放免费观看| 国产成人精品一区二区三区| 欧美人妻少妇精品久久性色| 99久久精品视频一区二区| 国内精品偷拍视频久久| 亚洲国产色婷婷久久精品 | 色婷婷激情五月天丁香| 国产偷拍盗摄一区二区| 日本av在线不卡一区| 少妇激情在线免费观看| 东京热男人的天堂久久综合| 91人妻久久精品一区二区三区 | 少妇熟女精品一区二区三区| 亚洲黄香蕉视频免费看| 东京干男人都知道的天堂| 亚洲a级一区二区不卡| 欧美日不卡无在线一区| 亚洲欧美视频欧美视频| 久草视频这里只是精品| 国产精品内射婷婷一级二级| 老鸭窝老鸭窝一区二区| 加勒比系列一区二区在线观看| 国产老女人性生活视频| 黑鬼糟蹋少妇资源在线观看| 国产日韩中文视频一区| 俄罗斯胖女人性生活视频| 国产又粗又猛又爽色噜噜| 亚洲一级二级三级精品| 国产又猛又黄又粗又爽无遮挡| 超碰在线播放国产精品| 日韩成人中文字幕在线一区| 国产成人精品在线播放| 日本中文字幕在线精品| 欧美日韩国产福利在线观看|