python飛機大戰系列文章(按順序)
(一)通過pygame 將自己的圖像添加到遊戲中
(二)通過pygame讓遊戲人物 動起來
(三)通過pygame處理用戶的鼠標鍵盤操作(事件和監聽
(四)詳解pygame中的精靈和精靈組
(五)通過pygame搭建遊戲框架
(六)通過pygame讓遊戲背景圖像實現交替滾動
(七)通過pygame來設置飛機大戰中 敵機 的速度、位置等
(八)通過pygame來操控遊戲人物的移動
(九)通過pygame使遊戲人物發射子彈
(十)通過pygame來進行碰撞檢測
怎麼樣才能讓遊戲中的人物動起來呢?
- 需要刷新屏幕,讓人物在每一幀中變換位置,這樣在達到每秒60幀(或以上)的速度下,就可以實現人物動起來的效果
首先,得知到遊戲循環的刷新幀率
利用時鐘,設置遊戲循環的刷新幀率
正常來說,python在進行無限循環的時候, 速度是非常快的,如以下代碼:
import pygame
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, (200,500))
#在繪製完所有圖像後,再統一調用update方法
pygame.display.update()
i = 0
while True:
print(i)
i+=1
pygame.quit()
運行結果如下:
可以看到,短短几秒鐘就已經跑了100多萬了,但是我們遊戲循環中的代碼不需要執行的這麼快,大概每秒執行60次效果就挺好的,那麼需要怎麼解決呢??
- pygame中提供了一個類
pygame.time.Clock
,可以非常方便的設置屏幕的繪製速度 ----刷新幀率 - 使用時鐘對象需要兩步:①在遊戲初始化創建一個時鐘對象②在遊戲循環中讓時鐘對象調用tick(頻率)方法
- tick方法會根據上次被調用的時間,自動設置遊戲循環中的延時
代碼如下:
import pygame
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, (200,500))
#在繪製完所有圖像後,再統一調用update方法
pygame.display.update()
i = 0
#創建時鐘對象
clock = pygame.time.Clock()
while True:
#假設 設定每秒1下
clock.tick(1)
print(i)
i+=1
pygame.quit()
可以看到 確實是每秒一下地輸出了數字
英雄的簡單動畫實現
- 在遊戲初始化定義一個pygame.Rect的變量記錄英雄的初始位置
- 在遊戲循環中每次讓英雄的y-1 —向上移動(因爲左上角是座標原點,y軸數值是從上到下依次遞增的,y值變小就是向屏幕上方移動)
- y<=0 將英雄移動到屏幕底部
代碼如下:
import pygame
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)
while True:
clock.tick(1)
#修改飛機的位置
hero_rect.y -= 50
#調用blit方法繪製圖像
screen.blit(hero, hero_rect)
#調用update方法更新顯示
pygame.display.update()
pygame.quit()
可以看到英雄的飛機在向上移動了
但是,英雄飛機移動時會留下飛機的殘影,這要怎麼解決呢?
- 只需要在每次繪製飛機之前,再將背景繪製一下
import pygame
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)
while True:
clock.tick(1)
#修改飛機的位置
hero_rect.y -= 50
#調用blit方法繪製圖像
screen.blit(bg, (0,0))#在每次繪製飛機之前,再將背景繪製一下
screen.blit(hero, hero_rect)
#調用update方法更新顯示
pygame.display.update()
pygame.quit()
可以看出,殘影問題就解決啦
那現在飛機在一直往上飛,要是飛出屏幕了咋辦?我們設定如果飛機飛出屏幕,那麼就從屏幕底部重新飛出來
import pygame
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)
while True:
clock.tick(60)
#修改飛機的位置
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方法更新顯示
pygame.display.update()
pygame.quit()
運行,可以看到飛機飛出屏幕問題也解決了