pygame_sdl2 - 应用程序在 pygame.mouse.get_pressed() 期间在移动设备上崩溃
pygame_sdl2 - app is crashing on mobile during pygame.mouse.get_pressed()
我正在为 android 开发一款游戏 pygame
and pygame_sdl2
, and rapt
用于部署。
目前,游戏处于开发的最初阶段。
我在屏幕左下角绘制了一个游戏手柄,当鼠标在游戏手柄按钮的坐标上按下时,一个角色会根据按钮的方向移动。鼠标事件用作触摸事件 in this (working) example.
问题是:游戏可以在我的笔记本电脑上运行(我使用的是 Ubuntu),但不能在我的移动设备上运行。当我开始游戏时,一切都按预期显示,但只要我触摸屏幕(无论是在按钮上还是在其他地方),应用程序就会进入后台。
如果您想查看完整代码,我的游戏在 public github 存储库中(所有相关内容都在 main.py
文件中)。
我认为错误是由对 pygame.mouse.get_pressed()
.
的调用触发的
下面是一些相关代码,希望有助于理解问题。
手柄class(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'
字符class(移动方式)
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()
如评论中所述,我的主循环中存在问题。
我只需要更改我的代码:
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 class (btn_pressed method)" 在事件(例如)退出时调用 x, y = mouse_event.pos
时不会出现错误,因此不会返回任何坐标(另请参见从 pygame's event documentation page).
我正在为 android 开发一款游戏 pygame
and pygame_sdl2
, and rapt
用于部署。
目前,游戏处于开发的最初阶段。
我在屏幕左下角绘制了一个游戏手柄,当鼠标在游戏手柄按钮的坐标上按下时,一个角色会根据按钮的方向移动。鼠标事件用作触摸事件 in this (working) example.
问题是:游戏可以在我的笔记本电脑上运行(我使用的是 Ubuntu),但不能在我的移动设备上运行。当我开始游戏时,一切都按预期显示,但只要我触摸屏幕(无论是在按钮上还是在其他地方),应用程序就会进入后台。
如果您想查看完整代码,我的游戏在 public github 存储库中(所有相关内容都在 main.py
文件中)。
我认为错误是由对 pygame.mouse.get_pressed()
.
下面是一些相关代码,希望有助于理解问题。
手柄class(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'
字符class(移动方式)
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()
如评论中所述,我的主循环中存在问题。
我只需要更改我的代码:
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 class (btn_pressed method)" 在事件(例如)退出时调用 x, y = mouse_event.pos
时不会出现错误,因此不会返回任何坐标(另请参见从 pygame's event documentation page).