快捷實用按鈕模組 xbutton 使用說明
訂閱 480
前言
在使用 Pygame 開發遊戲時,按鈕是最常見的互動控製項之一。xbutton是一個簡單易用的按鈕模組。通過他,你可以輕松實作按鈕的多狀態樣式、事件繫結、鍵盤與手把控製。
樣式類別 XStyle
XStyle物件用於定義一種外觀,包括背景,字型等,可在建立XButton時使用。
XStyle(image=None, size=None, font=None, font_style=None, text_color=None, text_offset=None, scale=None)
- image 參數
image表示背景影像的Surface物件,或影像檔案路徑,或包含影像資訊的IO物件。如果采用檔案路徑,那麽不必擔心會產生重複的Surface物件,XStyle會優先采用快取。- size 參數
size表示控製項的大小,如果忽略,則嘗試根據背景影像的大小產生。- font 參數
font表示繪製文字所需的freetype.Font字型物件,或一個包含字型檔案路徑和字型大小的元組。如果忽略,則采用DEFAULT_FONT表示的字型物件。如果采用相同的字型檔案路徑和大小,那麽不必擔心會產生重複的Font物件,XStyle會優先采用快取。- font_style 參數
font_style表示繪製文字時,所采用的字型樣式,如果忽略,則采用freetype.STYLE_DEFAULT。- text_color 參數
text_color與Color類別的建構子的rgbvalue參數相同,用於建立色彩物件,來繪製文字。如果忽略,則采用DEFAULT_COLOR表示的色彩物件。- text_offset 參數
text_offset表示文字的位移距離,當背景影像展現位移效果時,可設定該參數來調整文字的位置。- scale 參數
scale表示縮放大小(可能導致模糊),大於1為放大,小於1為縮小,將影響size屬性。
XStyle會對字型與圖片進行快取,以升階效能。若需清除快取,可呼叫該類別的靜態方法XStyle.clear_cache()。
建立控製項組 XGroup
XGroup物件是一個控製項組類別,用處理多個控製項的邏輯關系,使鍵盤或控製器可以切換控製項的焦點,並實作對控製項的某些操作。這裏,你可以將控製項理解為XButton。
XGroup(position, items, default_item=None, name=None, disabled=False, hidden=False, navigation_keys=None, navigation_hat=None, navigation_axes=None, joystick_id=None, onchange=None)
- position 參數
position表示組的左上角位置,將影響組中的所有控製項,可傳入一個包含 X 和 Y 座標的元組或串列。- items 參數
items是一個巢狀序列,用於表示組中的控製項布局。比如,[[b1,b2],[b3,b4]],表示b1在b2的左邊和b3的上邊,b4在b3的右邊和b2的下邊,空位置可用None代替。- default_item 參數
default_item為組中的預設控製項,預設控製項在開始時擁有焦點。如果未指定,則第一個出現的控製項為預設控製項。- name 參數
name表示組的名稱,可用於識別組。- disabled 參數
disabled表示組是否處於停用狀態。- hidden 參數
hidden表示組是否處於隱藏狀態。- navigation_keys 參數
navigation_keys為包含用於切換控製項焦點的鍵盤按鍵的元組(采用中文輸入法時可能無效),形式為(up,down,left,right)。如果忽略,則采用(K_UP,K_DOWN,K_LEFT,K_RIGHT)。- navigation_hat 參數
navigation_hat為用於切換控製項焦點的控製器方向鍵 ID。如果忽略,則為0。- navigation_axes 參數
navigation_axes為用於切換控製項焦點的控製器軸裝置資訊。如果忽略,則為((1,0.3),(0,0.3)),其中0.3為觸發操作的閾值,1為觸發上下操作的軸裝置 ID,0為觸發左右操作的軸裝置 ID。- joystick_id 參數
joystick_id為可以對組進行操作的控製器的 ID(控製器必須在模組定義的joysticks變數中)。如果忽略,則joysticks變數中的所有控製器均可操作組。- onchange 參數
onchange是一個函式,用於處理焦點控製項發生變化的事件,形式為handle(**args)或handle(group, focused, blurred),其中,group為控製項組自身,focused為獲得焦點的控製項,blurred為失去焦點的控製項。
在下面的範例中,我們建立了三個按鈕b_start,b_enable,b_hide。在邏輯關系上,他們按照順序從上至下排列,預設擁有焦點的按鈕是b_enable。
# 定義樣式並建立按鈕
g_style = {
"default_style": XStyle(
image=r'g-normal.png',
font=(r'Bitty.ttf', 50),
text_color='#2c360c'
),
"hovered_style": XStyle(
image=r'g-hovered.png',
text_color='#4a5914',
scale=1.05
),
"pressed_style": XStyle(
image=r'g-clicked.png',
text_offset=(0, 1)
),
"disabled_style": XStyle(
image=r'g-disabled.png',
text_color='#505050',
scale=0.95,
font_style=freetype.STYLE_UNDERLINE
),
"focused_style": XStyle(
image=r'g-hovered.png',
font=(r'Bitty.ttf', 55),
text_color='#181c0b',
scale=1.05
)
}
b_start = XButton((0, 200), **g_style, text='Start', disabled=True)
b_enable = XButton((0, 300), **g_style, text='Enable', name='e')
b_hide = XButton((0, 400), **g_style, text='Hide', name='h')
g = XGroup(
(400, 0),
[
[b_start],
[b_enable],
[b_hide]
],
b_enable
)更新與繪製 XGroup 控製項組
XGroup物件的update方法,用於更新控製項組和組中所有控製項的狀態,需要在遊戲迴圈中呼叫,最好放在draw方法之前。
update(pressed_keys)
- pressed_keys 參數
pressed_keys參數是鍵盤按鍵的按下狀態(通常是key.get_pressed()的傳回值)。如果忽略該參數,那麽update方法將自行處理。
XGroup物件的draw方法,用於將控製項組中的控製項繪製到指定Surface物件,需要在遊戲迴圈中呼叫,最好放在update方法之後。
draw(surface)
- surface 參數
surface參數是將被繪製控製項的Surface物件。
js: list[joystick.JoystickType] = []
# NOTE 只有包含在 joysticks 中的控製器,才能操作按鈕和控製項組
xbutton.joysticks = js
running = True
while running:
# 在控製器連線和中斷連線時,更新 js
for e in event.get():
if e.type == QUIT:
running = False
elif e.type == JOYDEVICEADDED:
j = joystick.Joystick(e.device_index)
js.append(j)
elif e.type == JOYDEVICEREMOVED:
for j in js:
if j.get_instance_id() == e.instance_id:
js.remove(j)
break
w.fill(0)
g.update(key.get_pressed())
g.draw(w)
# …繫結處理 XGroup 控製項組事件
目前XGroup物件僅支援焦點控製項發生變化的事件,可通過建構子的onchange參數設定處理事件的函式,具體可檢視建立控製項組一段。
在建立XGroup物件之後,你還可以通過該物件的onchange變數,來重新設定焦點控製項發生變化的事件的處理函式。
在下面的範例中,將顯示獲得焦點以及失去焦點的按鈕的文字。
# 焦點控製項發生變化的事件的處理函式
def group_onchange(group, focused, blurred):
if focused:
print(f'Focus {focused.text}')
if blurred:
print(f'Blur {blurred.text}')
g = XGroup(
(400, 0),
[
[b_start],
[b_enable],
[b_hide]
],
b_enable,
onchange=group_onchange
)取得和設定 XGroup 控製項組的其他特性
此外,XGroup還擁有以下的特性,可用於取得或設定控製項組的某些狀態。
- name 變數
name變數是組的名稱,可用於識別組。- position 變數
position變數是組的左上角位置,可以是元組和串列(形式為(x, y)或[x, y]),或Vector2物件,該位置將影響組中的所有控製項。- disabled 屬性
disabled屬性表示組是否處於停用狀態。- hidden 屬性
hidden屬性表示組是否處於隱藏狀態。- joystick_id 屬性
joystick_id屬性用於指定可對組進行操作的控製器的 ID(控製器必須在模組定義的joysticks變數中)。如果為None,則joysticks變數中的所有控製器均可操作組。- current 屬性
current屬性表示目前具有焦點的控製項。
原始碼
講解影片
Pygame 快捷實用按鈕控製項模組 xbutton,支援多狀態樣式、分配按鍵和手把、鍵盤和手把的導覽選取操作·YouTube