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

Pygame初學(xué)者教程 -蟒蛇游戲開(kāi)發(fā)課程_第1節(jié) #硬聲創(chuàng)作季

Pygame初學(xué)者教程 -蟒蛇游戲開(kāi)發(fā)課程_第2節(jié) #硬聲創(chuàng)作季

Pygame初學(xué)者教程 -蟒蛇游戲開(kāi)發(fā)課程_第3節(jié) #硬聲創(chuàng)作季

Pygame初學(xué)者教程 -蟒蛇游戲開(kāi)發(fā)課程_第4節(jié) #硬聲創(chuàng)作季

Pygame初學(xué)者教程 -蟒蛇游戲開(kāi)發(fā)課程_第5節(jié) #硬聲創(chuàng)作季

Pygame初學(xué)者教程 -蟒蛇游戲開(kāi)發(fā)課程_第7節(jié) #硬聲創(chuàng)作季

Pygame初學(xué)者教程 -蟒蛇游戲開(kāi)發(fā)課程_第9節(jié) #硬聲創(chuàng)作季

Pygame初學(xué)者教程 -蟒蛇游戲開(kāi)發(fā)課程_第10節(jié) #硬聲創(chuàng)作季
【DragonBoard 410c試用體驗(yàn)】之添加simpleCV庫(kù)和Python IDLE
python開(kāi)發(fā)ide哪個(gè)好?
快速學(xué)會(huì)用python寫(xiě)游戲
如何用Python創(chuàng)建自己的Dino Run?
零基礎(chǔ)學(xué)python基礎(chǔ)教程PDF電子書(shū)免費(fèi)下載
【飛凌RZ/G2L開(kāi)發(fā)板試用體驗(yàn)】開(kāi)發(fā)環(huán)境體驗(yàn)之python開(kāi)發(fā)2048小游戲

評(píng)論