PyGame 任何触摸屏

Zen*_*nie 5 python pygame

我正在尝试创建一个简单的程序,用户可以在其中使用手指(在触摸屏上)移动屏幕上的形状。

到目前为止,这是我的代码:

import pygame


def main():
    pygame.init()
    DISPLAY = pygame.display.set_mode((1000,500),0,32)
    WHITE = (255,255,255)
    blue = (0,0,255)
    DISPLAY.fill(WHITE)
    pygame.mouse.set_visible(False)
    pygame.draw.rect(DISPLAY, blue,(480,200,50,250))
    pygame.display.update()
    pygame.mouse.set_pos(480, 200)
    while True:
        for event in pygame.event.get():
            pos = pygame.mouse.get_pos()
            pygame.draw.rect(DISPLAY, blue, (pos[0]-25,pos[1], 50, 250))
            pygame.display. update()
            DISPLAY.fill(WHITE)
main()
Run Code Online (Sandbox Code Playgroud)

问题是,当我触摸屏幕时,除非我移动手指,否则什么都不会发生。如果我打印事件,我可以看到在我开始移动手指之前没有列出任何事件,所以这可能就是原因。

我希望能够在屏幕开始移动之前在屏幕上注册手指按下(我猜是一个事件),有没有办法使用 PyGame 来做到这一点?

谢谢。

小智 8

以防万一有人后来偶然发现这个问题,在 pygame 2 中有更好的触摸支持。您可以安装

pip install pygame==2.0.0.dev6
Run Code Online (Sandbox Code Playgroud)

(查看 pygame github 的最新版本)并且存在三种新的事件类型。pygame.FINGERDOWNpygame.FINGERUP, 和pygame.FINGERMOTION。该pygame.FINGERUP事件在触摸屏幕时立即注册触摸输入,而不是像释放屏幕时那样pygame.MOUSEBUTTONDOWN


小智 5

我制作了一款利用计算机触摸屏的游戏,并通过处理两种类型的事件来很好地管理触摸。一个是pygame.MOUSEMOTION,另一个是pygame.MOUSEBUTTONDOWN。它们都包含属性event.pos。问题是,至少在我的触摸屏(联想)上,初始触摸没有被 pygame 的事件处理程序注册。

您可以通过在触摸屏幕时将所有事件打印到终端来确认这一点。在我松开或移动手指之前我什么也得不到,但松开后我很快就会收到事件,pygame.MOUSEBUTTONDOWN然后是pygame.MOUSEBUTTONUP

我知道这并不能真正解决您的问题,但它可能会在某种程度上帮助您。否则,请查看Kivy。那里可能有解决方案。

import pygame

def main():
    pygame.init()
    DISPLAY = pygame.display.set_mode((1000,500),0,32)
    WHITE = (255,255,255)
    blue = (0,0,255)
    DISPLAY.fill(WHITE)
    pygame.mouse.set_visible(False)
    pygame.draw.rect(DISPLAY, blue,(480,200,50,250))
    pygame.display.update()
    pygame.mouse.set_pos(480, 200)
    while True:
        for event in pygame.event.get():
            if event.type == MOUSEBUTTONDOWN or event.type == MOUSEMOTION:
                pos = event.pos
            pygame.draw.rect(DISPLAY, blue, (pos[0]-25,pos[1], 50, 250))
            pygame.display. update()
            DISPLAY.fill(WHITE)
main()
Run Code Online (Sandbox Code Playgroud)