(二)通過pygame讓遊戲人物 動起來


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()

在這裏插入圖片描述

可以看到 確實是每秒一下地輸出了數字

英雄的簡單動畫實現

  1. 在遊戲初始化定義一個pygame.Rect的變量記錄英雄的初始位置
  2. 在遊戲循環中每次讓英雄的y-1 —向上移動(因爲左上角是座標原點,y軸數值是從上到下依次遞增的,y值變小就是向屏幕上方移動)
  3. 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()

運行,可以看到飛機飛出屏幕問題也解決了

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章