Python 3.x 如何在Pygame缩放的曲面上获取鼠标位置?

Python 3.x 如何在Pygame缩放的曲面上获取鼠标位置?,python-3.x,pygame,pygame-surface,Python 3.x,Pygame,Pygame Surface,我正在制作的游戏将所有内容都显示在pygame.surface上,然后将其缩放到用户显示器的大小,保持纵横比,然后再将该表面显示到主屏幕上。我现在遇到的问题是,当我查询鼠标位置时(因为我想在某些精灵上执行悬停效果),它离精灵所在的位置很远,但x和y与精灵的坐标相匹配。这是因为我缩放了曲面吗?如果是这样,有没有内置的Pygame方法将鼠标分配到不同的表面?或者我必须写一个算法来转换坐标 您也可以通过缩放源曲面的因子来“缩放”鼠标位置 这里有一个简单的例子 import string import

我正在制作的游戏将所有内容都显示在pygame.surface上,然后将其缩放到用户显示器的大小,保持纵横比,然后再将该表面显示到主屏幕上。我现在遇到的问题是,当我查询鼠标位置时(因为我想在某些精灵上执行悬停效果),它离精灵所在的位置很远,但x和y与精灵的坐标相匹配。这是因为我缩放了曲面吗?如果是这样,有没有内置的Pygame方法将鼠标分配到不同的表面?或者我必须写一个算法来转换坐标

您也可以通过缩放源曲面的因子来“缩放”鼠标位置

这里有一个简单的例子

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


当然,这仅适用于在屏幕的
(0,0)
处显示
缩放曲面。如果你想把它放到别处,你必须相应地转换鼠标位置。

Brilliant@sloth这正是我想要的!让我感到不安的是,精灵们亮了起来,但只有当鼠标向右和向下移动的时候,而且位置似乎匹配。然后我想到这可能是因为缩放。幸运的是,我的曲面位于(0,0),所以这将非常好地工作,谢谢老兄。