Настройка изображения rect

#python #pygame

#python #pygame

Вопрос:

Я хочу переместить изображение объекта Rect, возможно ли это?

примеры: 1 — создание водопада с анимацией воды (прокрутка изображения воды) 2 — настройка местоположения изображения, а не прямоугольника

примечание: это всего лишь примеры, а не код, над которым я работаю

Ответ №1:

Вы можете переместить изображение поверхности на место с pygame.Surface.scroll помощью . Например, вызовите

 water_surf.scroll(0, 1)
 

Однако это вас не удовлетворит. См. pygame.Surface.scroll :

Переместите изображение на dx пикселей вправо и dy пикселей вниз. dx и dy могут быть отрицательными для прокрутки влево и вверх соответственно. Области поверхности, которые не перезаписываются, сохраняют свои исходные значения пикселей.

Возможно, вы захотите написать функцию, которая перезаписывает области, которые не перезаписаны, пикселем, который прокручивается за пределы поверхности:

 def scroll_y(surf, dy):
    scroll_surf = surf.copy()
    scroll_surf.scroll(0, dy)
    if dy > 0:
        scroll_surf.blit(surf, (0, dy-surf.get_height()))
    else:
        scroll_surf.blit(surf, (0, surf.get_height() dy))
    return scroll_surf
 

один раз за кадр, чтобы создать эффект потока воды, подобный водопаду.

Чтобы центрировать изображение в прямоугольной области, вам нужно получить ограничивающий прямоугольник изображения и установить центр прямоугольника через центр области. Используйте прямоугольник для blit изображения:

 area_rect = pygame.Rect(x, y, w, h)
image_rect = surf.get_rect()
image_rect.center = area_rect.center
screen.blit(surf, image_rect)
 

То же самое в одной строке:

 screen.blit(surf, surf.get_rect(center = area_rect.center))
 

Минимальный пример:

repl.it/@Rabbid76/PyGame-SCroll

 import pygame

def scroll_y(surf, dy):
    scroll_surf = surf.copy()
    scroll_surf.scroll(0, dy)
    if dy > 0:
        scroll_surf.blit(surf, (0, dy-surf.get_height()))
    else:
        scroll_surf.blit(surf, (0, surf.get_height() dy))
    return scroll_surf

pygame.init()
window = pygame.display.set_mode((400, 400))
clock = pygame.time.Clock()

rain_surf = pygame.image.load('rain.png')
dy = 0

run = True
while run:
    clock.tick(60)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False          

    window_center = window.get_rect().center
    scroll_surf = scroll_y(rain_surf, dy)
    dy = (dy   1) % rain_surf.get_height()

    window.fill(0)
    window.blit(scroll_surf, scroll_surf.get_rect(center = window_center))
    pygame.display.flip()

pygame.quit()
exit()
 

Комментарии:

1. Работает блестяще! однако, как я мог бы перенаправить изображение на прямоугольник?

2. @MottledKarma517 Раздел комментариев не предназначен для того, чтобы задавать дополнительные вопросы. В любом случае, я расширил ответ.