手把手講解超詳細python入門游戲專案‘打外星飛船’(二)
上次我們在(一)中創建了游戲的背景,現在我們這里將要實作用鍵盤控制飛船的移動、射擊子彈,但是在此之前我們還有一個非常重要的部分–重構,
重構
在大型專案中,經常需要添加新代碼重構舊的代碼,簡單來說就把一些代碼整理成函式,用函式之前的代碼就變成了一句函式,這里我們就需要把之前的run_game()拆分成兩個輔助方法,基本上輔助方法要以單個下劃線打頭,
我們直接回顧上此的代碼
def run_game(self):
while True:
#這里把管理事件的代碼移動到這兩個函式里面了,代碼在下面
self._check_events()
self._update_screen()
def _check_events(self):
#這個是之前按鍵和滑鼠的代碼
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
def _update_screen(self):
#更新影像,切換到新螢屏
self.screen.fill(self.settings.bg_color)
self.ship.blitme()
pygame.display.flip()
飛船的控制
這里我開始把按鍵鏈接到電腦,每一次按下一個按鍵,pygame上都會注冊一個事件,這里每次按下都會注冊一個KEYDOWN事件,如果檢測到這個事件就會移動
def _check_events(self):
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN: #檢測到了按鍵被按下
if event.type == pygame.K_RIGHT:#按下的鍵是右鍵
self.ship.rect.x +=1#這里的距離+1,即右邊移
左右持續移動
# 添加左右的移動的標志,立flag是好個方法,簡化代碼程序
self.moving_right = False
self.moving_left = False
但檢測到左右移動鍵按下后,flag變成1
if event.key == pygame.K_RIGHT:
self.ship.moving_right = True
elif event.type == pygame.KEYUP:
if event.key == pygame.K_RIGHT:
self.ship.moving_right = False
這個時候我們在主運行加入移動函式,update()
def run_game(self):
"""Start the main loop for the game."""
while True:
self._check_events()
self.ship.update()#控制移動
self._update_screen()
下面這個就是移動函式
def update(self):
if self.moving_right:
self.ship.rect.x +=1#右移動加一
if self.moving_left:
self.ship.rect.x -=1#左移動減一
調整數獨、限制活動范圍
這里我們就整體展現下ship加工部分了,
import pygame
class Ship:
def __init__(self, ai_game):
self.screen = ai_game.screen
self.settings = ai_game.settings#這里添加一個settings屬性,等會要在update用
self.screen_rect = ai_game.screen.get_rect()
self.image = pygame.image.load('images/ship.bmp')
self.rect = self.image.get_rect()
self.rect.midbottom = self.screen_rect.midbottom
#這里有個方法是儲存小數值,因為飛船移動的是像素,所以這里要要把位置賦給能夠儲存小數值的變數
self.x = float(self.rect.x)
# 移動的flag
self.moving_right = False
self.moving_left = False
def update(self):
if self.moving_right and self.rect.right < self.screen_rect.right:
#飛船未飛出右邊的邊緣
self.x += self.settings.ship_speed
#移動的速度會不斷地加一個像素的大小,注意:主函式中已經設定了速度為self.ship_speed=1.5
if self.moving_left and self.rect.left > 0:
#如果飛船未飛出左側,左側是0
self.x -= self.settings.ship_speed
#根據self.x更新rect物件
self.rect.x = self.x
再次重構
因為一句添加了不少內容,所以
def _check_events(self):
"""Respond to keypresses and mouse events."""
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
self._check_keydown_events(event)#添加說明
elif event.type == pygame.KEYUP:
self._check_keyup_events(event)
def _check_keydown_events(self, event):
#這是剛才的陳述句,寫進了這個句子
if event.key == pygame.K_RIGHT:
self.ship.moving_right = True
elif event.key == pygame.K_LEFT:
self.ship.moving_left = True
def _check_keyup_events(self, event):
#同樣的
if event.key == pygame.K_RIGHT:
self.ship.moving_right = False
elif event.key == pygame.K_LEFT:
self.ship.moving_left = False
按Q鍵退出
def _check_keydown_events(self, event):
"""Respond to keypresses."""
if event.key == pygame.K_RIGHT:
self.ship.moving_right = True
elif event.key == pygame.K_LEFT:
self.ship.moving_left = True
#這里我們設定的按鍵Q退出,接受到Q鍵反應接受后執行sys模塊的退出指令
elif event.key == pygame.K_q:
sys.exit()
全屏運行
def __init__(self):
"""Initialize the game, and create game resources."""
pygame.init()
self.settings = Settings()
#游戲開始時傳入的是(0,0)以及引數pygame.FULLSCREEN,這個指令是覆寫整個螢屏
self.screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN)
#這里使用螢屏的高和寬更新資料
self.settings.screen_width = self.screen.get_rect().width
self.settings.screen_height = self.screen.get_rect().height
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/255969.html
標籤:其他
