pygame 基本介紹與使用
介紹
- pygame 就是一個Python 模塊,專為電子游戲設(shè)計
- 官方網(wǎng)站:www.pygame.org
- Pygame 是一個高可移植性的模塊可以支持多個操作系統(tǒng)
安裝
- 在命令窗口輸入:pip3 install pygame
- 驗證安裝成功,在命令窗口輸入**:python -m pygame.examples.aliens**
**游戲的初始化與退出
**
- 要使用 pygame 提供所有功能之前,需要調(diào)用 init 方法
- 在游戲結(jié)束時,需要調(diào)用 quit 方法,卸載所有pygame模塊
方法 | 說明 |
---|---|
pygame.init() | 導(dǎo)入并初始化所有pygame模塊,使用其它模塊之前,必須先調(diào)用 init 方法 |
pygame.quit() | 卸載所有pygame模塊,在游戲結(jié)束前調(diào)用 |
游戲中的坐標系
- **原點 **指游戲窗口的左上角 ,坐標是 0,0
- **x軸 **水平方向向右,逐漸增加
- **y軸 **垂直方向向下,逐漸增加
- 在游戲中,所有可見的元素都是以 矩形區(qū)域 來描述位置的
- 描述一個矩形區(qū)域有四個要素:x、y、width、height
- pygame 專門提供了一個類 **pygame.Rect **用于描述 矩形區(qū)域
- pygame.Rect 是一個 比較特殊的類 ,內(nèi)部只是封裝了一些數(shù)字計算,不執(zhí)行pygame.init() 方法同樣能夠使用
示例
import pygame
# 定義一個英雄的矩形,參數(shù):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))
創(chuàng)建游戲主窗口
- pygame 專門提供了一個模塊 pygame.display 用于創(chuàng)建和管理游戲窗口
方法 | 說明 |
---|---|
pygame.display.set_mode(resolution=(0,0),flags=0,depth=0) | 初始化游戲顯示窗口參數(shù):resolution: 指定屏幕的寬和高,默認創(chuàng)建的窗口大小和屏幕大小一致flags:指定屏幕的附加選項,例如是否全屏等,默認不需要傳遞depth:表示顏色的位數(shù),默認自動匹配 |
pygame.display.update() | 刷新屏幕內(nèi)容顯示 |
- 圖****像繪制
- 使用 pygame.image.load() 加載圖像的數(shù)據(jù)
- 使用 游戲屏幕 對象,調(diào)用 blit() 方法,將圖像繪制到指定位置
- 調(diào)用** pygame.update()** 方法更新整個屏幕顯示
示例
pygame.init()
# 創(chuàng)建游戲的主窗口,只指定寬和高
screen=pygame.display.set_mode((512,768))
# 加載圖像
bg=pygame.image.load("./img/bg1.jpg")
# 在屏幕上繪制圖像
screen.blit(bg,(0,0))
# 更新屏幕顯示
pygame.display.update()
**游戲中的動畫原理
**
- 動畫的本質(zhì)就是 快速 的在屏幕上繪制 圖像
- 電影是將多張 靜止的電影膠片 連續(xù)、快速的播放,產(chǎn)生連貫的視覺效果
- 一般在電腦上 每秒繪制60次 ,就能夠達到非常連續(xù)、高品質(zhì)的動畫效果
- 每次繪制的結(jié)果被稱為 幀F(xiàn)rame
- 游戲時鐘
- pygame 專門提供了一個類 pygame.time.Clock 可以非常方便的設(shè)置屏幕繪制速度(刷新頻率)
- 在游戲初始化 創(chuàng)建一個 時鐘對象
- 在游戲循環(huán)中, 讓時鐘對象調(diào)用** tick(幀率) 方法**
- tick 方法會根據(jù) 上次被調(diào)用的時間,自動設(shè)置 游戲循環(huán) 中的延時
示例
# 創(chuàng)建游戲時鐘
clock=pygame.time.Clock()
while True:
# 設(shè)置每秒刷新60次
clock.tick(60)
游戲的事件與監(jiān)聽(event)
- 事件 :就是游戲啟動后,用戶針對游戲所做的操作 (例如:點擊關(guān)閉按鈕)
- pygame 中通過 pygame.event.get() 可以獲取 用戶當前所做的動作 的事件列表
- 這段代碼非常的固定,幾乎所有的 pygame 游戲都大同小異
- 監(jiān)聽: 在游戲循環(huán)中,判斷用戶的** 具體操作**
示例
while True:
# 設(shè)置每秒刷新60次
clock.tick(60)
# 監(jiān)聽用戶點擊關(guān)閉按鈕
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
# 退出系統(tǒng)
exit()
pygame 高級使用
精靈與精靈組
- 精靈(pygame.sprite.Sprite)
- 在游戲開發(fā)中,通過把 顯示圖像的對象 叫做精靈
- 精靈有兩個重要的屬性
- image:記錄圖像數(shù)據(jù)
- rect:記錄在屏幕上的位置
- update(*args):更新精靈的位置
- kill():從所有組中刪除
- Sprite 并沒有提供 image 和 rect 兩個屬性
- 需要程序員從 pygame.sprite.Sprite 派生子類
- 并在子類的初始化方法中設(shè)置 image和rect屬性
- 精靈組 (pygame.sprite.Group)****
- 一個精靈組可以包含多個精靈對象
- 調(diào)用精靈組對象的** update方法** 會自動調(diào)用組內(nèi)每個精靈的 update方法
- 調(diào)用精靈組的 draw(屏幕對象) 方法,可以將組內(nèi)每一個精靈的image 繪制在 rect 位置
- 注:仍需要調(diào)用 pygame.display.update() 才能在屏幕上看到最終結(jié)果
示例
plane_sprites.py 模塊(定義派生精靈子類)
import pygame
# 自定義派生精靈子類,繼承pygame.sprite.Sprite
class GameSprites(pygame.sprite.Sprite):
"""游戲精靈基類"""
def __init__(self,img_name,speed=1):
# 調(diào)用父類的初始化方法
super().__init__()
# 加載圖像
self.image=pygame.image.load(img_name)
# 設(shè)置尺寸; get_rect()可以獲取圖像的原始大小
self.rect=self.image.get_rect()
# 設(shè)置速度
self.speed=speed
def update(self):
# 默認在屏幕上垂直方向移動
self.rect.y+=self.speed
main.py
from plane_sprites import *
pygame.init()
# 創(chuàng)建游戲的主窗口,只指定寬和高
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))
# 創(chuàng)建游戲時鐘
clock=pygame.time.Clock()
hero_rect=pygame.Rect(200,500,120,79)
# 創(chuàng)建敵機的精靈
enemy1=GameSprites("./img/enemy1.png")
enemy2=GameSprites("./img/enemy1.png",2)
# 將精靈放入精靈組
enemy_group=pygame.sprite.Group(enemy1,enemy2)
while True:
# 設(shè)置每秒刷新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)
# 精靈組調(diào)用兩個方法,更新位置和在屏幕上繪制精靈
enemy_group.update()
enemy_group.draw(screen)
pygame.display.update()
# 監(jiān)聽用戶點擊關(guān)閉按鈕
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
# 退出系統(tǒng)
exit()
**定時器
**
- pygame中可以使用 pygame.time.set_timer() 來添加定時器
- 定時器:就是每隔一段時間,去執(zhí)行一些動作
- **set_timer **可以創(chuàng)建一個事件
- 可以在游戲循環(huán)的** 事件監(jiān)聽中**捕獲到該事件
- 定時器的監(jiān)聽
- 通過 pygame.event.get() 可以獲取當前時刻所有的事件列表
- 遍歷列表 并且判斷 event.type 是否等于 eventid,如果相等,表示**定時器事件 **發(fā)生
語法
"""
第1個參數(shù) 事件代號 需要基于常量 pygame.USEREVENT 來指定,
USEREVENT 是一個整數(shù),再增加的事件可以使用 USEREVENT+1 指定,依次類推.
第2個參數(shù)是 事件觸發(fā) 間隔的毫秒值.
"""
set_timer(eventid,milliseconds) ——>None
示例
# 自定義事件
EVENT_ENEMY=pygame.USEREVENT
# 添加定時器,每秒執(zhí)行一次自定義事件
pygame.time.set_timer(EVENT_ENEMY,1000)
# 監(jiān)聽事件
while True:
for event in pygame.event.get():
# 監(jiān)聽自定義事件
if event.type == EVENT_ENEMY:
print("自定義事件觸發(fā)了...")
# 監(jiān)聽退出事件
if event.type == pygame.QUIT:
# 卸載模塊
pygame.quit()
# 退出系統(tǒng)
exit()
鍵盤按鍵捕****獲
- 在 pygame 中針對鍵盤按鍵的捕獲有** 兩種方式**
- 方式1:通過 event.type == pygame.KEYDOWN
- 方式2:通過 pygame.key.get_pressed() 返回 所有按鍵元組,通過鍵盤常量,判斷元組中 某一個鍵是否被按下 ——如果被按下,對應(yīng)數(shù)值為 1( 注:此種方式可以應(yīng)對 長時間按住某個鍵)
第一種方式語法
if event.type== pygame.KEYDOWN and event.key==pygame.K_RIGHT:
print("向右移動...")
第二種方式語法
# 返回所有按鍵的元組,如果某個按鍵按下,對應(yīng)的值是1
keys_pressed=pygame.key.get_pressed()
if keys_pressed[pygame.K_RIGHT]:
print("向右移動...")
碰撞檢測
- pygame 提供了兩個非常方便的方法,可以實現(xiàn)碰撞檢測
- 方法一:pygame.sprite.groupcollide()
- 檢測兩個精靈組中 所有的精靈 的碰撞檢測
-
groupcollide(group1,group2,dokill1,dokill2,collided=None)——> Dict[Sprite, Sprite]
- 如果將dokill 設(shè)置為 True,則發(fā)生碰撞的精靈將被自動移除
- collided 參數(shù)用于 計算碰撞的回調(diào)函數(shù) ,如果沒有指定,則每個精靈必須有一個 rect 屬性
- 方法二:pygame.sprite.spritecollide()
- 檢測** 某個精靈** 和指定精靈組 中的精靈的碰撞
-
spritecollide(sprite,group,dokill,collided=None)——> List[Sprite]
- 如果將 dokill 設(shè)置為 True,則指定精靈組中發(fā)生碰撞的精靈將自動被移除
- collided 碼數(shù)用于 計算碰撞的回調(diào)函數(shù) ,如果沒有指定,則每個精靈必須有一個 rect 屬性
- 返回 精靈組 中跟精靈** 發(fā)生碰撞的 **精靈列表
繪制字體
- 在 pygame 中有三個步驟
- 步驟1:使用** pygame.font.Font **方法初始化字體
- 步驟2:使用 font.render( 內(nèi)容, 布爾值,是否開啟抗鋸齒, 字體顏色,字體背景(不填,默認是透明))
- 步驟3:使用** 屏幕對象.blit(字體對象,位置)**
**示例:
**
# 第一個參數(shù)是字體名,第二個大小
# 字體文件可以在自己的系統(tǒng)中查找,然后拷貝到 代碼同級目錄下即可。
# 字體文件路徑,以下以win7為例:C:\\Windows\\Fonts\\微軟雅黑
my_font = pygame.font.Font("msyh.ttf",58)
# 第一個參數(shù)是寫的文字;
# 第二個參數(shù)是個布爾值,以為這是否開啟抗鋸齒,就是說True的話字體會比較平滑,不過相應(yīng)的速度有一點點影響;
# 第三個參數(shù)是字體的顏色;
# 第四個參數(shù)是背景色,如果你想沒有背景色(也就是透明),那么可以不加這第四個參數(shù)。
ext_surface = my_font.render("Pygame Score! ", True, (0,0,0), (255, 255, 255))
# 在屏幕上繪制字體,第一個參數(shù)是字體對象,第二個參數(shù)是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) # 設(shè)置音量,音量值在 0~1 區(qū)間
pygame.mixer.music.play(-1) # 播放音樂,參數(shù)是一個正整數(shù),表示具體循環(huán)次數(shù), -1 則表示無限循環(huán)
# 方式二 ,加載短音效,如 爆炸,發(fā)射子彈等
boomMusic = pygame.mixer.Sound("./music/boom.mp3") # 加載背景音樂
boomMusic.set_volume(0.3) # 設(shè)置音量,音量值在 0~1 區(qū)間
boomMusic.play() # 播放音樂,參數(shù)是一個正整數(shù),表示具體循環(huán)次數(shù), 不填寫,默認是一次
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報投訴
-
模塊
+關(guān)注
關(guān)注
7文章
2785瀏覽量
49990 -
電子游戲
+關(guān)注
關(guān)注
0文章
39瀏覽量
10069 -
python
+關(guān)注
關(guān)注
56文章
4825瀏覽量
86444
發(fā)布評論請先 登錄
相關(guān)推薦
熱點推薦

Pygame初學(xué)者教程 -蟒蛇游戲開發(fā)課程_第1節(jié) #硬聲創(chuàng)作季
游戲開發(fā)javascriptpython
充八萬
發(fā)布于 :2023年08月04日 14:37:43

Pygame初學(xué)者教程 -蟒蛇游戲開發(fā)課程_第2節(jié) #硬聲創(chuàng)作季
游戲開發(fā)javascriptpython
充八萬
發(fā)布于 :2023年08月04日 14:38:33

Pygame初學(xué)者教程 -蟒蛇游戲開發(fā)課程_第3節(jié) #硬聲創(chuàng)作季
游戲開發(fā)javascriptpython
充八萬
發(fā)布于 :2023年08月04日 14:39:23

Pygame初學(xué)者教程 -蟒蛇游戲開發(fā)課程_第4節(jié) #硬聲創(chuàng)作季
游戲開發(fā)javascriptpython
充八萬
發(fā)布于 :2023年08月04日 14:40:13

Pygame初學(xué)者教程 -蟒蛇游戲開發(fā)課程_第5節(jié) #硬聲創(chuàng)作季
游戲開發(fā)javascriptpython
充八萬
發(fā)布于 :2023年08月04日 14:41:04

Pygame初學(xué)者教程 -蟒蛇游戲開發(fā)課程_第7節(jié) #硬聲創(chuàng)作季
游戲開發(fā)javascriptpython
充八萬
發(fā)布于 :2023年08月04日 14:42:44

Pygame初學(xué)者教程 -蟒蛇游戲開發(fā)課程_第9節(jié) #硬聲創(chuàng)作季
游戲開發(fā)javascriptpython
充八萬
發(fā)布于 :2023年08月04日 14:44:25

Pygame初學(xué)者教程 -蟒蛇游戲開發(fā)課程_第10節(jié) #硬聲創(chuàng)作季
游戲開發(fā)javascriptpython
充八萬
發(fā)布于 :2023年08月04日 14:45:15
【DragonBoard 410c試用體驗】之添加simpleCV庫和Python IDLE
-numpy python-pygame python-setuptools python-pip步驟2:通過pip命令下載并安裝SimpleCVsudo pip install https://github.com
發(fā)表于 09-07 22:18
python開發(fā)ide哪個好?
有,IDEL用Python實現(xiàn)的Python的IDE工具,但說實話,功能真心不咋地。我個人常用的IDE如下:PyCharmPyCharm是JetBrains開發(fā)的Python IDE。
發(fā)表于 06-07 14:55
如何用Python創(chuàng)建自己的Dino Run?
,讓我們直接進入教程,如何用Python創(chuàng)建自己的Dino Run?請遵循所有精心給出的說明,以免在運行Dino Run游戲時出現(xiàn)任何問題。 如何用Python創(chuàng)建自己的Dino Run? 首先,從安裝
發(fā)表于 07-21 18:11
零基礎(chǔ)學(xué)python基礎(chǔ)教程PDF電子書免費下載
程序管理的知識和技術(shù)。全書共分 17 章,包括初識 Python、Python 語言基礎(chǔ)、流程控制語句、序列的應(yīng)用、Pygame 游戲編程、網(wǎng)絡(luò)爬蟲
發(fā)表于 09-29 08:00
?27次下載
【飛凌RZ/G2L開發(fā)板試用體驗】開發(fā)環(huán)境體驗之python開發(fā)2048小游戲
本文來源電子發(fā)燒友社區(qū),作者:李先生, 帖子地址: https://bbs.elecfans.com/jishu_2299870_1_1.html Python開發(fā)環(huán)境體驗:2048游戲 前言 查看

評論