不多說,先上圖(看到這個熟悉不,我也是網絡上找的教程以及資源,去一步步學着寫的,這里我把項目拆解了幾大步,接下來一步步說明):
先准備資源,網絡上也可以下載到,我這里直接用的教程的資源,為什么呢(確實好看,自己找的慘不忍睹)
然后不多說,上代碼(本次實現的是放背景圖片+飛機跟誰鍵盤操作運動)
main.py,注釋基本上都加了,不清楚的可以試着百度一下對應的方法
import pygame import sys import traceback from pygame.locals import * from random import * import myplane # 初始化 pygame.init() # 設置窗口大小 bg_size = width, height = 400, 700 # 實際上是元組 screen = pygame.display.set_mode(bg_size) # 設置窗口 pygame.display.set_caption("飛機大戰") # 窗口標題 # 加載背景圖片,對於普通圖像的顯示效果有沒有convert都是一樣的,但是 使用 convert 可以轉換格式,提高 blit 的速度 background = pygame.image.load("images/background.png").convert() def main(): # 創建時鍾對象(可以控制游戲循環頻率) clock = pygame.time.Clock() # 生成玩家飛機 me = myplane.MyPlane(bg_size) # 玩家三條命 life_num = 3 # 游戲暫停,默認為非暫停狀態 paused = False # 控制玩家飛機圖片切換,展示突突突的效果 switch_image = True # 切換延時 delay = 100 running = True while running: # 獲取事件 for event in pygame.event.get(): # 結束事件觸發結束操作 if event.type == QUIT: pygame.quit() sys.exit() # 檢測用戶鍵盤操作,分別為上下左右 key_pressed = pygame.key.get_pressed() if key_pressed[K_w] or key_pressed[K_UP]: me.moveUp() if key_pressed[K_s] or key_pressed[K_DOWN]: me.moveDown() if key_pressed[K_a] or key_pressed[K_LEFT]: me.moveLeft() if key_pressed[K_d] or key_pressed[K_RIGHT]: me.moveRight() # 在屏幕上面繪制背景圖像,並指定位置 screen.blit(background, (0, 0)) # 繪制子彈補給、炸彈補給等各種元素 # 未暫停且生命大於0 if paused == False and life_num > 0: # 繪制玩家飛機,如果飛機為激活狀態 if me.active: # 在屏幕上繪制玩家飛機,switch_image為是否切換圖片 if switch_image: screen.blit(me.image1, me.rect) # 代表切換一下飛行圖片 else: screen.blit(me.image2, me.rect) # 代表飛機遭到碰撞,激活爆炸事件 else: print("飛機損毀") delay -= 1 if delay == 0: delay = 100 # 每5幀切換一下飛行圖片樣式 if delay % 5 == 0: switch_image = not switch_image # 在屏幕上面繪制背景圖像,並指定位置 screen.blit(me.image1, me.rect) # 更新整個待顯示的 Surface 對象到屏幕上,將內存中的內容顯示到屏幕上 pygame.display.flip() # 通過時鍾對象指定循環頻率,每秒循環60次 # 幀速率是指程序每秒在屏幕山繪制圖 clock.tick(60) if __name__ == "__main__": try: main() # 服務正常退出 except SystemExit: print("游戲正常退出!") # pass忽略錯誤並繼續往下運行,其實這里以及退出了 pass # 服務出現其他的異常 except: # 直接將錯誤打印出來 traceback.print_exc() pygame.quit()
myplane.py:主要是玩家飛機的控制,包括玩家飛機各種屬性、飛機的上下左右移動,以及飛機的重生
import pygame # 玩家飛機類,pygame.sprite模塊里面包含了一個名為Sprite類,他是pygame本身自帶的一個精靈。 class MyPlane(pygame.sprite.Sprite): def __init__(self, bg_size): # convert_alpha()更改圖像的像素格式,包括每個像素的alpha,相當於圖片背景變為透明 self.image1 = pygame.image.load('images/me1.png').convert_alpha() self.image2 = pygame.image.load('images/me2.png').convert_alpha() # 飛機摧毀圖片,以數字形式保存 self.destory_image = [] self.destory_image.extend([ pygame.image.load('images/me_destroy_1.png').convert_alpha(), pygame.image.load('images/me_destroy_2.png').convert_alpha(), pygame.image.load('images/me_destroy_3.png').convert_alpha(), pygame.image.load('images/me_destroy_4.png').convert_alpha() ]) # 定義屏幕寬高 self.width = bg_size[0] self.height = bg_size[1] # get_rect()是一個處理矩形圖像的方法,返回值包含矩形的居中屬性,這里返回飛機圖片1的位置,可以獲取圖片的寬高等屬性 self.rect = self.image1.get_rect() # 飛機的初始化位置,//是整除,位置居中以及高度為圖片下框離屏幕最下方60 self.rect.left = (self.width - self.rect.width)//2 self.rect.top = self.height - self.rect.height - 60 # 設置飛機的速度 self.myPlaneSpeed = 10 self.active = True # 設置飛機是否是無敵狀態(重生3秒內無敵) self.invincible = True # 飛機碰撞檢測,會忽略掉圖片中白色的背景部分,從指定 Surface 對象中返回一個 Mask # 用於快速實現完美的碰撞檢測,Mask 可以精確到 1 個像素級別的判斷。 # Surface 對象中透明的部分設置為 1,不透明部分設置為 0。 self.mask = pygame.mask.from_surface(self.image1) # 玩家飛機向上移動 def moveUp(self): # 說明還沒定格,即還未到達游戲界面上邊界 if self.rect.top > 0: self.rect.top -= self.myPlaneSpeed # 說明移動到達上邊界了 else: self.rect.top = 0 # 玩家飛機向下移動 def moveDown(self): # 底部需要划出60的高度用來展示其他數據(炸彈數,生命數等) if self.rect.bottom < self.height - 60: # self.rect.bottom指的是飛機圖片下邊界 self.rect.bottom += self.myPlaneSpeed else: self.rect.bottom = self.height - 60 # 玩家飛機向左移動 def moveLeft(self): if self.rect.left > 0: self.rect.left -= self.myPlaneSpeed else: self.rect.left = 0 # 玩家飛機向右移動 def moveRight(self): if self.rect.right < self.width: self.rect.right += self.myPlaneSpeed else: self.rect.right = self.width # 玩家飛機重生 def reset(self): self.active = True # 重生時處於無敵狀態 self.invincible = True # 重生飛機的初始化位置,//是整除,位置居中以及高度為圖片下框離屏幕最下方60 self.rect.left = (self.width - self.rect.width) // 2 self.rect.top = self.height - self.rect.height - 60
對其中某一步不清楚的,也可以提出來,我也是小菜雞,屬於摸索階段,有問題請輕點噴
然后運行main.py的時候,就可以控制游戲玩家的飛機進行移動了(后面會慢慢加上各種其他功能)