python飛機大戰系列文章(按順序)
(一)通過pygame 將自己的圖像添加到遊戲中
(二)通過pygame讓遊戲人物 動起來
(三)通過pygame處理用戶的鼠標鍵盤操作(事件和監聽
(四)詳解pygame中的精靈和精靈組
(五)通過pygame搭建遊戲框架
(六)通過pygame讓遊戲背景圖像實現交替滾動
(七)通過pygame來設置飛機大戰中 敵機 的速度、位置等
(八)通過pygame來操控遊戲人物的移動
(九)通過pygame使遊戲人物發射子彈
(十)通過pygame來進行碰撞檢測
精靈和精靈組
在之前的例子中,對於一個小遊戲的圖像加載、圖像的位置變換、繪製圖像都需要程序員編寫代碼來一個個地處理,但是如果我們的遊戲需要處理很多張圖像,那麼代碼內部將會非常複雜 ,因爲我們要在每一個遊戲循環中,一個圖像移動一次就需要寫一次代碼。那麼需要如何解決這個問題呢??—精靈和精靈組
爲了簡化開發遊戲的步驟,pygame提供了兩個類
pygame.sprite.Sprite
—儲存圖像數據image和位置rect的對象pygame.sprite.Group
精靈類(需要派生子類) |
---|
屬性:①image 記錄圖像數據 ;②rect 記錄在屏幕上的位置 |
方法:①update(*args)更新精靈位置 ; ②kill()從所有組中刪除 |
【爲什麼需要派生子類】:因爲不同的遊戲角色在遊戲中的運動方式是不一樣的,所以需要根據不同的遊戲角色來派生出不同的遊戲子類
在遊戲開發中,可以根據不同的遊戲角色,派生出不同的子類,再在每一個子類中,分別重寫各自的update方法
精靈組 |
---|
__init__ (self, *精靈): |
add(*sprites): 向組中增加精靈 |
sprites():返回所有精靈列表 |
update(*args):讓組中所有精靈調用各自的update方法 |
draw(Surface):將組中所有精靈的image,繪製到Surface的rect位置 |
使用多值參數 *精靈
:一次性處理精靈組中包含的所有精靈
派生精靈子類
- 新建一個名爲
plane_sprites.py
的文件 - 定義GameSprite繼承自pygam.sprite.Sprite
注意:
- 如果一個類的父類不是object基類,那麼在重寫初始化方法的時候,一定要先主動的super()一下父類的
__init__
方法,來保證父類中實現的__init__
代碼能夠正常的執行,要是不主動地
super().__init__()
就沒有辦法享受到父類中已經封裝好的初始化代碼了
屬性:
- image 精靈圖像,使用image_name加載
- rect 精靈大小,默認使用圖像大小
- speed 精靈移動速度,默認爲1
方法:
- update 每次更新屏幕時在遊戲循環內調用,讓精靈的
self.rect.y += self.speed
提示:
- image的get_rect()方法,可以返回
pygame.Rect(0,0,圖圖像寬,圖像高)
的對象
代碼爲:
import pygame
class GameSprite(pygame.sprite.Sprite):
"""飛機大戰遊戲精靈"""
def __init__(self, image_name, speed=1):
#調用父類的初始化方法
super().__init__()
#定義對象屬性
self.image = pygame.image.load(image_name)
self.rect = self.image.get_rect()
self.speed = speed
def update(self):
#在屏幕垂直方向上移動
self.rect.y += self.speed
使用遊戲精靈和精靈組 創建敵機
需求:
- 使用前面派生的遊戲精靈和精靈組創建敵機並且實現敵機動畫
步驟:
- 導入plane_sprites模塊
- 在 遊戲初始化 創建 精靈對象 和 精靈對象組
- 在遊戲循環中,讓精靈組分別調用update()和draw(screen)方法
職責:
精靈:
①封裝圖像image、位置rect、速度speed
②提供update()方法,根據遊戲需求,更新位置rect
精靈組:
①包含多個精靈對象
②update方法,讓精靈組中的所有精靈調用update方法更新位置
③draw(screen)方法,在screen上繪製精靈組中的所有精靈
代碼如下:
import pygame
from plane_sprites import *
pygame.init()
#創建遊戲窗口 大小爲480 * 700
#繪製背景圖像
screen = pygame.display.set_mode((480,700))
#加載圖像數據
bg = pygame.image.load(r'.\images\background.png')
#通過blit來繪製圖像,從遊戲窗口screen的(0,0)處開始繪製
screen.blit(bg, (0,0))
#繪製自己的小飛機
hero = pygame.image.load(r'.\images\me1.png')
screen.blit(hero, (150,300))
#在繪製完所有圖像後,再統一調用update方法
pygame.display.update()
#創建時鐘對象
clock = pygame.time.Clock()
#定義rect記錄飛機的初始位置,102,126分別爲飛機圖片的寬高
hero_rect = pygame.Rect(150, 300, 102, 126)
#創建敵機的精靈
enemy = GameSprite("./images/enemy1.png")
#創建敵機的精靈組
enemy_group = pygame.sprite.Group(enemy)
#遊戲循環,意味着遊戲正式開始
while True:
clock.tick(60)
#監聽事件
for event in pygame.event.get():
#判斷事件類型是否是退出事件
if event.type == pygame.QUIT:
print("遊戲退出...")
#quit卸載所有的模塊
pygame.quit()
#exit()退出程序
exit()
#修改飛機的位置
hero_rect.y -= 1
#判斷飛機位置
if hero_rect.y <= 0:
hero_rect.y = 700
#調用blit方法繪製圖像
screen.blit(bg, (0,0))#在每次繪製飛機之前,再將背景繪製一下
screen.blit(hero, hero_rect)
#讓精靈組調用兩個方法
#update :讓組中的所有的精靈更新位置
enemy_group.update()
#draw :在screen 上繪製所有的精靈
enemy_group.draw(screen)
#調用update方法更新顯示
pygame.display.update()
pygame.quit()
運行:
可以看到 有一個敵機在往下運動了,那麼再添加敵機也很簡單 :使用GameSprite再添加敵機,並且只需在精靈組的參數中,多加一個敵機就好了,並不需要在遊戲循環中再修改任何代碼,代碼如下:
import pygame
from plane_sprites import *
pygame.init()
#創建遊戲窗口 大小爲480 * 700
#繪製背景圖像
screen = pygame.display.set_mode((480,700))
#加載圖像數據
bg = pygame.image.load(r'.\images\background.png')
#通過blit來繪製圖像,從遊戲窗口screen的(0,0)處開始繪製
screen.blit(bg, (0,0))
#繪製自己的小飛機
hero = pygame.image.load(r'.\images\me1.png')
screen.blit(hero, (150,300))
#在繪製完所有圖像後,再統一調用update方法
pygame.display.update()
#創建時鐘對象
clock = pygame.time.Clock()
#定義rect記錄飛機的初始位置,102,126分別爲飛機圖片的寬高
hero_rect = pygame.Rect(150, 300, 102, 126)
#創建敵機的精靈
enemy = GameSprite("./images/enemy1.png")
#再創建速度爲2的敵機
enemy2 = GameSprite("./images/enemy1.png",2)
#創建敵機的精靈組
enemy_group = pygame.sprite.Group(enemy,enemy2)
#遊戲循環,意味着遊戲正式開始
while True:
clock.tick(60)
#監聽事件
for event in pygame.event.get():
#判斷事件類型是否是退出事件
if event.type == pygame.QUIT:
print("遊戲退出...")
#quit卸載所有的模塊
pygame.quit()
#exit()退出程序
exit()
#修改飛機的位置
hero_rect.y -= 1
#判斷飛機位置
if hero_rect.y <= 0:
hero_rect.y = 700
#調用blit方法繪製圖像
screen.blit(bg, (0,0))#在每次繪製飛機之前,再將背景繪製一下
screen.blit(hero, hero_rect)
#讓精靈組調用兩個方法
#update :讓組中的所有的精靈更新位置
enemy_group.update()
#draw :在screen 上繪製所有的精靈
enemy_group.draw(screen)
#調用update方法更新顯示
pygame.display.update()
pygame.quit()