前面寫到用pygame創建一個窗口並將一張位圖(.bmp)放在其中央,接下來將要實現位圖的上下左右移動,這裡為了更好的效果,把游戲窗口屏幕界面做了一些調整,圖片也換成了一張火箭的圖片,代碼也做了一些細微的調整,如下:
main_game.py
main_game.py主要用於管理游戲進程,初始化游戲,通過調用各個關於游戲的類來開啟游戲主循環。
import pygame
import sys
from settings import Settings
from ship import Ship
def run_game():
#初始化游戲並創建一個屏幕對象
pygame.init()
mg_settings = Settings()#導入settings類
screen = pygame.display.set_mode((mg_settings.screen_w, mg_settings.screen_h))
pygame.display.set_caption("火箭")
#創建一艘飛船
ship = Ship(screen)
#開始游戲主循環
while True:
#監視鍵盤和鼠標事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
#每次循環時都重繪屏幕
screen.fill(mg_settings.screen_color)
ship.blitme()
#讓最近繪制的屏幕可見
pygame.display.flip()
run_game()
settings.py
settings.py是創建來管理游戲設置的一個類,將用於所有游戲的設置都放入其中,修改游戲設置時直接在其中修改,避免了繁瑣的查找與大量的修改。
#單獨創建一個類存儲游戲所需的界面設置
class Settings():
def __init__(self):
self.screen_w = 400#屏幕寬度
self.screen_h = 300#屏幕高度
self.screen_color = 255,255,255#屏幕顏色
ship.py
ship.py是用於管理添加的位圖,也就是屏幕中的火箭的一個類
import pygame
class Ship():
#創建一個ship類,管理火箭的大部分行為
def __init__(self, screen):
self.screen = screen
#加載火箭圖像並獲取火箭的外接矩形
self.image = pygame.image.load("C:\python項目文件\練習002\image\huojian.bmp")
self.image_rect = self.image.get_rect()
self.screen_rect = screen.get_rect()
#將每艘火箭放在屏幕中央
self.image_rect.centerx = self.screen_rect.centerx
self.image_rect.centery = self.screen_rect.centery
def blitme(self):
#在指定位置繪制飛船
self.screen.blit(self.image, self.image_rect)
下面這個時效果圖:(相比上一個要漂亮的多)
好了,下面是如何實現火箭的上下移動問題了,也會牽涉到代碼的重構,重構之後更為簡潔,後面在關於代碼重構這一塊就不再一一指出修改的地方了(畢竟自己也是一個菜雞)。
接下來是需要按下按鍵來使飛機上下左右移動,在監視按鍵和鼠標事件的for循環中,通過if判斷語句來判斷鼠標事件,同時,也可以加上elif語句來響應鍵盤事件,將響應按鍵與鼠標事件的功能放入一個check_events()函數中,如下:
def check_enents(ship):
'''響應按鍵和鼠標事件'''
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:#判斷鍵盤是否有按鍵按下
if event.key == pygame.K_RIGHT:#判斷按下的鍵值
#向右移動飛船
ship.image_rect.centerx += 1
通過if event.key == pygame.K_RIGHT條件判斷語句檢測按鍵按下的鍵值,如果是K_RIGHT就ship.image_rect.centerx的值加一,也就是把所添加圖像的中心x坐標向右移一位,如果是向左移動,則-1。同樣,向上移動或者是向下移動,也是對縱坐標y進行加減。
在定義函數check_enents(ship)時,使用了形參ship,在main_game.py中,更新調用check_events()代碼時,將ship作為實參傳遞給它:
gf.check_enents(ship)
完成上面這些,飛船可以移動,但是只能是一直敲擊鍵盤火箭才能移動,且速度非常緩慢,我們希望的是當按鍵按下只要沒有松開,火箭就一直移動,直到松開為止,這裡就可以進行一個事件的設定,通過if語句,只要這個事件為真,就一直執行右移指令,反之,則不執行。向其他方向移動方法與向右也是一樣的。
代碼如下:
main_game.py
import pygame
from settings import Settings
from ship import Ship
import game_func as gf
def run_game():
#初始化游戲並創建一個屏幕對象
pygame.init()
mg_settings = Settings()
screen = pygame.display.set_mode((mg_settings.screen_w, mg_settings.screen_h))
pygame.display.set_caption("火箭")
#創建一艘飛船
ship = Ship(screen)
#開始游戲主循環
while True:
gf.check_enents(ship)#檢測鍵盤事件
ship.update()#檢測到鍵盤事件後更新屏幕
gf.update_screen(mg_settings, screen, ship)
run_game()
ship.py
import pygame
class Ship():
#創建一個ship類,管理火箭的大部分行為
def __init__(self, screen):
self.screen = screen
#加載火箭圖像並獲取火箭的外接矩形
self.image = pygame.image.load("C:\python項目文件\練習002\image\huojian.bmp")
self.image_rect = self.image.get_rect()
self.screen_rect = screen.get_rect()
#將每艘火箭放在屏幕中央
self.image_rect.centerx = self.screen_rect.centerx
self.image_rect.centery = self.screen_rect.centery
#移動標志
self.moving_right = False
self.moving_left = False
self.moving_up = False
self.moving_down = False
def update(self):
'''根據移動標志響應飛船的位置'''
if self.moving_right:
self.image_rect.centerx += 1
if self.moving_left:
self.image_rect.centerx -= 1
if self.moving_up:
self.image_rect.centery -= 1
if self.moving_down:
self.image_rect.centery += 1
def blitme(self):
#在指定位置繪制飛船
self.screen.blit(self.image, self.image_rect)
settings.py
#單獨創建一個類存儲游戲所需的界面設置
class Settings():
def __init__(self):
self.screen_w = 400
self.screen_h = 300
self.screen_color = 255,255,255
game_func.py
#存儲大量用於讓游戲運行的函數
import pygame
import sys
def check_enents(ship):
'''響應按鍵和鼠標事件'''
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:#判斷鍵盤是否有按鍵按下
if event.key == pygame.K_RIGHT:#判斷按下的鍵值
#向右移動飛船
ship.moving_right = True
elif event.key == pygame.K_LEFT:#判斷按下的鍵值
#向右移動飛船
ship.moving_left = True
elif event.key == pygame.K_UP: # 判斷按下的鍵值
# 向上移動飛船
ship.moving_up = True
elif event.key == pygame.K_DOWN: # 判斷按下的鍵值
# 向下移動飛船
ship.moving_down = True
elif event.type == pygame.KEYUP:#判斷按鍵松開
if event.key == pygame.K_RIGHT:
ship.moving_right = False
elif event.key == pygame.K_LEFT:
ship.moving_left = False
elif event.key == pygame.K_UP:
ship.moving_up = False
elif event.key == pygame.K_DOWN:
ship.moving_down = False
def update_screen(mg_settings, screen, ship):
'''更新屏幕上的圖像,並切換到新屏幕'''
# 每次循環時都重繪屏幕
screen.fill(mg_settings.screen_color)
ship.blitme()
# 讓最近繪制的屏幕可見
pygame.display.flip()
游戲界面:
這裡現在的問題就是火箭會移到屏幕外面並且移動速度過快(因為我界面設置的比較小,所以顯得速度快),這些問題在後面解決。
獨樂樂不眾樂樂,寫是樂,看是樂,評是樂。