开心六月综合激情婷婷|欧美精品成人动漫二区|国产中文字幕综合色|亚洲人在线成视频

    1. 
      
        <b id="zqfy3"><legend id="zqfy3"><fieldset id="zqfy3"></fieldset></legend></b>
          <ul id="zqfy3"></ul>
          <blockquote id="zqfy3"><strong id="zqfy3"><dfn id="zqfy3"></dfn></strong></blockquote>
          <blockquote id="zqfy3"><legend id="zqfy3"></legend></blockquote>
          打開APP
          userphoto
          未登錄

          開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

          開通VIP
          12歲的少年教你用Python做小游戲

          本文由 伯樂在線 - 賤圣OMG 翻譯自 Julian Meyer。轉(zhuǎn)載請(qǐng)參見文章末尾處的要求。


          【感謝@賤圣OMG 的熱心翻譯。如果其他朋友也有不錯(cuò)的原創(chuàng)或譯文,可以嘗試推薦給伯樂在線?!?/p>

          你有沒有想過電腦游戲是怎樣制作出來的?其實(shí)它沒有你想象的那樣復(fù)雜!

          在這個(gè)教程里,你要學(xué)做一個(gè)叫《兔子和獾》的塔防游戲,兔子作為英雄,需要在城堡里抵御獾的進(jìn)攻。

          為了寫這個(gè)游戲的代碼,你將會(huì)用Python。好吧,我不是指一條大蟒蛇!

          Python是一種計(jì)算機(jī)語言。我們?cè)谶@篇教程里選擇Python是因?yàn)檫@門語言很容易上手,學(xué)習(xí)起來也很簡(jiǎn)單和有趣。

          如果你是個(gè)Python方面的新手,在開始看教程之前你可以看看這本書《 Think Python: How to Think Like a Computer Scientist》。這能讓你看教程的時(shí)候不那么吃力。

          在看了那本書后回到這里并且準(zhǔn)備好——兔子和獾之間有一場(chǎng)大戰(zhàn)爆發(fā),一起來加入到這場(chǎng)戰(zhàn)斗中來吧!

           

          起步:安裝Python

          如果你想在Windows PC上嘗試這篇教程里講到的東西,你需要安裝Python。確保你安裝的是2.7.3版本,而不是3.3.0版本!在安裝程序運(yùn)行完之后,在開始按鈕的“所有程序”里就會(huì)有IDLE了。首先啟動(dòng)IDLE。

          如果你是用的Mac,上面已經(jīng)是把Python裝好了!打開終端,輸入python,然后按回車就行了

          注意:如果你是安裝的從python.org下載的安裝包,那么你在Mac上也可以啟動(dòng)IDLE了,它應(yīng)該是在 /Application/Python2.7 這個(gè)文件夾里。

          如果你按以上的步驟執(zhí)行了,那么你可以看到一下的東西:

          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,你可以輸入exit()然后按回車,或者是按Control+D。

          現(xiàn)在很迅速的把Python環(huán)境配置好了,為了測(cè)試下Python是否正常工作,輸入 print 1+1 然后按回車,應(yīng)該會(huì)打印出2。你剛才就寫了一個(gè)簡(jiǎn)單的Python程序!

          那么,現(xiàn)在你知道Python已經(jīng)能正常工作了,為了能用Python來寫一個(gè)游戲,你需要安裝PyGame。

          PyGame是一個(gè)Python的庫(kù),能夠讓你更容易的寫出一個(gè)游戲。它提供的功能包括圖片處理和聲音重放的功能,并且它們能很容易的整合進(jìn)你的游戲里。

          點(diǎn)擊這里下載適合你的PyGame安裝包。確保你下載的是針對(duì)2.7版本的庫(kù)。

          注意:從以上鏈接下載的PyGame安裝包是無法與Mac上安裝的Python一起正常工作的。你需要從 python.org 上下載一個(gè)Python安裝包才能使用PyGame?;蛘撸憧梢杂肕acPorts來讓你的Python和PyGame正常工作。

          為了確定PyGame是否安裝好了,打開IELD或者是在終端里運(yùn)行Python,然后輸入import pygame 并且回車。如果沒有打出任何輸出,說明沒有問題。

          但是,如果打出了如下圖的輸出,那么PyGame就沒有被安裝上。

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

          如果你發(fā)現(xiàn)了這樣的錯(cuò)誤,把出錯(cuò)的情況發(fā)到論壇上,我會(huì)幫助你把它運(yùn)行起來

           

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

          現(xiàn)在你已經(jīng)能在Python快捷終端里寫一點(diǎn)代碼了,如果你想要寫一個(gè)更大一點(diǎn)的程序(比如游戲),那么你就需要把代碼保存到文件里了。

          有好幾種運(yùn)行文件里的Python代碼的方法。其中一種方法是使用一個(gè)簡(jiǎn)單的文本編輯器,比如Windows系統(tǒng)上的nodepad,或者M(jìn)ac上的TextEdit。打開一個(gè)新的文本文件,輸入Python代碼(比如print 1+1)。然后將其保存為XXX.py 。(XXX表示文件名)

          在Windows上,雙擊這個(gè)py文件來運(yùn)行它。在Mac上,打開終端然后輸入python,然后把代碼文件拖到終端上最后再按回車。

          另一種運(yùn)行代碼的方法是使用IDLE編輯器,這是在這篇教程里主要使用的方法。要運(yùn)行IDLE,需要在終端里輸入idle,然后在菜單里選擇新建文件,然后就可以利用這個(gè)文本編輯器來寫Python代碼了。你可以通過 File/Save 來保存文件,通過點(diǎn)擊 Run/Run(F5)來運(yùn)行代碼。

          要注意運(yùn)行的菜單在編輯器里打開了文件之后才可用。

           

          添加游戲資源

          你現(xiàn)在已經(jīng)基本上準(zhǔn)備好來創(chuàng)建一個(gè)游戲了。但是哪個(gè)游戲沒有很棒的圖像和音效呢?我把游戲里需要的圖像和音像保存在了zip檔案里,點(diǎn)擊這里下載。

          在下載好文件后,為游戲創(chuàng)建一個(gè)文件夾然后把壓縮文件解壓到這個(gè)文件夾的子文件夾里,將其命名為resources,具體如下圖:

          我們現(xiàn)在可以開始做兔子和獾這個(gè)游戲啦!

           

          第一步:你好,兔子

          運(yùn)行IDLE,打開一個(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 = 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)

          把文件保存到你的游戲文件夾里,把它命名為 game.py 。我們現(xiàn)在看看這段代碼做了什么:

          1. 導(dǎo)入pygame庫(kù),這一步能讓你使用庫(kù)里提供的功能
          2. 初始化pygame,設(shè)置展示窗口
          3. 加載作為兔子的圖片
          4. 不停地循環(huán)執(zhí)行接下來的部分
          5. 在給屏幕畫任何東西之前用黑色進(jìn)行填充
          6. 在屏幕的(100,100)坐標(biāo)出添加你加載的兔子圖片
          7. 更新屏幕
          8. 檢查一些新的事件,如果有退出命令,則終止程序的執(zhí)行。

          在運(yùn)行這段代碼后,你會(huì)看到一下的畫面:

          可以看到一個(gè)兔子在這里,準(zhǔn)備好要戰(zhàn)斗了!

          但是暫時(shí)兔子看起來還是很孤獨(dú)的,背景上只有它一個(gè)?,F(xiàn)在是時(shí)候讓它更進(jìn)一步了。

           

          第二步:添加背景

          我們現(xiàn)在開始給游戲的背景加上一些風(fēng)景。這可以通過一些 screen.blit() 的調(diào)用來實(shí)現(xiàn)。

          在#3的結(jié)尾處,在添加玩家圖片的后面,加上以下的代碼:

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

          這段代碼加載圖片并將它們放在變量里?,F(xiàn)在它們需要被畫在屏幕上。但是當(dāng)你檢查了草的圖片后,發(fā)現(xiàn)它不會(huì)覆蓋整個(gè)屏幕,它的分辨率是640 x 480。

          添加到 game.py 里#6的代碼:

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

          你可以看到,這段代碼首先是依次通過x進(jìn)行循環(huán)。又是一個(gè)依次通過y的循環(huán)并且根據(jù)循環(huán)里x和y的值來畫上草的效果。接下來的幾行就是在屏幕上畫出城堡。

          如果你現(xiàn)在運(yùn)行你的代碼,效果應(yīng)該如下圖:

          好多了——現(xiàn)在開始看起來不錯(cuò)了!

           

          第三步:讓兔子能夠移動(dòng)

          接下來你需要加上一些真正的游戲的元素了,比如讓兔子能夠隨著按鍵移動(dòng)。

          為了做到這一點(diǎn),首先,你需要實(shí)現(xiàn)一個(gè)方法,用來記錄在某一時(shí)刻那個(gè)鍵被按下??梢酝ㄟ^新建一個(gè)按鍵狀態(tài)的隊(duì)列來存放每個(gè)你想在游戲里用到的按鍵。

          把以下代碼加入到 game.py 里#2后面:

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

          這段代碼是不言自明的,key這個(gè)隊(duì)列用來記錄幾個(gè)按鍵的情況:WASD。隊(duì)列中的每一項(xiàng)對(duì)應(yīng)一個(gè)按鍵——第一個(gè)對(duì)應(yīng)W,第二個(gè)對(duì)應(yīng)A等等。

          playerpos這個(gè)變量表示程序畫出玩家的位置。因?yàn)檫@個(gè)游戲會(huì)讓玩家向不同的方向移動(dòng),用一個(gè)變量來表示玩家的位置并且能夠依據(jù)這個(gè)變量將玩家畫出來的方案是非常適合的。

          現(xiàn)在你需要修改現(xiàn)在畫出玩家的代碼,需要用上playerpos變量。把#6部分的代碼進(jìn)行修改:

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

          改成:

          1
          screen.blit(player, playerpos)

          接下來,根據(jù)按下的鍵來更新按鍵記錄數(shù)組。PyGame里用給按鍵添加事件的方法來檢測(cè)按鍵。

          在#8八月份的結(jié)尾,就在event.py == pygame.QUIT后面,添加一下的代碼(與pygame.QUIT保持同級(jí)別縮進(jìn)):

          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

          Wow!又加了這么多代碼。但是如果你仔細(xì)看看這些表達(dá)式,并沒有那么復(fù)雜。

          首先,你檢查是否有一個(gè)鍵被按下或放開。然后,檢查是哪一個(gè)鍵被按下或放開了,如果被按下或放開的鍵是你使用的,你就更新記錄按鍵的變量。

          最終,你需要更新playerpos變量作為按鍵后的反應(yīng)。這實(shí)際上是非常簡(jiǎn)單的。

          把一下的代碼加到game.py的結(jié)尾:(讓它與for 循環(huán)保持同級(jí)別縮進(jìn))

          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

          這段代碼簡(jiǎn)單的檢查了哪個(gè)鍵被按下,然后增加或減少玩家的x和y坐標(biāo)。

          運(yùn)行這個(gè)游戲,那么你應(yīng)該會(huì)看到一下的畫面。試著按WASD,耶!好使了!

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

          好的,現(xiàn)在你的兔子在你按鍵的時(shí)候可以移動(dòng)了,但是如果你能用鼠標(biāo)讓兔子朝向你選擇的方向不是更酷嗎?這樣它就不會(huì)總是朝向一個(gè)方向了。用三角定理實(shí)現(xiàn)它會(huì)非常簡(jiǎn)單。

          看一下下面的插圖:

          在上圖中,如果(5,2)是兔子的位置,(2,4)是現(xiàn)在鼠標(biāo)的位置,你可以通過三角定理來得出需要旋轉(zhuǎn)的角度。然后,你知道了旋轉(zhuǎn)的角度后,以就可以來旋轉(zhuǎn)你的兔子了。

          如果你對(duì)這部分感到有點(diǎn)疑惑,不要擔(dān)心——這沒有關(guān)系。但這是你為什么需要在數(shù)學(xué)課上集中精力的原因。在游戲編程中會(huì)用得到它的。

          現(xiàn)在,你需要接受你的游戲里的概念。為了實(shí)現(xiàn)它,你可以使用PyGame Surface.rotate(degrees) 函數(shù)。

          atatn2函數(shù)是來自Python 的math庫(kù)。所以把一下代碼加到#1部分:

          1
          import math

          然后,把#6部分的最后一行用一下代碼替換:

          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)

          我們來瀏覽一下以上代碼的基本結(jié)構(gòu)。首先獲取鼠標(biāo)和玩家的位置。然后將它們使用atan2函數(shù)。然后,獲取通過atan2函數(shù)得出的角度和弧度。

          當(dāng)兔子被旋轉(zhuǎn)的時(shí)候,它的位置將會(huì)改變。所以你需要計(jì)算兔子新的位置,然后將其在屏幕上顯示出來。

          再次運(yùn)行游戲,如果你只是按WASD這幾個(gè)鍵,那么這個(gè)游戲跟以前還是一樣的。但是如果你移動(dòng)鼠標(biāo),兔子也開始旋轉(zhuǎn)了,相當(dāng)酷!

          第五步:射吧!兔子

          現(xiàn)在你的兔子可以四處移動(dòng)了,是時(shí)候來添加更多的功能了。讓兔子用箭頭射向它們的敵人怎么樣?

          這一步會(huì)有一點(diǎn)復(fù)雜,因?yàn)槟阈枰櫵械募^,更新它們,旋轉(zhuǎn)它們,在它們跑出屏幕的時(shí)候刪除它們。

          首先,在#2聲明的部分加上必要的變量的聲明。

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

          第一個(gè)變量會(huì)跟蹤玩家的精度,第二個(gè)變量會(huì)跟蹤箭頭。這個(gè)精度的變量本質(zhì)上是一個(gè)數(shù)字組成的列表,記錄了射出的箭頭數(shù)和被擊中的獾的數(shù)量。之后我們會(huì)用到這些信息用來計(jì)算射擊精確度。

          接下來,在#3部分結(jié)尾加載箭頭的圖片。

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

          現(xiàn)在,當(dāng)玩家點(diǎn)擊鼠標(biāo),就需要射出一支箭頭。在#8部分加上以下代碼:

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

          這段代碼會(huì)檢查是否鼠標(biāo)被點(diǎn)擊了,如果點(diǎn)擊了,它就會(huì)得到鼠標(biāo)的位置并且根據(jù)玩家和光標(biāo)的位置計(jì)算出箭頭旋轉(zhuǎn)角度。旋轉(zhuǎn)角度的值存放在arrows這個(gè)數(shù)組里。

          接下來,你需要真的在屏幕上畫出箭頭來。在#6部分加上以下代碼:

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

          vely和velx的值是根據(jù)三角定理算出來的。10是箭頭的速度。if表達(dá)式是檢查箭頭是否超出了屏幕范圍,如果超出,就刪除這個(gè)箭頭。第二個(gè)for表達(dá)式是循環(huán)來把箭頭根據(jù)相應(yīng)的旋轉(zhuǎn)畫出來。

          試著運(yùn)行游戲。當(dāng)你點(diǎn)擊鼠標(biāo)時(shí),你的兔子就可以射出剪頭了:D

          第六部:獾,拿上武器!

          好吧,現(xiàn)在有了城堡,并且你有一個(gè)英雄可以移動(dòng)和射出箭頭。還差什么呢?攻擊城堡的敵人可以被英雄用箭頭射了!

          在這一步,你將會(huì)隨機(jī)創(chuàng)建出一些獾沖向城堡。在游戲的進(jìn)程中會(huì)有越來越多的獾冒出來。所以,我們來列個(gè)接下來要做的事情的清單。

          1. 添加一個(gè)壞蛋的列表
          2. 更新壞蛋的信息,并且檢查它們是否超出屏幕范圍
          3. 展示這些壞蛋

          第一步,在#2部分加上一下代碼:

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

          以上的代碼里定義了一個(gè)定時(shí)器,使得游戲里可以經(jīng)過一段時(shí)間后就新建一只獾。

          在#3部分結(jié)尾處添加以下代碼:

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

          第一行跟前面加載圖片的代碼很相似。第二行聲明了一個(gè)圖片的復(fù)制。

          接下來,你需要更新并且顯示這些壞蛋了。在#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)

          上面的代碼看起來有不少。第一行是來檢查badtime是否為0,如果為0,創(chuàng)建一個(gè)獾然后重新設(shè)置badtime。第一個(gè)循環(huán)更新獾的x坐標(biāo),檢查獾是否超出屏幕范圍,如果超出范圍,將獾刪掉。第二個(gè)循環(huán)是來畫出所有的獾。

          為了在以上代碼里用到隨機(jī)的功能,你需要導(dǎo)入random庫(kù)。所以在#1部分加上導(dǎo)入的代碼:

          1
          import random

          最后,把一行代碼添加到#4部分的while表達(dá)式后面:

          1
          badtimer-=1

          試著運(yùn)行這段代碼。現(xiàn)在它應(yīng)該像個(gè)真正的游戲了——你可以移動(dòng)、射箭、轉(zhuǎn)向,然后有獾沖向你。

          但是先慢著!為什么獾沒有炸掉城堡?我們快速的把這功能加進(jìn)來。

          把以下代碼加到#6.3部分index+=1之前的第一個(gè)循環(huán)里:

          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

          這段代碼相當(dāng)簡(jiǎn)單。如果獾的x坐標(biāo)離右邊小于64,就刪除壞蛋并且減少游戲里的健康值,減少的大小為5至20里的一個(gè)隨機(jī)數(shù)。

          再次運(yùn)行這個(gè)游戲,你就會(huì)有一些獾沖過來并且在碰到城堡的時(shí)候會(huì)消失。盡管你看不到,獾實(shí)際上會(huì)降低你的健康值。

          第七部:獾與箭頭的碰撞

          獾們沖向你的城堡,但是你的箭頭對(duì)它們完全沒有作用!這讓兔子怎么放手它的家園呢?

          是時(shí)候來讓箭頭能夠殺死獾讓你能保護(hù)你的城堡并且贏得這場(chǎng)游戲?;旧?,你需要循環(huán)所有的壞蛋,你需要循環(huán)所有的箭頭來檢查是否有碰撞。如果碰撞上,刪除獾,刪除箭頭,并且添加精確度的變量里面加1。

          在#6.3.1部分后面加這些:

          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è)地方需要提一下,這個(gè)if表達(dá)式使用了PyGame內(nèi)建功能來檢查兩個(gè)矩形是否交叉。接下來的一些代碼跟上面說的一樣。

          再運(yùn)行下代碼,現(xiàn)在你就可以用箭頭來殺死獾了。

           

          第八步:添加健康值和時(shí)間的顯示

          現(xiàn)在游戲運(yùn)行起來相當(dāng)不錯(cuò)了?,F(xiàn)在有攻擊者,有防守者?,F(xiàn)在,你需要的就是通過一個(gè)方法來顯示兔子的得分。

          最簡(jiǎn)單的方法就是添加一個(gè)HUD來顯示當(dāng)前城堡的生命值。你也可以加一個(gè)計(jì)時(shí)來記錄城堡存活下來的時(shí)間。

          首先,添加一個(gè)計(jì)時(shí)。在#7部分加上下面的代碼:

          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,0,0))
          textRect = survivedtext.get_rect()
          textRect.topright=[635,5]
          screen.blit(survivedtext, textRect)

          上面的代碼使用了PyGame默認(rèn)的大小為24的字體。這個(gè)字體用來顯示時(shí)間信息。

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

          接下來添加代碼到#6.4部分后面:

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

          這段代碼首先畫了一個(gè)全紅色的生命值條。然后根據(jù)城堡的生命值往生命條里面添加綠色。

          運(yùn)行下代碼,現(xiàn)在就會(huì)有計(jì)時(shí)和生命值條了。

          第九步:贏或輸

          現(xiàn)在怎么樣?如果你玩的時(shí)間夠長(zhǎng),即使你的生命值已經(jīng)變成0了,游戲仍然是繼續(xù)的!不僅如此,你仍然可以用箭頭射向這些獾。這肯定不太對(duì)。你需要加上一些贏或者輸?shù)那闆r來讓你的游戲值得玩。

          那么我們來加上勝利或者失敗的條件。你可以通過終止主循環(huán),進(jìn)入勝利/失敗的循環(huán)來實(shí)現(xiàn)它。你需要指出玩家是否勝利,并將其顯示在屏幕上。

          下面是一些勝利/失敗的一些基本條件:

          如果時(shí)間到了(90秒)那么:

          • 停止運(yùn)行游戲
          • l設(shè)置游戲的輸出

          如果城堡被毀,那么:

          • 停止運(yùn)行游戲
          • l設(shè)置游戲的輸出

          精確度是一直都需要計(jì)算的。

          在game.py 結(jié)尾添加這些代碼:

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

          這是最長(zhǎng)的一段代碼!不過它并不復(fù)雜。

          第一個(gè)ifb表達(dá)式是檢查是否時(shí)間到了。第二個(gè)是檢查城堡是否被摧毀了。第三個(gè)計(jì)算你的精準(zhǔn)度。之后,一個(gè)if表達(dá)式是檢查你是贏了還是輸了,然后顯示出相應(yīng)的圖片。

          當(dāng)然,如果你想在贏或輸?shù)臅r(shí)候顯示圖片,這些圖片首先需要加載。所以在#3部分加上這些代碼:

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

          還有需要改的地方,把#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

          這個(gè)running變量會(huì)跟蹤游戲是否結(jié)束,exitcode變量會(huì)跟蹤玩家是否勝利。

          再次運(yùn)行游戲,你就發(fā)現(xiàn)你可以勝利或者失敗了!酷

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

          這個(gè)游戲現(xiàn)在相當(dāng)不錯(cuò)了,但是沒有聲音。有點(diǎn)太安靜了。加上一點(diǎn)聲音效果,能讓你更好地感受這個(gè)游戲。

          PyGame能夠讓加載和播放聲音非常簡(jiǎn)單。首先,你在#2部分結(jié)尾加上這些代碼:

          1
          pygame.mixer.init()

          然后在#3部分加載聲音然后設(shè)置聲音:

          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)

          上面大部分代碼就是加載聲音文件并且配置音量。但是注意 pygame.mixer.music.load這行代碼——這一行加載游戲的背景音樂然后下一行讓背景音樂一直不停的播放。

          現(xiàn)在注意聲音的配置?,F(xiàn)在你所有需要做的就是在需要的時(shí)候播放不同的音樂。

          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)在有背景音樂了,并且在射出箭頭和碰撞的時(shí)候會(huì)有音效。這游戲就更加逼真啦!

           

          那接下來呢?

          你應(yīng)該為自己感到自豪:你剛剛完成了一個(gè)游戲;里面包含了音樂,音效,一個(gè)殺手兔子,自殺沖鋒的獾等等。我跟你說了這確實(shí)是可以完成的!

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

          在這基礎(chǔ)上,你可以根據(jù)你自己的創(chuàng)意來擴(kuò)展游戲!你可以試著重置里面的各種圖片,加上不同的槍或者是不同的怪物!

          本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
          打開APP,閱讀全文并永久保存 查看更多類似文章
          猜你喜歡
          類似文章
          青少年如何使用 Python 開始游戲開發(fā)
          就是玩兒:python輕松實(shí)現(xiàn)代碼雨效果!
          Python|pygame基礎(chǔ)之壁球游戲
          調(diào)用攝像頭攝像及保存圖片 - 代碼分享 - 開源中國(guó)社區(qū)
          用Python開發(fā)實(shí)用程序 – 計(jì)算器
          用python寫一個(gè)簡(jiǎn)單的貪吃蛇游戲
          更多類似文章 >>
          生活服務(wù)
          分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
          綁定賬號(hào)成功
          后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
          如果VIP功能使用有故障,
          可點(diǎn)擊這里聯(lián)系客服!

          聯(lián)系客服