Как я могу получить положение мыши на поверхности в масштабе Pygame? - PullRequest
0 голосов
/ 31 октября 2018

Игра, которую я создаю, перетаскивает все на поверхность pygame.surface, которая затем масштабируется до размера дисплея пользователя, сохраняя соотношение сторон, прежде чем поверхность затем переместится на главный экран. Проблема, с которой я сталкиваюсь сейчас, состоит в том, что когда я запрашиваю положение мыши (потому что я хочу сделать эффект наведения на определенных спрайтах), это далеко от спрайта, но x и y соответствуют координатам спрайта. Это потому что я масштабировал поверхность? И если да, то есть ли встроенный метод Pygame для назначения мыши различным поверхностям? Или мне придется написать алгоритм для преобразования координат?

1 Ответ

0 голосов
/ 31 октября 2018

Вы также можете просто «масштабировать» положение мыши в зависимости от того, насколько вы масштабировали исходную поверхность

Вот простой пример

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

enter image description here

Конечно, это работает только потому, что scaled_surface мигает на (0, 0) экрана. Если бы вы переместили его в другое место, вам бы пришлось соответствующим образом перевести положение мыши.

...