上一篇文章:Python pygame(GUI編程)模塊最完整教程(4)_pygame繪制圓角矩形_Python-ZZY的博客-CSDN博客
?
總目錄:
README.md · Python-ZZY/Python-Pygame最完整教程 - Gitee.com
13 顯示
參考資料:pygame.display — pygame-ce v2.3.1 documentation
13.1 創(chuàng)建窗口
pg.display.set_mode方法用于創(chuàng)建窗口。
pg.display.set_mode(size=(0, 0), flags=0, depth=0, display=0, vsync=0) -> Surface
size參數(shù)指定窗口的大小,一般是一個元組(寬, 高)。如果設(shè)為(0, 0),那么窗口將和電腦屏幕一樣大。如果將寬度設(shè)為0或高度設(shè)為0,那么窗口的寬度或高度和電腦屏幕一樣。
flags指定窗口的額外參數(shù),參數(shù)之間用按位或運算符"|"組合。額外參數(shù)有:
參數(shù) |
解釋 |
FULLSCREEN |
使窗口全屏顯示 |
HWSURFACE | FULLSCREEN模式下啟動硬件加速 |
DOUBLEBUF |
雙緩沖模式,僅在OPENGL模式下生效,作用是緩沖繪制的內(nèi)容,避免卡頓 |
OPENGL |
創(chuàng)建一個OpenGL渲染顯示(OpenGL是一個3D繪圖引擎) |
RESIZABLE |
窗口允許用戶改變大小 |
NOFRAME |
隱藏窗口邊框和標題欄 |
SCALED |
使窗口大小適配分辨率高的顯示器,在分辨率較高的顯示器上不會顯得特別小 |
SHOWN |
窗口以顯示模式打開(默認) |
HIDDEN |
窗口以隱藏模式打開 |
比如下面的代碼就表示創(chuàng)建一個400x300的,全屏、默認為隱藏的pygame窗口。
pg.display.set_mode((400, 300), pg.FULLSCREEN | pg.HIDDEN)
pg.SCALED標志很有用。當(dāng)你希望用戶能夠自由調(diào)節(jié)窗口的大小,并且窗口中的內(nèi)容隨著該大小進行變化,可以同時傳遞pg.SCALED|pg.RESIZABLE。
接下來的幾個參數(shù)并不常用,新手無需了解它們。
depth指定顏色的深度。
vsync設(shè)置為True可以使畫面垂直同步。當(dāng)繪制的內(nèi)容比較多時,可能會出現(xiàn)屏幕撕裂的現(xiàn)象,此時可以設(shè)置vsync=True來避免這一點(會影響幀速率)。
display指定默認的顯示索引。
創(chuàng)建窗口后,如果不想在代碼中一直引用窗口變量,可以使用pg.display.get_surface方法。這個方法返回當(dāng)前建立的pygame窗口。
screen = pg.display.get_surface()
13.2 設(shè)置標題和圖標
pg.display.set_caption方法用于設(shè)置窗口的標題,默認的標題是"pygame display window"
pg.display.set_icon方法設(shè)置窗口的圖標,參數(shù)必須是一個Surface對象。
pg.display.set_caption(title) -> None
pg.display.set_icon(Surface) -> None
13.3 display模塊索引-顯示窗口
set_mode(size=(0, 0), flags=0, depth=0, display=0, vsync=0) -> Surface
創(chuàng)建窗口
get_surface() -> Surface
獲取窗口表面
flip() -> None
刷新窗口表面
update(rectangle=None) -> None
update(rectangle_list) -> None
刷新窗口表面(是flip的優(yōu)化版本,但是速度可能較慢)
get_desktop_sizes() -> list
返回一個形如[(width, height), ...]的列表,每個元組表示電腦顯示器的尺寸。
get_window_size() -> tuple
返回通過set_mode設(shè)置的窗口尺寸
gl_get_attribute(flag) -> value
獲取OpenGL模式中的屬性。
gl_set_attribute(flag, value) -> None
設(shè)置OpenGL模式中的屬性,后文詳解
get_active() -> bool
返回一個布爾值表示窗口是否處于激活
iconify() -> bool
最小化窗口
set_icon(Surface) -> None
設(shè)置窗口圖標
set_caption(title, icontitle=None) -> None
設(shè)置窗口標題(icontitle參數(shù)在pygame2中無效)
get_caption() -> (title, icontitle)
返回窗口標題
set_allow_screensaver(bool=True) -> None
設(shè)置游戲運行時是否支持顯示屏幕保護系統(tǒng),調(diào)用時默認為支持。不進行設(shè)置時,默認不支持在游戲時顯示屏保。
get_allow_screensaver() -> bool
返回一個布爾值,表示是否在游戲時顯示屏保。
14 聲音
參考資料:pygame.mixer — pygame-ce v2.3.1 documentation
14.1 設(shè)定混音器
pg.mixer模塊可以用于播放聲音。pg.mixer.pre_init方法可以預(yù)先設(shè)定所有的聲音參數(shù),達到控制聲音播放效果的功能。
pg.mixer.pre_init(frequency=44100, size=-16, channels=2, buffer=512, devicename=None, allowedchanges=pg.AUDIO_ALLOW_FREQUENCY_CHANGE | pg.AUDIO_ALLOW_CHANNELS_CHANGE) -> None
一般在初始化pygame模塊后直接調(diào)用pre_init()。調(diào)用這個方法后,聲音效果會好一些,比如音量過大的聲音會被減小音量。
14.2 播放音效
pg.mixer中有一個Sound對象,可以用于播放音效。播放音效首先需要創(chuàng)建一個Sound對象。Sound支持的參數(shù)類型很多,可以是某個聲音文件路徑,也可以是聲音的樣本數(shù)據(jù)等等。
mixer支持的聲音文件類型有:
-
MP3
-
OGG
-
WAV
在創(chuàng)建了一個聲音對象后,可以Sound.play方法播放聲音。play方法的第一個參數(shù)loops指定第一次播放后再次重復(fù)播放的次數(shù),-1則為無限次播放,默認為0。
停止播放音效可使用Sound.stop方法。此外還有一個fadeout方法,可以淡出音頻,支持一個參數(shù)表示淡出時間(ms);如果Sound.fadeout(2000),那么聲音將在2秒內(nèi)變得越來越弱最后消失。
示例如下:
import pygame as pg
pg.init()
pg.mixer.pre_init()
sound = pg.mixer.Sound("click.ogg") #音效文件
sound.play() #播放音效
while True: #play方法是非阻塞的,如果不放這個循環(huán),程序會直接結(jié)束
pass
14.3 播放背景音樂
pg.mixer還有一個子模塊music,用于控制背景音樂。背景音樂和音效差不多,但是背景音樂只能同時播放一個。
播放背景音樂首先需要進行載入。pg.mixer.music.load方法通過一個文件路徑載入聲音,然后通過pg.mixer.music.play播放。
import pygame as pg
pg.init()
pg.mixer.pre_init()
pg.mixer.music.load("bgm.ogg")
pg.mixer.music.play(-1) #循環(huán)播放背景音樂(-1即無限次)
while True:
pass
如果想要更換音樂,只需要重新載入新的背景音樂,然后調(diào)用play進行播放即可。
14.4 mixer模塊索引-混音器
混音器(mixer)是一個管理聲音的模塊。每段聲音將會被分配到各個聲道(channel),混音器對各個聲道進行混合形成最終播放的聲音。聲道的默認數(shù)量是8,這意味著默認情況下只能同時混合8個聲音。多余的聲音將被丟棄。
pre_init(frequency=44100, size=-16, channels=2, buffer=512, devicename=None, allowedchanges=AUDIO_ALLOW_FREQUENCY_CHANGE | AUDIO_ALLOW_CHANNELS_CHANGE) -> None
預(yù)先設(shè)置混音器。buffer參數(shù)控制混音器的采樣數(shù)量,這意味著如果buffer比較高,那么聲音丟失可能性就偏低,但速度可能稍慢。
stop() -> None, pause() -> None, unpause() -> None, fadeout(time) -> None
這幾個函數(shù)和Channel對象的幾個方法作用類似,但是可以作用于所有聲道(Channel對象),關(guān)于Channel詳見下文。
set_num_channels(count) -> None
設(shè)置聲道數(shù)量,默認聲道數(shù)量為8。
get_num_channels() -> count
返回聲道數(shù)量。
set_reserved(count) -> count
設(shè)置預(yù)留聲道,count表示需要預(yù)留的聲道數(shù)量。一般播放聲音(調(diào)用play())時會自動選擇一個可用的聲道,如果設(shè)置了預(yù)留則無法被play()選中。這樣可以給一些重要的聲音預(yù)留一些通道,保證不被占用。
返回實際的預(yù)留聲道數(shù)量。如果之前的聲道已經(jīng)被占用了一部分,而剩余的可用聲道數(shù)量小于給定參數(shù)count,那么則無法按照參數(shù)預(yù)留聲道,只會預(yù)留剩余的可用聲道。比如:一共8個聲道,5個已經(jīng)被占用,而希望預(yù)留4個聲道,那么實際只會預(yù)留剩余的3個聲道。
get_busy() -> bool
如果混音器處于忙碌(正在播放音效),返回True。
set_soundfont(path) -> None
這將設(shè)置用于播放midi音樂的soundfont文件。soundfont只影響MID、MIDI和KAR文件格式的播放??蛇x的path參數(shù),一個字符串(或由分號分隔的多個字符串),必須指向要搜索的soundfont文件(如果缺少某些文件,則按給定的順序)。如果path是空字符串或默認值(None),則將從混音器中清除任何指定的soundfont路徑。
注意在Windows上,混音器總是使用內(nèi)置的聲音字體而不是指定的。
pygame 2.3.1新增。
get_soundfont() -> paths
這將獲得soundfont文件路徑作為字符串(每個路徑由分號分隔),以便在播放MID、MIDI和KAR音樂文件格式時使用。如果未指定soundfont,則返回類型為None。
Sound(filename) -> Sound
Sound(file=filename) -> Sound
Sound(file=pathlib_path) -> Sound
Sound(buffer) -> Sound
Sound(buffer=buffer) -> Sound
Sound(object) -> Sound
Sound(file=object) -> Sound
Sound(array=object) -> Sound
創(chuàng)建音效對象。
Sound.play(loops=0, maxtime=0, fade_ms=0) -> Channel
播放音效,返回該音效播放的聲道。loops表示第一次播放后,重復(fù)播放的次數(shù);設(shè)為5則一共播放6次;無限次播放可設(shè)為-1。maxtime指定音效播放的最大時間,經(jīng)過給定毫秒后停止播放聲音。fade_ms表示淡入聲音的時間,淡入表示開始播放時聲音由最小逐漸變大。
Sound.stop() -> None
暫停音效的播放。
Sound.fadeout(time) -> None
暫停音效的播放(淡出)。淡出時聲音逐漸變?nèi)踝詈笙В鰰r間為給定參數(shù)time。
Sound.set_volume(value) -> None
設(shè)置音量,value范圍是0-1之間的浮點數(shù)。
Sound.get_volume() -> value
返回當(dāng)前音量
Sound.get_num_channels() -> count
返回一個整數(shù)表示這個音效在多少個聲道被播放。
Sound.get_length() -> seconds
返回聲音的長度(秒)。
Sound.get_raw() -> bytes
返回聲音的原始字節(jié)碼
Channel(id) -> Channel
創(chuàng)建一個聲道對象。
Channel.play(Sound, loops=0, maxtime=0, fade_ms=0) -> None
在當(dāng)前聲道播放音效
Channel.stop() -> None
停止播放音效
Channel.pause() -> None
暫停播放音效
Channel.unpause() -> None
取消暫停播放音效
Channel.fadeout(time) -> None
停止播放音效(淡出)
Channel.set_volume(value) -> None
Channel.set_volume(left, right) -> None
設(shè)置音量。如果傳遞兩個參數(shù),則表示混音器立體聲模式,左邊的揚聲器音量為left,右邊的為right。
Channel.get_volume() -> value
返回音量
Channel.get_busy() -> bool
返回聲道是否在混音中
Channel.get_sound() -> Sound
返回當(dāng)前聲道的音效對象
Channel.queue(Sound) -> None
排隊某個音效。排隊的音效將在當(dāng)前音效播放完后直接開始播放。排隊的音效只能有一個。
Channel.set_endevent() -> None
Channel.set_endevent(type) -> None
當(dāng)聲音全部播放結(jié)束后將type事件類型發(fā)送。
Channel.get_endevent() -> type
獲取聲音播放完成后發(fā)送的事件類型
14.4 mixer.music模塊索引-背景音樂
music模塊單獨管理一個聲道,只允許播放一個聲音。
load(filename) -> None
load(fileobj, namehint="") -> None
載入聲音文件。
unload() -> None
卸載聲音文件
play(loops=0, start=0.0, fade_ms=0) -> None
播放聲音。start表示開始播放聲音的位置,取決于聲音文件的類型;MP3和OGG文件中start單位為秒(MP3聲音位置控制可能不精準),MOD文件中start表示整數(shù)模式數(shù),其他格式文件不支持控制聲音播放的位置。
rewind() -> None
將播放音樂位置重置為0。如果先前暫停了音樂,此時仍然處于暫停狀態(tài)。
stop() -> None
停止播放音樂
pause() -> None
暫停播放音樂
unpause() -> None
取消暫停播放音樂
fadeout(time) -> None
停止播放音樂(淡出)。
set_volume(volume) -> None
設(shè)置音量
get_volume() -> value
獲取音量
get_busy() -> bool
返回是否在播放背景音樂
set_pos(pos) -> None
設(shè)置音樂的播放位置
get_pos() -> time
獲取音樂的播放位置
queue(filename) -> None
queue(fileobj, namehint="", loops=0) -> None
排隊下一個音樂
set_endevent() -> None
set_endevent(type) -> None
播放結(jié)束時發(fā)送類型為type的事件
get_endevent() -> type
獲取播放結(jié)束時發(fā)送的事件類型。
15 坐標處理
參考資料:
pygame.Rect — pygame-ce v2.3.1 documentation
pygame.math — pygame-ce v2.3.1 documentation
pygame.math — pygame-ce v2.3.1 documentation
15.1 矩形
pg.Rect創(chuàng)建一個矩形對象,用于操作矩形區(qū)域。前文已經(jīng)介紹過矩形對象,它具有以下虛擬屬性:
x,y
top, left, bottom, right
topleft, bottomleft, topright, bottomright
midtop, midleft, midbottom, midright
center, centerx, centery
size, width, height
w,h
矩形對象是可以迭代的,如下:
r = Rect(0, 1, 2, 3)
x, y, w, h = r #位置和尺寸
Surface.get_rect方法返回表面的矩形對象。這個矩形對象中x=y=0,且w, h=表面的寬,表面的高。
15.2 Rect對象方法索引
copy() -> Rect
復(fù)制矩形
update(left, top, width, height) -> None
update((left, top), (width, height)) -> None
update(object) -> None
更改矩形信息
move(x, y) -> Rect, move_ip(x, y) -> None
move方法用于移動矩形(x, y坐標分別增加x, y個像素),返回新的矩形對象。move_ip方法中的ip表示in-place,表示原地修改矩形(在調(diào)用該方法的矩形對象上修改),而不是復(fù)制一個矩形對象,修改后返回。以下很多方法都支持_ip,不再贅述。
inflate(x, y) -> Rect, inflate_ip(x, y) -> None
將矩形對象的寬、高分別增加x, y個像素,并使更改后的矩形對象中心位置移動到原來矩形對象的中心位置。

粉色為原本的矩形,綠色是調(diào)用rect.inflate(50, 50)后的結(jié)果。
clamp(Rect) -> Rect, clamp_ip(Rect) -> None
將當(dāng)前矩形的中心設(shè)為指定參數(shù)中Rect對象的中心。

上圖中粉色為調(diào)用方法的矩形,紅色為參數(shù)中的矩形,綠色為調(diào)用后的結(jié)果。
union(Rect) -> Rect, union_ip(Rect) -> None
獲取兩個矩形包圍部分。矩形的包圍部分覆蓋了所有矩形的面積(可能有原始矩形中未覆蓋的區(qū)域)

如圖,綠色矩形為粉色和紅色矩形的包圍區(qū)域。
unionall(Rect_sequence) -> Rect, unionall_ip(Rect_sequence) -> None
獲取多個矩形的包圍區(qū)域。Rect_sequence是一個矩形序列,包含一系列矩形對象。
scale_by(scale_by) -> Rect, scale_by_ip(scale_by) -> None
scale_by(x, y) -> Rect, scale_by_ip(x, y) -> None
按比例縮放矩形,縮放后矩形仍然位于原先矩形的中心。如果只提供一個參數(shù),則縮放整個矩形,如果提供兩個參數(shù),表示分別對寬和高進行不同的縮放。
pygame-ce 2.3.1新增
clip(Rect) -> Rect
返回兩個矩形的重疊部分的矩形對象。

上圖中綠色的矩形表示粉色矩形、紅色矩形的重疊部分。
clipline(x1, y1, x2, y2) -> ((cx1, cy1), (cx2, cy2)) or ()
clipline((x1, y1), (x2, y2)) -> ((cx1, cy1), (cx2, cy2)) or ()
clipline((x1, y1, x2, y2)) -> ((cx1, cy1), (cx2, cy2)) or ()
clipline(((x1, y1), (x2, y2))) -> ((cx1, cy1), (cx2, cy2)) or ()
矩形和線段的碰撞檢測。(x1, y1), (x2, y2)表示線段的兩個端點,如果發(fā)生碰撞,則返回線段在矩形中的部分的兩個端點。

如圖,紅色部分為原來的線段,綠色部分為該線段與粉色矩形發(fā)生碰撞的部分。(為了方便觀察,紅色線段邊框繪制較粗)。
fit(Rect) -> Rect
移動并調(diào)整矩形的大小,使其適應(yīng)給定矩形的范圍,并返回調(diào)整后的結(jié)果(一個矩形對象)。調(diào)整后的矩形寬高之比不變,但是它被盡可能地放大,使其完全容納于給定矩形的范圍中(如果給定參數(shù)的矩形要比當(dāng)前矩形小,那么矩形將會被縮小,使得大小剛好容納在給定矩形之中)。調(diào)整后的矩形中心被移動到給定矩形的中心。

粉色是調(diào)用該方法的矩形,紅色是給定矩形,綠色是調(diào)用fit后的結(jié)果。
normalize() -> None
如果當(dāng)前矩形中寬或高為負數(shù),則修改為正數(shù),并移動x, y坐標使當(dāng)前位置不變。示例如下:
>>> r = pg.Rect((150, 150, -100, -100))
>>> print(r)
<rect(150, 150, -100, -100)>
>>> r.normalize()
>>> print(r)
<rect(50, 50, 100, 100)>
>>>
contains(Rect) -> bool
如果給定矩形的范圍完全在當(dāng)前矩形的范圍之內(nèi),則返回True。
collidepoint(x, y) -> bool
collidepoint((x,y)) -> bool
如果位于(x, y)的點在矩形范圍之內(nèi),則返回True
colliderect(Rect) -> bool
如果兩個矩形有重合的部分,則返回True
collidelist(list) -> index
測試矩形是否與一系列矩形碰撞。返回第一個找到的碰撞的索引。如果沒有,則返回索引-1。
collidelistall(list) -> indices
返回一個包含與矩形碰撞的矩形的所有索引的列表。如果沒有找到碰撞的矩形,則返回一個空列表。
list中可以包含Rect對象、可傳遞給Rect對象的參數(shù)(如(0, 0, 100, 100));也可以包含一個其他對象,但其中必須有一個名為rect的屬性。
注意:collidelistall看似要比collidelist好用,其實二者各有優(yōu)勢。collidelistall返回碰撞的所有對象,這必然會大大降低代碼的運行速度。如果只是要檢測是否碰撞,而不在乎碰撞的數(shù)量,使用collidelist要更好。
collideobjects(rect_list) -> object
collideobjects(obj_list, key=func) -> object
可以傳遞一個矩形列表,它將返回第一個找到的與當(dāng)前矩形發(fā)生碰撞的矩形對象。
也可以傳遞一系列其他對象的列表;此時需要指定key(一個函數(shù)),它包含一個參數(shù)表示即將進行檢測的列表中的對象,必須返回一個Rect對象。此時將返回第一個找到的與當(dāng)前矩形發(fā)生碰撞的其他對象。示例如下:
>>> r = pg.Rect((0, 0, 100, 100))
>>> class ObjectWithSomeRectAttr:
def __init__(self, box):
self.collision_box = pg.Rect(box)
>>> objects = [
ObjectWithSomeRectAttr((300, 400, 500, 500)), #No collide
ObjectWithSomeRectAttr((200, 900, 100, 100)), #No collide
ObjectWithSomeRectAttr((99, 99, 100, 100)), #Collide!
]
>>> def key_func(obj):
return obj.collision_box #返回將要與矩形進行碰撞檢測的矩形
>>> obj = r.collideobjects(objects, key=key_func)
>>> print(obj.collision_box)
<rect(99, 99, 100, 100)>
>>>
collideobjectsall(rect_list) -> objects
collideobjectsall(obj_list, key=func) -> objects
與collideobjects類似,但是返回的不是第一個找到的對象而是所有發(fā)生碰撞的對象。
collidedict(dict) -> (key, value) or None
collidedict(dict, use_values=0) -> (key, value) or None
接受一個字典進行碰撞檢測,并返回第一個找到的發(fā)生碰撞的鍵值對。如果use_values=0(默認),則使用字典的鍵與當(dāng)前矩形進行碰撞檢測,設(shè)為1則使用字典的值與當(dāng)前矩形進行碰撞檢測。
注意:pg.Rect對象不可散列,所以不能作為字典的鍵。作為字典的鍵之前應(yīng)轉(zhuǎn)換為元組。如下所示:
rect.collidedictall({tuple(key_rect) : value})
collidedictall(dict) -> [(key, value), ...]
collidedictall(dict, use_values=0) -> [(key, value), ...]
與collidedict類似,但是返回的不是第一個找到的對象而是所有發(fā)生碰撞的對象。
15.3 FRect - 支持浮點運算的矩形
版本為2.2.1的pygame-ce中新增了FRect類,其用法與Rect相同,但是可支持浮點數(shù)的運算,這在很多時候都是有用的。
>>> r = pg.FRect(1.3, 1.5, 2, 5)
>>> r
FRect(1.300000, 1.500000, 2.000000, 5.000000)
>>> r = pg.Rect(1.3, 1.5, 2, 5)
>>> r
Rect(1, 1, 2, 5)
>>>
Surface.get_frect可以返回一個FRect對象,用法與get_rect類似。
15.4 向量
pygame中支持向量。向量指具有大小和方向的量,你可以把它理解為一個(x, y)形式的元組,但是被封裝成一個類,具有一系列強大的功能。
pygame中支持的向量有二維和三維兩種,分別作為兩個類:Vector2和Vector3。它們被放在pygame的數(shù)學(xué)庫(pg.math)中,由于比較常用,它們也被導(dǎo)入到了主模塊中,所以只需pg.Vector2即可調(diào)用。
下面介紹二維向量,它由Vector2方法創(chuàng)建:
pg.Vector2() -> Vector2(0, 0)
pg.Vector2(int) -> Vector2
pg.Vector2(float) -> Vector2
pg.Vector2(Vector2) -> Vector2
pg.Vector2(x, y) -> Vector2
pg.Vector2((x, y)) -> Vector2
如果說Rect對象表示了一個面,那么向量對象表示的則是一個點或是一段距離。向量對象支持一系列數(shù)學(xué)運算,包括加減乘除和圓整(__round__,pygame-ce 2.1.4新增)。和Rect還有一個不同,向量對象支持小數(shù),而Rect只支持整數(shù)(這是因為Rect對象表示的是一個完整的位置,像素只能為整數(shù);而向量是為了精確的數(shù)學(xué)運算設(shè)計的)。
>>> vec = pg.Vector2(10, 10)
>>> vec2 = pg.Vector2(5, 5)
>>> vec + vec2
<Vector2(15, 15)>
>>> vec - vec2
<Vector2(5, 5)>
>>> vec - 3 * vec2
<Vector2(-5, -5)>
>>> vec // 3
<Vector2(3, 3)>
>>> vec += pg.Vector2(3.14, 3.1415)
>>> vec
<Vector2(13.14, 13.1415)>
>>> round(vec, 1)
<Vector2(13.1, 13.1)>
>>>
向量的引用和修改也很簡單,只需要通過向量的x, y, z(僅Vector3支持z軸)屬性或索引即可。
>>> vec = pg.Vector2(1, 2)
>>> vec.x = 4
>>> vec
<Vector2(4, 2)>
>>> vec.y = 8
>>> vec
<Vector2(4, 8)>
>>> vec.x, vec.y
(4.0, 8.0)
>>> vec[0], vec[1]
(4.0, 8.0)
>>>
向量對象還支持一種奇怪的屬性引用方式,可以將x, y, z組合作為向量的屬性。
>>> vec = pg.Vector2(1, 2)
>>> vec.xy
<Vector2(1, 2)>
>>> vec.yx
<Vector2(2, 1)>
>>> vec.xyx
<Vector3(1, 2, 1)>
>>> vec.xyxyxyxyxyxy
(1.0, 2.0, 1.0, 2.0, 1.0, 2.0, 1.0, 2.0, 1.0, 2.0, 1.0, 2.0)
>>> vec.yyyyy
(2.0, 2.0, 2.0, 2.0, 2.0)
>>> vec.xy = (2, 3)
>>> vec.xyx = (2, 3, 2) #這樣的賦值方式是不支持的
Traceback (most recent call last):
File "<pyshell#42>", line 1, in <module>
vec.xyx = (2, 3, 2)
AttributeError: Attribute assignment conflicts with swizzling.
>>>
向量有一個特殊之處。渲染pygame時y坐標軸是向下的,但是向量計算中一般y坐標軸向上
15.5 Vector2對象方法索引-2D向量
copy() -> Vector2
復(fù)制向量對象。
update() -> None
update(int) -> None
update(float) -> None
update(Vector2) -> None
update(x, y) -> None
update((x, y)) -> None
更新向量對象的值。
dot(Vector2) -> float
返回兩個向量的點乘結(jié)果。
公式:
cross(Vector2) -> float
返回兩個向量的叉乘結(jié)果
公式:
length() -> float
返回向量距離原點(0, 0)的長度。
length_squared() -> float
返回向量距離原點的長度的平方(速度比length稍快,因為最后一步不需要開方)
normalize() -> Vector2, normalize_ip() -> None
修改向量使方向不變,長度為1。normalize_ip表示原地修改,而不是返回一個新向量。
is_normalized() -> Bool
判斷向量的長度是否為1
scale_to_length(float) -> None
縮放向量,使其長度為float。
reflect(Vector2) -> Vector2, reflect_ip(Vector2) -> None
通過給定的向量作為法線,計算反射后向量的值。反射后向量長度不變。reflect_ip表示原地修改,而不是返回一個新向量。
distance_to(Vector2) -> float
返回兩個向量之間的距離
distance_squared_to(Vector2) -> float
返回兩個向量之間的距離的平方
move_towards(Vector2, float) -> Vector2, move_towards_ip(Vector2, float) -> None
使當(dāng)前向量朝著指定向量Vector2的位置移動float的長度,移動的距離不超過當(dāng)前向量和指定向量的距離。如果float為負數(shù),則朝著指定向量Vector2的方向遠離。
lerp(Vector2, float) -> Vector2
返回兩個向量的線性插值,float范圍是0-1。如float為0時,返回原本的向量;1時返回指定向量;0.5返回兩個向量的角平分線;0.33或0.66返回的向量夾角三分線,分別靠近原本向量和指定向量。
slerp(Vector2, float) -> Vector2
返回兩個向量的球面插值。
rotate(angle) -> Vector2, rotate_ip(angle) -> None
按角度逆時針旋轉(zhuǎn)向量(由于pygame的坐標系的y軸向下,所以顯示時為順時針旋轉(zhuǎn))
rotate_rad(angle) -> Vector2, rotate_rad_ip(angle) -> None
按弧度逆時針旋轉(zhuǎn)向量(由于pygame的坐標系的y軸向下,所以顯示時為順時針旋轉(zhuǎn))
angle_to(Vector2) -> float
返回當(dāng)前向量旋轉(zhuǎn)到指定向量的方向的角度。該計算的旋轉(zhuǎn)不會越過負x軸。

as_polar() -> (r, phi)
返回一個元組,包含向量的長度和方位角(由x軸正方向順時針旋轉(zhuǎn)至當(dāng)前向量的角度)
from_polar((r, phi)) -> None
設(shè)置向量的長度和方位角。
project(Vector2) -> Vector2
將當(dāng)前向量投射到指定向量。

如圖是向量a投射到向量CD的結(jié)果(向量b)。這對于在特定方向(例如墻的方向)找到某個部分的碰撞檢測是很有用的。
epsilon -> 1e-6
向量比較或計算的容差。由于浮點數(shù)計算中可能會有誤差,所以可以通過設(shè)置epsilon屬性來指定一個偏差的值,在一定誤差內(nèi)比較向量的大小或進行一些計算。值不要設(shè)置過大,比如設(shè)置為0.5就是一個過大的值,會影響計算。
15.6 Vector3對象方法索引-3D向量
Vector3是三維向量,可以處理三維圖形的坐標。它的大部分方法與Vector2一致,只是所需Vector2作為參數(shù)改成了Vector3,此處不再贅述,此外它還包括一些別的方法:
rotate_x(angle) -> Vector3, rotate_x_ip(angle) -> None
圍繞x軸按角度逆時針旋轉(zhuǎn)向量(由于pygame的坐標系的y軸向下,所以顯示時為順時針旋轉(zhuǎn))
rotate_x_rad(angle) -> Vector3, rotate_x_rad_ip(angle) -> None
圍繞x軸按弧度逆時針旋轉(zhuǎn)向量(由于pygame的坐標系的y軸向下,所以顯示時為順時針旋轉(zhuǎn))
此外還有rotate_y, rotate_z等一系列方法,此處不再贅述。
as_spherical() -> (r, theta, phi)
from_spherical((r, theta, phi)) -> None
這兩個方法相當(dāng)于Vector2.as_polar和from_polar,但是這兩個方法作用于三維,其中r是徑向距離,theta是傾角,phi是方位角。
16 數(shù)學(xué)庫
參考資料:pygame.math — pygame-ce v2.3.1 documentation
16.1 限制數(shù)值范圍
pg.math庫包含了一些數(shù)學(xué)操作。其中涵蓋的功能比較少,較為常用的是clamp()函數(shù),用于限制一個數(shù)值的范圍。
pg.math.clamp(value, min, max) -> float
min表示最小值,max表示最大值。如果value小于min,則返回min;如果value大于max,則返回max;否則返回value。例如:
>>> pg.math.clamp(10, 100, 200) #把數(shù)值限制在100-200之間
100
>>> pg.math.clamp(130, 100, 200)
130
>>> pg.math.clamp(999, 100, 200)
200
>>>
16.2 操作向量
pg.math庫中還包含Vector2和Vector3,在上一節(jié)中已經(jīng)介紹過。文章來源:http://www.zghlxwxcb.cn/news/detail-631829.html
下一篇文章
Python pygame(GUI編程)模塊最完整教程(6)_Python-ZZY的博客-CSDN博客文章來源地址http://www.zghlxwxcb.cn/news/detail-631829.html
到了這里,關(guān)于Python pygame(GUI編程)模塊最完整教程(5)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!