【发布时间】:2018-01-23 11:56:50
【问题描述】:
我正在使用pygame 和pygame_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