如何在 Pygame Scaled Surface 上获取鼠标位置? [英] How do I get the Mouse Position on a Pygame Scaled Surface?

查看:60
本文介绍了如何在 Pygame Scaled Surface 上获取鼠标位置?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

The game I'm making blits everything onto a pygame.surface which is then scaled to the size of the user's display, maintaining aspect ratio, before the surface is then blitted to the main screen. The problem I'm having now, is that when I query the mouse position (because I want to do a hover effect on certain sprites), it's way off where the sprite is but the x and y match the sprite's coords. Is this because I've scaled the surface? And if so, is there a built-in Pygame method for assigning the mouse to different surfaces? Or will I have to write an algorithm to convert the coords?

推荐答案

您也可以根据缩放源表面的系数缩放"鼠标位置

You can just "scale" the mouse position, too, by the factor you scaled your source surface

这是一个简单的例子

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) 处被 blitted.如果您要在其他地方进行 blit,则必须相应地平移鼠标位置.

Of course this only works because scaled_surface is blitted at (0, 0) of the screen. If you would blit it elsewhere, you would have to translate the mouse position accordingly.

这篇关于如何在 Pygame Scaled Surface 上获取鼠标位置?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆