Python/Pygame:如何用KEYUP事件打断由KEYDOWN事件启动的while循环?

0 投票
1 回答
2584 浏览
提问于 2025-04-18 15:17

我正在开发一个应用程序,让用户可以对三个不同的变量(R、G、B)进行加减。这些变量的值会被处理,然后用来在屏幕上绘制出它们所代表的颜色的图像。

为了实现这个功能,我设置了六个不同的按键来处理这个操作:q、w、e 和 a、s、d。前面三个按键用来增加它们各自对应的变量的值,后面三个则用来减少这些变量的值。

我已经完成了这些功能,但我希望能实现一个循环,这样当按住某个按键时,它就会持续增加或减少值,而不是需要按最多255次才能达到最大值,松开按键后再停止。

相关的代码如下:

def main():
    global keypressed

    while True:

        #Displays current coordinates of mouse
        mouseText=str(pygame.mouse.get_pos())
        mousecoordstext = font.render('(X,Y) - '+ mouseText + '      ', 1, (black), (gray5))
        Surface.blit(mousecoordstext, (155,105))

        for event in pygame.event.get():

            if event.type == QUIT:
                pygame.quit()
                sys.exit()

            if event.type == KEYDOWN:
                keypressed = True #A key is being pressed, initiate loop after figuring out what key it was

                if event.key == K_ESCAPE:
                    pygame.quit
                    sys.exit()

                #Variable Explanations
                #changeType: indicates either subtraction or addition to variable
                #color: indicates what color is being changed

                if event.key == K_q:
                    changeType = 1
                    color = 1                                                   
                elif event.key == K_a:
                    changeType = 0
                    color = 1
                elif event.key == K_w:
                    changeType = 1
                    color = 2                   
                elif event.key == K_s:
                    changeType = 0
                    color = 2
                elif event.key == K_e:
                    changeType = 1
                    color = 3
                elif event.key == K_d:
                    changeType = 0
                    color = 3

            if event.type == KEYUP:
                keypressed = False #A key is no longer being pressed

                #The loop in question is below
                while keypressed: 
                    if keypressed == False: #When a key is no longer being pressed
                        break
                    else:
                        Color_Update(changeType, color)#Calculate color changes                
                        Color_Draw(red, green, blue)#Draw the new color

            pygame.display.update()

main()

我怀疑我需要在我的循环中检查一下pygame的事件?但我不太确定该怎么做。

很抱歉可能问了一个类似的问题,但我看了很多这样的提问都没有找到答案,所以我决定自己问,因为我觉得我的情况有所不同。

1 个回答

0

你不需要再开一个循环来处理这个问题。在你的主循环里,只要检查一下keypressed这个变量是不是还是true,然后对你的变量进行相应的修改。颜色变化的效果应该一直重复,直到检测到一个KEYUP事件为止。
所以,你的主循环大概可以写成这样:

while True:

    for event in pygame.event.get():

        if event.type == KEYDOWN:
            keypressed = True

            #Set your changetype and color variables

        if event.type == KEYUP:

            keypressed = False;

    if keypressed:

        Color_Update(changeType, color)                
        Color_Draw(red, green, blue)

    pygame.display.update()

像往常一样,确保你的帧率调整得当,这样效果才会以合理的速度进行。

撰写回答