我創建了一個Button類,Rect如果指定的話,它基本上會繪制一個物件和一個文本,并且我實作了一個影片,它基本上會縮小按鈕并在單擊時快速將其充氣回來
class Button:
def __init__(self, surface, pos, size, bg_color, hover_color):
self.surface = surface
self.x, self.y = pos[0], pos[1]
self.width, self.height = size[0], size[1]
self.bgColor = bg_color
self.hoverColor = hover_color
self.rect = pygame.Rect(pos, size)
self.text = None
self.clicked = False
def addText(self, font, text, txt_color):
self.text = font.render(text, True, txt_color)
self.textRect = self.text.get_rect(center = self.rect.center)
def update(self):
if self.isHovered():
pygame.draw.rect(self.surface, self.hoverColor, self.rect, border_radius=20)
else:
pygame.draw.rect(self.surface, self.bgColor, self.rect, border_radius=20)
if(self.text):
self.surface.blit(self.text, self.textRect)
self.checkClicked()
def checkClicked(self):
if(self.rect.collidepoint(pygame.mouse.get_pos())):
if(pygame.mouse.get_pressed()[0]):
if(not self.clicked):
self.clicked = True
self.rect.inflate_ip(-7, -7)
else:
if(self.clicked):
self.clicked = False
self.rect.inflate_ip(7, 7)
def isHovered(self):
return True if self.rect.collidepoint(pygame.mouse.get_pos()) else False
這可能不是最有效的方法,但我稍后會擔心。
然后的實施將是:
startBtn = Button(display, (100, 160), (200, 40), (40, 40, 40), (70, 70, 70))
run = True
while run:
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
elif (event.type == pygame.MOUSEBUTTONDOWN and event.button == 1):
if(startBtn.rect.collidepoint(pygame.mouse.get_pos())):
showNextScreen() # Here lies the issue
print('pressed')
display.fill((50, 50, 50))
startBtn.update()
pygame.display.update()
我有一個可以繪制新螢屏并開始游戲的功能,但是它發生得太快以至于您看不到按鈕的影片,我正在努力尋找一種方法讓腳本等待按鈕影片完成然后做一些事情,我已經嘗試過pygame.time.wait(),pygame.time.delay()但是整個腳本凍結并且變得更糟,我怎么能做到這一點?
uj5u.com熱心網友回復:
你可以使用 time.sleep()
uj5u.com熱心網友回復:
我寫了一個函式叫做sleep等待給定的時間而不凍結游戲。
功能
def sleep(ms): # ms --> time in milliseconds
start = pygame.time.get_ticks()
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit(0)
now = pygame.time.get_ticks()
if now - start == ms:
running = False
解釋
它需要一個引數:ms,這是您希望程式等待的時間量,以毫秒為單位(1 秒 = 1000 毫秒)。在函式中,我設定了一個名為startto的變數pygame.time.get_ticks(),它回傳當前時間。然后,在一個 while 回圈中,我創建了一個事件回圈來檢查pygame.QUIT事件,以便如果用戶X在函式仍在運行時單擊,程式將回應并退出程式。在事件回圈之后,我設定了一個名為nowto的變數pygame.time.get_ticks()來獲取當前時間。然后我檢查了now(當前時間)減去start(開始時間)是否等于ms(給定的等待時間,以毫秒為單位)。這將檢查給定的時間是否已經過去。如果有,while 回圈結束。如果不是,則 while 回圈將繼續運行,直到該條件為True.
uj5u.com熱心網友回復:
我已經找到了實作這一目標的方法,同樣它可能不是最佳方法,但它可以完成作業:
匯入Timerfromthreading以創建一個計時器并將繪制下一個螢屏/場景的函式作為引數傳遞以將其延遲幾毫秒就可以了。
#up in the script
from threading import Timer
import pygame
#then some code goes here
.
.
.
def showNextScreen():
#code related to the next screen goes here
startBtn = Button(display, (100, 160), (200, 40), (40, 40, 40), (70, 70, 70))
run = True
while run:
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
elif (event.type == pygame.MOUSEBUTTONDOWN and event.button == 1):
if(startBtn.rect.collidepoint(pygame.mouse.get_pos())):
t = Timer(0.3, showNextScreen) #Timer(seconds, function)
t.start() #starts the timer and once its over it calls the function passed
#giving the button animation enough time to fully finish.
print('pressed')
display.fill((50, 50, 50))
startBtn.update()
pygame.display.update()
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/420529.html
標籤:
