pygame_sdl2 - 应用程序在pygame.mouse.get_pressed()期间在移动设备上崩溃

时间:2018-01-23 11:56:51

标签: android python pygame sdl-2

我正在使用pygamepygame_sdl2以及rapt开发适用于Android的游戏。

目前,游戏正处于发展的第一阶段。

我的屏幕左下方有一个游戏手柄画,当按下游戏手柄按钮的坐标时按下鼠标,根据按钮设置移动一个角色。鼠标事件用作触摸事件in this (working) example

问题是:游戏正在我的笔记本电脑上运行(我使用的是Ubuntu),但不在我的移动设备上。当我开始游戏时,一切都按预期显示,但是一旦我触摸屏幕(无论是在按钮上还是在其他地方),应用程序都会在后台显示。

如果您想要查看整个代码(所有相关内容都在main.py文件中),我的游戏将在公共github仓库中。

我认为错误是通过调用pygame.mouse.get_pressed()触发的。

这是一些相关的代码,希望有助于理解这个问题。

Joypad类(btn_pressed方法)

def btn_pressed(self, mouse_event):
    # check if left mouse is being pressed
    if pygame.mouse.get_pressed()[0]:
        x, y  = mouse_event.pos
        if self.btn_up.rect.collidepoint(x, y):
            return 'UP'
        elif self.btn_down.rect.collidepoint(x, y):
            return 'DOWN'
        elif self.btn_left.rect.collidepoint(x, y):
            return 'LEFT'
        elif self.btn_right.rect.collidepoint(x, y):
            return 'RIGHT'

字符类(移动方法)

def move(self, joypad_direction):
    """
    move the character
    to be used along with Joypad.btn_pressed returns
    ('UP', 'DOWN' 'LEFT', 'RIGHT')
    """

    self.dx = 0
    self.dy = 0

    # check for horizontal move
    if joypad_direction == 'LEFT':
        self.dx = -self.speed
        self.rect.move_ip(-self.speed, 0)
    if joypad_direction == 'RIGHT':
        self.dx = +self.speed
        self.rect.move_ip(self.speed, 0)

    self.dx = 0

    # check for vertical move
    if joypad_direction == 'UP':
        self.dy = -self.speed
        self.rect.move_ip(0, -self.speed)
    if joypad_direction == 'DOWN':
        self.dy = +self.speed
        self.rect.move_ip(0, self.speed)
        self.dy = 0

主循环

while True:

    ev = pygame.event.wait()

    # If not sleeping, draw the screen.
    if not sleeping:
        hero.move(joypad.btn_pressed(ev))
        screen.fill((0, 0, 0, 255))

        joypad.buttons.draw(screen)

        if x is not None:
            screen.blit(hero.image, (x, y))

        pygame.display.flip()

1 个答案:

答案 0 :(得分:0)

如评论中所述,我的主循环中存在问题。

我只需要更改我的代码:

if not sleeping:
    if not sleeping:
        hero.move(joypad.btn_pressed(ev))

为:

if not sleeping:
    if ev.type == pygame.MOUSEMOTION or ev.type == pygame.MOUSEBUTTONUP:
        hero.move(joypad.btn_pressed(ev))

这样" Joypad类(btn_pressed方法)"当事件是(例如)QUIT时调用x, y = mouse_event.pos时不会出错,因此不会返回任何坐标(另请参阅下面的pygame's event documentation page图片)。

enter image description here