pygame 基本介紹與使用
介紹
安裝
- 在命令窗口輸入:pip3 install pygame
- 驗證安裝成功,在命令窗口輸入**:python -m pygame.examples.aliens**
**游戲的初始化與退出
**
- 要使用 pygame 提供所有功能之前,需要調用 init 方法
- 在游戲結束時,需要調用 quit 方法,卸載所有pygame模塊
方法 | 說明 |
---|---|
pygame.init() | 導入并初始化所有pygame模塊,使用其它模塊之前,必須先調用 init 方法 |
pygame.quit() | 卸載所有pygame模塊,在游戲結束前調用 |
游戲中的坐標系
- **原點 **指游戲窗口的左上角 ,坐標是 0,0
- **x軸 **水平方向向右,逐漸增加
- **y軸 **垂直方向向下,逐漸增加
- 在游戲中,所有可見的元素都是以 矩形區域 來描述位置的
- 描述一個矩形區域有四個要素:x、y、width、height
- pygame 專門提供了一個類 **pygame.Rect **用于描述 矩形區域
- pygame.Rect 是一個 比較特殊的類 ,內部只是封裝了一些數字計算,不執行pygame.init() 方法同樣能夠使用
示例
import pygame
# 定義一個英雄的矩形,參數:x軸,y軸,寬,高
hero_rect=pygame.Rect(100,300,120,50)
print("英雄的原點是:%d,%d"%(hero_rect.x,hero_rect.y))
print("英雄的寬高是:%d,%d"%(hero_rect.width,hero_rect.height))
創建游戲主窗口
- pygame 專門提供了一個模塊 pygame.display 用于創建和管理游戲窗口
方法 | 說明 |
---|---|
pygame.display.set_mode(resolution=(0,0),flags=0,depth=0) | 初始化游戲顯示窗口參數:resolution: 指定屏幕的寬和高,默認創建的窗口大小和屏幕大小一致flags:指定屏幕的附加選項,例如是否全屏等,默認不需要傳遞depth:表示顏色的位數,默認自動匹配 |
pygame.display.update() | 刷新屏幕內容顯示 |
- 圖****像繪制
- 使用 pygame.image.load() 加載圖像的數據
- 使用 游戲屏幕 對象,調用 blit() 方法,將圖像繪制到指定位置
- 調用** pygame.update()** 方法更新整個屏幕顯示
示例
pygame.init()
# 創建游戲的主窗口,只指定寬和高
screen=pygame.display.set_mode((512,768))
# 加載圖像
bg=pygame.image.load("./img/bg1.jpg")
# 在屏幕上繪制圖像
screen.blit(bg,(0,0))
# 更新屏幕顯示
pygame.display.update()
**游戲中的動畫原理
**
- 動畫的本質就是 快速 的在屏幕上繪制 圖像
- 電影是將多張 靜止的電影膠片 連續、快速的播放,產生連貫的視覺效果
- 一般在電腦上 每秒繪制60次 ,就能夠達到非常連續、高品質的動畫效果
- 每次繪制的結果被稱為 幀Frame
- 游戲時鐘
- pygame 專門提供了一個類 pygame.time.Clock 可以非常方便的設置屏幕繪制速度(刷新頻率)
- 在游戲初始化 創建一個 時鐘對象
- 在游戲循環中, 讓時鐘對象調用** tick(幀率) 方法**
- tick 方法會根據 上次被調用的時間,自動設置 游戲循環 中的延時
示例
# 創建游戲時鐘
clock=pygame.time.Clock()
while True:
# 設置每秒刷新60次
clock.tick(60)
游戲的事件與監聽(event)
- 事件 :就是游戲啟動后,用戶針對游戲所做的操作 (例如:點擊關閉按鈕)
- pygame 中通過 pygame.event.get() 可以獲取 用戶當前所做的動作 的事件列表
- 這段代碼非常的固定,幾乎所有的 pygame 游戲都大同小異
- 監聽: 在游戲循環中,判斷用戶的** 具體操作**
示例
while True:
# 設置每秒刷新60次
clock.tick(60)
# 監聽用戶點擊關閉按鈕
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
# 退出系統
exit()
pygame 高級使用
精靈與精靈組
- 精靈(pygame.sprite.Sprite)
- 在游戲開發中,通過把 顯示圖像的對象 叫做精靈
- 精靈有兩個重要的屬性
- image:記錄圖像數據
- rect:記錄在屏幕上的位置
- update(*args):更新精靈的位置
- kill():從所有組中刪除
- Sprite 并沒有提供 image 和 rect 兩個屬性
- 需要程序員從 pygame.sprite.Sprite 派生子類
- 并在子類的初始化方法中設置 image和rect屬性
- 精靈組 (pygame.sprite.Group)****
- 一個精靈組可以包含多個精靈對象
- 調用精靈組對象的** update方法** 會自動調用組內每個精靈的 update方法
- 調用精靈組的 draw(屏幕對象) 方法,可以將組內每一個精靈的image 繪制在 rect 位置
- 注:仍需要調用 pygame.display.update() 才能在屏幕上看到最終結果
示例
plane_sprites.py 模塊(定義派生精靈子類)
import pygame
# 自定義派生精靈子類,繼承pygame.sprite.Sprite
class GameSprites(pygame.sprite.Sprite):
"""游戲精靈基類"""
def __init__(self,img_name,speed=1):
# 調用父類的初始化方法
super().__init__()
# 加載圖像
self.image=pygame.image.load(img_name)
# 設置尺寸; get_rect()可以獲取圖像的原始大小
self.rect=self.image.get_rect()
# 設置速度
self.speed=speed
def update(self):
# 默認在屏幕上垂直方向移動
self.rect.y+=self.speed
main.py
from plane_sprites import *
pygame.init()
# 創建游戲的主窗口,只指定寬和高
screen=pygame.display.set_mode((512,768))
# 加載圖像
bg=pygame.image.load("./img/bg1.jpg")
# 在屏幕上繪制圖像
screen.blit(bg,(0,0))
# 定義英雄飛機
hero_img=pygame.image.load("./img/hero.png")
screen.blit(hero_img,(200,500))
# 創建游戲時鐘
clock=pygame.time.Clock()
hero_rect=pygame.Rect(200,500,120,79)
# 創建敵機的精靈
enemy1=GameSprites("./img/enemy1.png")
enemy2=GameSprites("./img/enemy1.png",2)
# 將精靈放入精靈組
enemy_group=pygame.sprite.Group(enemy1,enemy2)
while True:
# 設置每秒刷新60次
clock.tick(60)
hero_rect.y-=1
if hero_rect.bottom <= 0:
hero_rect.top = 768
screen.blit(bg,(0,0))
screen.blit(hero_img,hero_rect)
# 精靈組調用兩個方法,更新位置和在屏幕上繪制精靈
enemy_group.update()
enemy_group.draw(screen)
pygame.display.update()
# 監聽用戶點擊關閉按鈕
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
# 退出系統
exit()
**定時器
**
- pygame中可以使用 pygame.time.set_timer() 來添加定時器
- 定時器:就是每隔一段時間,去執行一些動作
- **set_timer **可以創建一個事件
- 可以在游戲循環的** 事件監聽中**捕獲到該事件
- 定時器的監聽
- 通過 pygame.event.get() 可以獲取當前時刻所有的事件列表
- 遍歷列表 并且判斷 event.type 是否等于 eventid,如果相等,表示**定時器事件 **發生
語法
"""
第1個參數 事件代號 需要基于常量 pygame.USEREVENT 來指定,
USEREVENT 是一個整數,再增加的事件可以使用 USEREVENT+1 指定,依次類推.
第2個參數是 事件觸發 間隔的毫秒值.
"""
set_timer(eventid,milliseconds) ——>None
示例
# 自定義事件
EVENT_ENEMY=pygame.USEREVENT
# 添加定時器,每秒執行一次自定義事件
pygame.time.set_timer(EVENT_ENEMY,1000)
# 監聽事件
while True:
for event in pygame.event.get():
# 監聽自定義事件
if event.type == EVENT_ENEMY:
print("自定義事件觸發了...")
# 監聽退出事件
if event.type == pygame.QUIT:
# 卸載模塊
pygame.quit()
# 退出系統
exit()
鍵盤按鍵捕****獲
- 在 pygame 中針對鍵盤按鍵的捕獲有** 兩種方式**
- 方式1:通過 event.type == pygame.KEYDOWN
- 方式2:通過 pygame.key.get_pressed() 返回 所有按鍵元組,通過鍵盤常量,判斷元組中 某一個鍵是否被按下 ——如果被按下,對應數值為 1( 注:此種方式可以應對 長時間按住某個鍵)
第一種方式語法
if event.type== pygame.KEYDOWN and event.key==pygame.K_RIGHT:
print("向右移動...")
第二種方式語法
# 返回所有按鍵的元組,如果某個按鍵按下,對應的值是1
keys_pressed=pygame.key.get_pressed()
if keys_pressed[pygame.K_RIGHT]:
print("向右移動...")
碰撞檢測
- pygame 提供了兩個非常方便的方法,可以實現碰撞檢測
- 方法一:pygame.sprite.groupcollide()
- 檢測兩個精靈組中 所有的精靈 的碰撞檢測
-
groupcollide(group1,group2,dokill1,dokill2,collided=None)——> Dict[Sprite, Sprite]
- 如果將dokill 設置為 True,則發生碰撞的精靈將被自動移除
- collided 參數用于 計算碰撞的回調函數 ,如果沒有指定,則每個精靈必須有一個 rect 屬性
- 方法二:pygame.sprite.spritecollide()
- 檢測** 某個精靈** 和指定精靈組 中的精靈的碰撞
-
spritecollide(sprite,group,dokill,collided=None)——> List[Sprite]
- 如果將 dokill 設置為 True,則指定精靈組中發生碰撞的精靈將自動被移除
- collided 碼數用于 計算碰撞的回調函數 ,如果沒有指定,則每個精靈必須有一個 rect 屬性
- 返回 精靈組 中跟精靈** 發生碰撞的 **精靈列表
繪制字體
- 在 pygame 中有三個步驟
- 步驟1:使用** pygame.font.Font **方法初始化字體
- 步驟2:使用 font.render( 內容, 布爾值,是否開啟抗鋸齒, 字體顏色,字體背景(不填,默認是透明))
- 步驟3:使用** 屏幕對象.blit(字體對象,位置)**
**示例:
**
# 第一個參數是字體名,第二個大小
# 字體文件可以在自己的系統中查找,然后拷貝到 代碼同級目錄下即可。
# 字體文件路徑,以下以win7為例:C:\\Windows\\Fonts\\微軟雅黑
my_font = pygame.font.Font("msyh.ttf",58)
# 第一個參數是寫的文字;
# 第二個參數是個布爾值,以為這是否開啟抗鋸齒,就是說True的話字體會比較平滑,不過相應的速度有一點點影響;
# 第三個參數是字體的顏色;
# 第四個參數是背景色,如果你想沒有背景色(也就是透明),那么可以不加這第四個參數。
ext_surface = my_font.render("Pygame Score! ", True, (0,0,0), (255, 255, 255))
# 在屏幕上繪制字體,第一個參數是字體對象,第二個參數是x,y軸的位置
screen.blit(text_surface, (0, 0))
# 刷新屏幕
pygame.display.update()
播放音****樂
- 在 pygame 中用 pygame.mixer模塊 來播放音樂,其中播放音樂有兩種方式
- 方式一: pygame.mixer.music.load( 音頻文件名 )
- 可以播放OGG、WAV、mp3 等格式音頻
- 適用音樂文件比較大,時長比較長的音樂,比如背景音樂
- 方式二: pygame.mixer.Sound( 音頻文件名 )
- 可以播放OGG、WAV、mp3 等格式音頻
- 這種方式一般是用來加載一些比較短的聲音,比如一些音效
示例
# 方式一 ,加載背景音樂
pygame.mixer.music.load("./music/bg.mp3") # 加載背景音樂
pygame.mixer.music.set_volume(0.5) # 設置音量,音量值在 0~1 區間
pygame.mixer.music.play(-1) # 播放音樂,參數是一個正整數,表示具體循環次數, -1 則表示無限循環
# 方式二 ,加載短音效,如 爆炸,發射子彈等
boomMusic = pygame.mixer.Sound("./music/boom.mp3") # 加載背景音樂
boomMusic.set_volume(0.3) # 設置音量,音量值在 0~1 區間
boomMusic.play() # 播放音樂,參數是一個正整數,表示具體循環次數, 不填寫,默認是一次
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
模塊
+關注
關注
7文章
2723瀏覽量
47603 -
電子游戲
+關注
關注
0文章
39瀏覽量
9940 -
python
+關注
關注
56文章
4801瀏覽量
84849
發布評論請先 登錄
相關推薦
【DragonBoard 410c試用體驗】之添加simpleCV庫和Python IDLE
-numpy python-pygame python-setuptools python-pip步驟2:通過pip命令下載并安裝SimpleCVsudo pip install https://github.com
發表于 09-07 22:18
python開發ide哪個好?
有,IDEL用Python實現的Python的IDE工具,但說實話,功能真心不咋地。我個人常用的IDE如下:PyCharmPyCharm是JetBrains開發的Python IDE。
發表于 06-07 14:55
如何用Python創建自己的Dino Run?
,讓我們直接進入教程,如何用Python創建自己的Dino Run?請遵循所有精心給出的說明,以免在運行Dino Run游戲時出現任何問題?! ∪绾斡?b class='flag-5'>Python創建自己的Dino Run? 首先,從安裝
發表于 07-21 18:11
零基礎學python基礎教程PDF電子書免費下載
程序管理的知識和技術。全書共分 17 章,包括初識 Python、Python 語言基礎、流程控制語句、序列的應用、Pygame 游戲編程、網絡爬蟲
發表于 09-29 08:00
?27次下載
【飛凌RZ/G2L開發板試用體驗】開發環境體驗之python開發2048小游戲
本文來源電子發燒友社區,作者:李先生, 帖子地址: https://bbs.elecfans.com/jishu_2299870_1_1.html Python開發環境體驗:2048游戲 前言 查看
評論