如何获得 Pygame 缩放表面上的鼠标位置?
How do I get the Mouse Position on a Pygame Scaled Surface?
我正在制作的游戏将所有内容 blits 到 pygame.surface 上,然后将其缩放到用户显示器的大小,保持纵横比,然后再将表面 blits 到主屏幕。我现在遇到的问题是,当我查询鼠标位置时(因为我想对某些精灵进行悬停效果),它远离精灵所在的位置,但 x 和 y 与精灵的坐标相匹配。这是因为我缩放了表面吗?如果是这样,是否有内置的 Pygame 方法可以将鼠标分配到不同的表面?还是我必须编写一个算法来转换坐标?
您也可以 "scale" 鼠标位置,根据您缩放源表面的系数
这是一个简单的例子
import string
import pygame as pg
pg.init()
screen = pg.display.set_mode((640, 480))
screen_rect = screen.get_rect()
clock = pg.time.Clock()
# the surface we draw our stuff on
some_surface = pg.Surface((320, 240))
some_surface_rect = some_surface.get_rect()
# just something we want to check for mouse hovering
click_me = pg.Surface((100, 100))
click_me_rect = click_me.get_rect(center=(100, 100))
hover = False
done = False
while not done:
for event in pg.event.get():
if event.type == pg.QUIT or event.type == pg.KEYDOWN and event.key == pg.K_ESCAPE:
done = True
# draw some stuff on our surface
some_surface.fill(pg.Color('gray12'))
click_me.fill(pg.Color('dodgerblue') if not hover else pg.Color('red'))
some_surface.blit(click_me, click_me_rect)
# scale it
scaled_surface = pg.transform.scale(some_surface, screen_rect.size)
# draw it on the window
screen.blit(scaled_surface, (0, 0))
pos = list(pg.mouse.get_pos())
# take the mouse position and scale it, too
ratio_x = (screen_rect.width / some_surface_rect.width)
ratio_y = (screen_rect.height / some_surface_rect.height)
scaled_pos = (pos[0] / ratio_x, pos[1] / ratio_y)
# use collidepoint as usual
hover = click_me_rect.collidepoint(scaled_pos)
pg.display.flip()
clock.tick(60)
pg.quit()
当然,这只有效,因为 scaled_surface
在屏幕的 (0, 0)
处被 blit 了。如果您要将其 blit 到别处,则必须相应地转换鼠标位置。
我正在制作的游戏将所有内容 blits 到 pygame.surface 上,然后将其缩放到用户显示器的大小,保持纵横比,然后再将表面 blits 到主屏幕。我现在遇到的问题是,当我查询鼠标位置时(因为我想对某些精灵进行悬停效果),它远离精灵所在的位置,但 x 和 y 与精灵的坐标相匹配。这是因为我缩放了表面吗?如果是这样,是否有内置的 Pygame 方法可以将鼠标分配到不同的表面?还是我必须编写一个算法来转换坐标?
您也可以 "scale" 鼠标位置,根据您缩放源表面的系数
这是一个简单的例子
import string
import pygame as pg
pg.init()
screen = pg.display.set_mode((640, 480))
screen_rect = screen.get_rect()
clock = pg.time.Clock()
# the surface we draw our stuff on
some_surface = pg.Surface((320, 240))
some_surface_rect = some_surface.get_rect()
# just something we want to check for mouse hovering
click_me = pg.Surface((100, 100))
click_me_rect = click_me.get_rect(center=(100, 100))
hover = False
done = False
while not done:
for event in pg.event.get():
if event.type == pg.QUIT or event.type == pg.KEYDOWN and event.key == pg.K_ESCAPE:
done = True
# draw some stuff on our surface
some_surface.fill(pg.Color('gray12'))
click_me.fill(pg.Color('dodgerblue') if not hover else pg.Color('red'))
some_surface.blit(click_me, click_me_rect)
# scale it
scaled_surface = pg.transform.scale(some_surface, screen_rect.size)
# draw it on the window
screen.blit(scaled_surface, (0, 0))
pos = list(pg.mouse.get_pos())
# take the mouse position and scale it, too
ratio_x = (screen_rect.width / some_surface_rect.width)
ratio_y = (screen_rect.height / some_surface_rect.height)
scaled_pos = (pos[0] / ratio_x, pos[1] / ratio_y)
# use collidepoint as usual
hover = click_me_rect.collidepoint(scaled_pos)
pg.display.flip()
clock.tick(60)
pg.quit()
当然,这只有效,因为 scaled_surface
在屏幕的 (0, 0)
处被 blit 了。如果您要将其 blit 到别处,则必须相应地转换鼠标位置。