【问题标题】:pygame_sdl2 - app is crashing on mobile during pygame.mouse.get_pressed()pygame_sdl2 - 应用程序在 pygame.mouse.get_pressed() 期间在移动设备上崩溃
【发布时间】:2018-01-23 11:56:50
【问题描述】:

我正在使用pygamepygame_sdl2 以及rapt 为部署开发一款适用于Android 的游戏。

目前,该游戏处于开发的第一阶段。

我在屏幕左下角有一个游戏手柄,当鼠标在手柄按钮的坐标上按下时,一个字符会根据按钮的方向移动。鼠标事件作为触摸事件使用in this (working) example

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

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

我认为错误是由对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()

【问题讨论】:

  • 也许我在我的代码中发现了一个问题。在 Joypad.btn_pressed() 方法中,我传递了一个事件,但它可以是任何类型(不仅仅是(广义上的)“鼠标事件”)。因此,如果(例如)事件为 QUIT(没有pos 属性),则对ev.pos 的调用可能会失败。我现在通过在调用hero.move(joypad.btn_pressed(ev)) 之前执行if ev.type == pygame.MOUSEMOTION or ev.type == pygame.MOUSEBUTTONUP: 在我的主循环中检查这一点。我将不得不在其中一个晚上在移动设备上进行测试,看看这是否解决了问题。会回来做我的测试。
  • 您确定可以使用这些工具部署到桌面吗?我认为事件处理可能会有一些复杂性。但是,该修复似乎需要并且可能导致问题。我很想看看它是否能解决问题。
  • 确实如此。我将修复提交给我的回购(见上文)。到目前为止,它在台式机和移动设备上都可以使用,但仍有一些问题需要解决。当我不是来自移动设备时,我会发布更新的代码部分作为答案。谢谢!
  • 关于部署到桌面。我想你可以。我只是在用 rapt 测试移动设备,但只要代码在桌面(我正在开发的地方)上以几乎相同的方式工作,它就应该是可部署的。我只是将鼠标事件视为触摸(尽管它们的行为有点不同)。随意查看我在 github 上的 repo (github.com/umbe1987/android_platformer)。它处于最初的阶段,但希望能提供一些提示。
  • 在移动端测试后初始问题是否仍然存在?

标签: android python pygame sdl-2


【解决方案1】:

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

我只需要更改我的代码:

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) .

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多