IT培訓(xùn)網(wǎng)
IT在線學(xué)習(xí)
1 玩家飛機(jī)類的屬性
飛機(jī)大戰(zhàn)游戲首先要設(shè)計(jì)的角色是玩家飛機(jī),本小節(jié)介紹玩家飛機(jī)類涉及的屬性。
實(shí)例屬性中要設(shè)置一個游戲窗口屬性,該屬性在類初始化方法中設(shè)置。
玩家飛機(jī)將會展示一個飛機(jī)的圖片,因此,需要一個image屬性保存本地的正常狀態(tài)的玩家飛機(jī)圖片路徑,根據(jù)這個路徑加載圖片。
玩家飛機(jī)可能會被敵機(jī)擊毀,因此,為玩家飛機(jī)定義一組保存本地的玩家飛機(jī)爆炸圖片路徑的列表,根據(jù)這個列表中的路徑加載圖片,并作為玩家飛機(jī)類的屬性。
玩家飛機(jī)有一個初始的位置,包含x坐標(biāo)和y坐標(biāo),這也是玩家飛機(jī)類的兩個屬性。
玩家飛機(jī)類中定義一個子彈列表屬性,用于存放子彈對象。
玩家飛機(jī)類中定義一個圖片下標(biāo)變量作為類的屬性,用于控制逐幀將玩家飛機(jī)爆炸圖片疊加到背景上。
玩家飛機(jī)類中定義一個標(biāo)識玩家飛機(jī)是否爆炸的布爾變量作為類的屬性。
玩家飛機(jī)類中定義一個碰撞列表屬性,其中定義兩個字典,設(shè)置碰撞有效區(qū)域。
創(chuàng)建玩家飛機(jī)類HeroPlan,類中定義玩家飛機(jī)的屬性,代碼如下:
- class HeroPlan():
- # 正常狀態(tài)的玩家飛機(jī)圖片
- image = ['./img/hero.gif', './img/hero2.png', './img/hero2.png']
- # 爆炸玩家飛機(jī)圖片
- bomb_img = ['./img/hero_blowup_n1.png',
- './img/hero_blowup_n2.png',
- './img/hero_blowup_n3.png',
- './img/hero_blowup_n4.png']
- x = 190 # 初始位置x軸坐標(biāo)
- y = 528 # 初始位置y軸坐標(biāo)
- biu_list = [] # 玩家飛機(jī)子彈列表
- img_index = 0 # 圖片下標(biāo)
- is_bomb = False # 標(biāo)識玩家飛機(jī)是否爆炸
- # 碰撞有效區(qū)域[{范圍1}, {范圍2}]
- blast = [{'x': (35, 65), 'y': (0, 40)}, {'x': (0, 100), 'y': (40, 100)}]
2 玩家飛機(jī)類的方法
首先定義玩家飛機(jī)類的初始化方法,將全局定義的游戲窗口變量賦值給類的實(shí)例屬性,代碼如下:
- def __init__(self, surface):
- self.surface = surface
玩家飛機(jī)類中包含以下方法。
(1)hero_display()方法
玩家飛機(jī)類中第一個重要方法為hero_display()。該方法的主要功能是在游戲窗口上繪制玩家飛機(jī)。
該方法中首先檢測一個玩家飛機(jī)是否爆炸實(shí)例屬性is_bomb。如果玩家飛機(jī)沒有被擊中,即值為False,那么在設(shè)定的坐標(biāo)位置加載正常狀態(tài)的玩家飛機(jī)圖片,并繪制到游戲窗口上。如果玩家飛機(jī)被敵機(jī)擊中,即值為True,那么先檢測爆炸玩家飛機(jī)圖片是否顯示到最后一張,若顯示到最后一張,則調(diào)用結(jié)束畫面并退出游戲,否則根據(jù)bomb_img中保存的圖片路徑逐一加載圖片。由于bomb_img是一個列表,保存了玩家飛機(jī)爆炸動畫的一系列圖片的本地鏈接,因此需要一個img_index,游戲循環(huán)更新時(shí),根據(jù)img_index加載合適的圖片,并疊加到游戲窗口中。
hero_display()方法中還有一個處理子彈的for循環(huán)。biu_list列表中沒有項(xiàng)時(shí),就不執(zhí)行這個for循環(huán)。如果玩家按下空格鍵,并且biu_list列表中有項(xiàng)時(shí),在游戲窗口上顯示子彈圖片,然后移動子彈圖片,產(chǎn)生發(fā)射子彈的效果。當(dāng)子彈圖片移動超過了游戲窗口時(shí),刪除biu_list列表中的所有項(xiàng)。
hero_display()方法在游戲循環(huán)中更新,繪制出玩家飛機(jī)和子彈,以及玩家飛機(jī)被擊中后所執(zhí)行的一系列操作。
hero_display()方法的代碼如下:
- def hero_display(self):
- # 檢查玩家飛機(jī)是否爆炸
- if self.is_bomb == False:
- self.surface.blit(pygame.image.load(self.image[self.img_index]), (self.x, self.y))
- else:
- time.sleep(0.5)
- if self.img_index == len(self.bomb_img):
- end_screen_us()
- exit('游戲結(jié)束')
- self.surface.blit(pygame.image.load(self.bomb_img[self.img_index]), (self.x, self.y))
- self.img_index += 1 # 用于顯示圖片
- for biu in self.biu_list: # 在繪制完玩家飛機(jī)后,再繪制子彈
- biu.biu_diplay() # 繪制子彈到游戲窗口
- biu.move_up() # 移動子彈
- # 超出游戲窗口則刪除越界子彈
- self.biu_list.remove(biu) if biu.y < 0 else ''
(2)fire()方法
fire()方法先創(chuàng)建子彈實(shí)例,再將這個實(shí)例存入biu_list列表之中。biu_list作為玩家飛機(jī)類的實(shí)例屬性,在hero_display()方法中被使用。
fire()方法的代碼如下:
- def fire(self):
- # 存一顆子彈進(jìn)入子彈列表
- self.biu_list.append(Biu(self.surface, self.x, self.y))
(3)move_right()方法
move_right()方法對玩家飛機(jī)精靈的x坐標(biāo)進(jìn)行修改,對當(dāng)前x坐標(biāo)增加10,即右移,并限制玩家飛機(jī)的移動范圍,使其不能移出游戲窗口的右邊界。
move_right()方法的代碼如下:
- # 玩家飛機(jī)右移
- def move_right(self):
- # 限制玩家飛機(jī)的移動范圍
- if self.x < 380:
- self.x += 10
(4)move_left()方法
move_left()方法對玩家飛機(jī)精靈的x坐標(biāo)進(jìn)行修改,對當(dāng)前x坐標(biāo)減少10,即左移,并限制玩家飛機(jī)的移動范圍,使其不能移出游戲窗口的左邊界。
move_left()方法的代碼如下:
- # 玩家飛機(jī)左移
- def move_left(self):
- # 限制玩家飛機(jī)的移動范圍
- if self.x > 0:
- self.x -= 10
(5)bomb()方法
bomb()方法是玩家飛機(jī)被擊中后調(diào)用的方法。該方法設(shè)置玩家飛機(jī)類的實(shí)例屬性img_index為0;還設(shè)置玩家飛機(jī)類的實(shí)例屬性is_bomb為True,用于標(biāo)識玩家飛機(jī)被擊中爆炸了。
bomb()方法的代碼如下:
- def bomb(self):
- self.img_index = 0
- self.is_bomb = True
更多內(nèi)容
>>本文地址:http://nfbqydst.cn/zhuanye/2021/70183.html
聲明:本站稿件版權(quán)均屬中公教育優(yōu)就業(yè)所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
1 您的年齡
2 您的學(xué)歷
3 您更想做哪個方向的工作?