国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Python pygame(GUI編程)模塊最完整教程(5)

這篇具有很好參考價值的文章主要介紹了Python pygame(GUI編程)模塊最完整教程(5)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

上一篇文章: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個像素,并使更改后的矩形對象中心位置移動到原來矩形對象的中心位置。

pygame 全屏,Python pygame(GUI編程)模塊教程,pygame,python

粉色為原本的矩形,綠色是調(diào)用rect.inflate(50, 50)后的結(jié)果。

clamp(Rect) -> Rect, clamp_ip(Rect) -> None

將當(dāng)前矩形的中心設(shè)為指定參數(shù)中Rect對象的中心。

pygame 全屏,Python pygame(GUI編程)模塊教程,pygame,python

上圖中粉色為調(diào)用方法的矩形,紅色為參數(shù)中的矩形,綠色為調(diào)用后的結(jié)果。

union(Rect) -> Rect, union_ip(Rect) -> None

獲取兩個矩形包圍部分。矩形的包圍部分覆蓋了所有矩形的面積(可能有原始矩形中未覆蓋的區(qū)域)

pygame 全屏,Python pygame(GUI編程)模塊教程,pygame,python

如圖,綠色矩形為粉色和紅色矩形的包圍區(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

返回兩個矩形的重疊部分的矩形對象。

pygame 全屏,Python pygame(GUI編程)模塊教程,pygame,python

上圖中綠色的矩形表示粉色矩形、紅色矩形的重疊部分。

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ā)生碰撞,則返回線段在矩形中的部分的兩個端點。

pygame 全屏,Python pygame(GUI編程)模塊教程,pygame,python

如圖,紅色部分為原來的線段,綠色部分為該線段與粉色矩形發(fā)生碰撞的部分。(為了方便觀察,紅色線段邊框繪制較粗)。

fit(Rect) -> Rect

移動并調(diào)整矩形的大小,使其適應(yīng)給定矩形的范圍,并返回調(diào)整后的結(jié)果(一個矩形對象)。調(diào)整后的矩形寬高之比不變,但是它被盡可能地放大,使其完全容納于給定矩形的范圍中(如果給定參數(shù)的矩形要比當(dāng)前矩形小,那么矩形將會被縮小,使得大小剛好容納在給定矩形之中)。調(diào)整后的矩形中心被移動到給定矩形的中心。

pygame 全屏,Python pygame(GUI編程)模塊教程,pygame,python

粉色是調(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é)果。

公式:pygame 全屏,Python pygame(GUI編程)模塊教程,pygame,python

cross(Vector2) -> float

返回兩個向量的叉乘結(jié)果

公式:pygame 全屏,Python pygame(GUI編程)模塊教程,pygame,python

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軸。

pygame 全屏,Python pygame(GUI編程)模塊教程,pygame,python

as_polar() -> (r, phi)

返回一個元組,包含向量的長度和方位角(由x軸正方向順時針旋轉(zhuǎn)至當(dāng)前向量的角度)

from_polar((r, phi)) -> None

設(shè)置向量的長度和方位角。

project(Vector2) -> Vector2

將當(dāng)前向量投射到指定向量。

pygame 全屏,Python pygame(GUI編程)模塊教程,pygame,python

如圖是向量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)介紹過。

下一篇文章

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)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • python圖形界面化編程GUI(三)事件綁定(鼠標和鍵盤、OptionMenu、scale、顏色、文件對話框、菜單和工具欄、ttk子模塊)

    python圖形界面化編程GUI(三)事件綁定(鼠標和鍵盤、OptionMenu、scale、顏色、文件對話框、菜單和工具欄、ttk子模塊)

    Tkinter類 名稱 簡介 Toplevel 頂層 容器類,可用于為其他組件提供單獨的容器,類似于窗口 Button 按鈕 代表按鈕組件 Canvas 畫布 提供繪圖功能,包括直線、矩形、橢圓、多邊形、位圖等 Entry 單行輸入框 用戶可輸入內(nèi)容 Frame 容器 用于裝載其他GUI組件 Label 標簽 用于顯示不可編輯

    2024年02月12日
    瀏覽(22)
  • pygame 繪制愛心函數(shù) r = 1-cos(θ). Tag: python | 圖形界面 | GUI

    pygame 繪制愛心函數(shù) r = 1-cos(θ). Tag: python | 圖形界面 | GUI

    最近做數(shù)學(xué)題,遇到一個“愛心函數(shù)” 即 r = 1 - cos(θ) . ——極坐標下函數(shù)表達式 用參數(shù)方程表示即: x = (1 - cos(θ)) * cos(θ) y = (1 - cos(θ)) * sin(θ) 放個函數(shù)圖像 函數(shù)詳情點這里 代碼原理很簡單,采用極坐標的方式,使用一個變量 t(即 θ ),每次循環(huán)自增(充當(dāng)計時器/角度

    2024年02月13日
    瀏覽(20)
  • python如何安裝pygame模塊

    python如何安裝pygame模塊

    游戲設(shè)計作品集,藝術(shù)留學(xué)申請條件/費用/流程全面詳解查看詳情廣告 1 首先按鍵盤上的“Win + R”鍵。 游戲設(shè)計作品集,藝術(shù)留學(xué)申請_ACG國際藝術(shù)教育查看詳情廣告 2 在彈出的運行窗口中輸入cmd,輸入完成后點擊確定。 3 然后在彈出的命令提示符窗口中輸入python,輸入完成后點

    2024年02月03日
    瀏覽(25)
  • python安裝pygame模塊可能問題解決

    python安裝pygame模塊可能問題解決

    一般我們添加python中模塊有兩種方法 1、 在開發(fā)軟件pycharm中文件中設(shè)置-項目 然后點擊加號,輸入自己要安裝的模塊,如pygame 但是我這種安裝存在可能安裝失敗,但是簡單 第二種就是用系統(tǒng)cmd命令進行安裝 win+R打開cmd,先輸入pip install wheel安裝wheel工具,檢查pip是不是最新版

    2024年02月12日
    瀏覽(26)
  • python模塊: pygame(自己動手寫游戲)

    python模塊: pygame(自己動手寫游戲)

    目錄 一、pygame的安裝 ?二、pygame基礎(chǔ)操作 1.基本窗體設(shè)置 2.surface組件 ?3.event事件 一、pygame的安裝 在pycharm 左下角的終端上輸入指令pip install pygame,按下回車鍵執(zhí)行下載,推薦下載到虛擬環(huán)境上,即路徑前方帶有(venv)。或者不使用pycharm,在控制窗口輸入執(zhí)行該命令也可以(控

    2024年03月21日
    瀏覽(33)
  • 【python】之pygame模塊,游戲開發(fā)【基礎(chǔ)篇】

    【python】之pygame模塊,游戲開發(fā)【基礎(chǔ)篇】

    什么是pygame? Pygame 是一個專門用來開發(fā)游戲的 Python 模塊,主要為開發(fā)、設(shè)計 2D 電子游戲而生,具有免費、開源,支持多種操作系統(tǒng),具有良好的跨平臺性等優(yōu)點。它提供了諸多操作模塊,比如圖像模塊(image)、聲音模塊(mixer)、輸入/輸出(鼠標、鍵盤、顯示屏)模塊等

    2024年02月08日
    瀏覽(25)
  • 基于Python+Pygame實現(xiàn)一個俄羅斯方塊小游戲【完整代碼】

    基于Python+Pygame實現(xiàn)一個俄羅斯方塊小游戲【完整代碼】

    俄羅斯方塊,一款起源于上世紀80年代的經(jīng)典電子游戲,憑借簡單的規(guī)則和獨特的魅力,一躍成為全球家喻戶曉的經(jīng)典。你知道其實只需要一些基礎(chǔ)的編程知識,就可以自己實現(xiàn)它嗎?今天,我們將使用Python的Pygame庫,一步步帶你構(gòu)建屬于自己的俄羅斯方塊小游戲! 游戲初始

    2024年02月04日
    瀏覽(24)
  • Python之Pygame游戲編程詳解

    Python之Pygame游戲編程詳解

    1.1? 定義 Pygame是一種流行的Python游戲開發(fā)庫,它提供了許多功能,使開發(fā)人員可以輕松創(chuàng)建2D游戲。它具有良好的跨平臺支持,可以在多個操作系統(tǒng)上運行,例如Windows,MacOS和Linux。在本文中,我們將介紹Pygame庫的特點和用法,幫助您了解如何使用Pygame庫進行游戲開發(fā)。它提

    2024年02月04日
    瀏覽(27)
  • Python學(xué)習(xí)之pygame模塊介紹并制作代碼雨

    Python學(xué)習(xí)之pygame模塊介紹并制作代碼雨

    對Python游戲有所了解的朋友都知道,在2D的游戲制作中,經(jīng)常會用到一個模塊pygame,他能幫助我們實現(xiàn)很多方便使用的功能,例如繪制窗口,反饋鍵盤鼠標信息,播放音頻文件,渲染圖片文字等等功能。 今天咱們通過pygame模塊實現(xiàn)一個代碼雨的簡單示例,順便講解下子模塊中

    2024年02月10日
    瀏覽(20)
  • 【Python】【進階篇】八、Pygame的Event事件模塊

    事件(Event)是 Pygame 的重要模塊之一,它是構(gòu)建整個游戲程序的核心,比如常用的鼠標點擊、鍵盤敲擊、游戲窗口移動、調(diào)整窗口大小、觸發(fā)特定的情節(jié)、退出游戲等,這些都可以看做是“事件”。 Pygame 定義了一個專門用來處理事件的結(jié)構(gòu),即事件隊列,該結(jié)構(gòu)遵循遵循隊

    2024年02月11日
    瀏覽(30)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包