当前位置: 首页 > 知识库问答 >
问题:

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

满博
2023-03-14

我正在制作的游戏把所有东西都放在pygame.surface上,然后按用户显示器的大小缩放,保持宽高比,然后再把表面放在主屏幕上。我现在遇到的问题是,当我查询鼠标位置时(因为我想对某些精灵做悬停效果),它离精灵的位置很远,但是x和y匹配精灵的坐标。这是因为我爬上了表面吗?如果是这样,是否有一个内置的PyGame方法将鼠标分配到不同的表面?还是我必须写一个算法来转换这些弦?

共有1个答案

单于帅
2023-03-14

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

这里有一个简单的例子

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)处显示缩放曲面。如果您要在其他地方使用blit,则必须相应地转换鼠标位置。

 类似资料:
  • 问题内容: 我需要在滚动窗格上相对于鼠标位置放大/缩小。 我目前通过将内容包装在一个组中并缩放组本身来实现缩放功能。我用自定义枢轴创建一个新的Scale对象。(枢轴设置为鼠标位置) 这在Group的初始比例为1.0的情况下非常适用,但是之后的缩放比例无法沿正确的方向缩放-我相信这是因为Group缩放后相对鼠标位置会发生变化。 我的代码: 如何在不同的缩放级别上获得正确的鼠标位置?有没有一种更简单的

  • 有什么想法吗?提前谢了。

  • 问题内容: 我正在尝试使用Jinput打印出鼠标位置: 这是我的InputManager,它在初始化时扫描所有输入设备,并将所有鼠标分离到单独的列表中: x和y的打印信息始终为0。我在Windows 10上运行此程序,是否会引起任何问题?如何使用Jinput从鼠标获取鼠标数据? 问题答案: JInput处于较低级别,您正在混淆窗口指针和鼠标。鼠标只是相对轴> 2的设备。每次轮询后或在每个事件中的值

  • 问题内容: 我想在Java中模拟鼠标的自然运动(从此处逐像素移动)。为此,我需要知道起始坐标。 我找到了方法event.getX()和event.getY(),但是我需要一个事件… 我如何不做任何事情(或看不见的事情)就知道职位? 谢谢 问题答案: MouseInfo.getPointerInfo()。getLocation()可能会有所帮助。它返回与当前鼠标位置相对应的Point对象。

  • 我需要相对于鼠标位置放大/缩小滚动窗格。 我目前通过将我的内容包装在一个组中并缩放组本身来实现缩放功能。我创建了一个带有自定义透视的新Scale对象。(枢轴设置为鼠标位置) 如何在不同级别的缩放中获得正确的鼠标位置?是否有一种完全不同的方法来缩放滚动窗格更容易?

  • 目前我正在使用glOrtho来缩放和平移我正在渲染的2D图形。 我已经将视窗设置为标准的宽度和高度。然后,我设置glOrtho,使我的平截头体使屏幕坐标匹配世界坐标。 当我在鼠标回调中执行缩放功能时,我将截头体边缘乘以缩放因子。。。。 我的问题是……如何使用鼠标位置作为中心进行缩放? 我尝试过这个…(其中mouseStoreX和mousestrey是第一次单击时存储的位置) 它似乎工作,但当我做一