這篇部落格裡涉及pygame中的圖檔、顔色、常用形狀、文字、音效、動畫切換、精靈與精靈組以及碰撞檢測等簡單基礎知識,為我寫的另一篇部落格《python實作飛機大戰》提供參考。
目錄
- 幫助文檔
- Pygame如何使用
- 遊戲中的圖檔
- 遊戲中的顔色
- 遊戲中的常用形狀
- 遊戲中的文字
- 遊戲中的音效
- 遊戲當中動畫切換
- 精靈和精靈組
- 碰撞檢測
幫助文檔
https://www.pygame.org/docs/
Pygame如何使用
- 引入相關的包:
等import pygame,sys
- pygame進行初始化,調用
方法pygame.init()
- 得到螢幕對象Surface
- 事件的監聽(遊戲主循環):處理遊戲事件,更新遊戲狀态,重新繪制在螢幕上
遊戲中的圖檔
1.圖檔的加載
# 使用絕對路徑
bg = pygame.image.load('./bg.png')
2.在頻幕上繪制
3.像素上的坐标
左上角為坐标原點,從左往右為x軸,從上往下為y軸線
遊戲中的顔色
1.使用RGB表示
取值範圍0~255
2.RGBA表示透明色
A(alpha):0~255
遊戲中的常用形狀
1.畫線
# 畫一條紅色的,從坐标(11,11)到坐标(22,22)寬度為3像素的線段
pygame.draw.line(screen,red,(11,11),(22,22),3)
2.畫矩形
# 畫從坐标(10,20)寬度為100,高度為200,邊框為3像素的矩形
pygame.draw.rect(screen,red,(10,20,100,200),3)
3.畫圓
# 畫圓心坐标為(100,100)半徑為100,邊框為3像素的圓形
pygame.draw.circle(screen,red,(100,100),100,3)
遊戲中的文字
1.加載字型
# 加載系統提供的字型,文字大小,加粗,斜體
font = pygame.font.SysFont('華文行楷',32,True,True)
# 還有一種加載字型的方式,考慮到不同計算機字型不同名,可以把字型ttf檔案放進項目中進行調用
font = pygame.font.Font('./檔案名稱',32) # 這裡使用絕對路徑
2.加載完字型之後,需要得到Surface對象
# 渲染的文字,顔色,背景色
text = font.render('需要渲染的文字',True,RED,GREEN)
3.在螢幕上進行繪制
# 繪制文字,文字初始值
screen.blit(text,text.get_rect())
遊戲中的音效
1.加載背景音樂
# 通過load()方法加載背景音樂檔案路徑
pygame.mixer.music.load('./music.mp3')
2.音量大小設定
# 範圍0~1,值越小,音量越小
pygame.mixer.music.set_volume(0.5)
3.循環播放背景音樂
# play()方法指定-1實作無限循環播放
pygame.mixer.music.play(-1)
遊戲當中動畫切換
1.幀速率
用FPS或者幀/秒來進行控制
2.通過
pygame.time.Clock()
中的tick(num)進行控制幀速率
3.用算法來進行圖檔切換
# 用counter進行計數
counter = 0
# counter += 1
# 如果可以被5整除,繪制一張圖檔,不能的時候繪制另一張圖檔來實作來回切換産生動畫效果
if counter % 5 == 0:
screen.blit(image,(20,20))
else:
screen.blit(image2,(20,20))
精靈和精靈組
1.精靈
精靈可以認為是一張張小圖檔,它可以是在螢幕上移動的圖形對象,并且可以與其它圖形對象進行互動。比如在螢幕上畫的矩形,圓形,進行封裝讓他可以與其他圖形進行互動。精靈圖像可以是pygame使用函數繪制的圖像,也可以是圖檔檔案。
2.精靈組
精靈組用于管理組内精靈的繪制和更新,是一個容器。
碰撞檢測
1.兩個精靈之間的矩形檢測
# collide_rect()函數實作檢測兩個精靈是否有重疊
pygame.sprite.collide_rect(sprite_1,sprite_2)
# collide_rect_ratio()鍊式調用 第一個()加了比率,更加精确,指定碰撞的區域
pygame.sprite.collide_rect_ratio(0.5)(sprite_1,sprite_2)
2.兩個精靈之間的圓形檢測
3.兩個精靈之間的像素遮罩檢測
# 精靈不規則時
pygame.sprite.collide_mask(sprite_1,sprite_2)
4.精靈與精靈組之間的碰撞
# 精靈撞到精靈組内的任意一個都算碰撞
pygame.sprite.spritecollideany(sprite,sprite_group,bool)