MottledKarma517
MottledKarma517

Reputation: 21

Adjust image of rect

I want to move the image of a Rect object, is this possible?

examples: 1 - make a waterfall with the water animated (make the water image scroll) 2 - adjust location of the image not the rect

note: these are just examples not the code I am working on

Upvotes: 0

Views: 90

Answers (1)

Rabbid76
Rabbid76

Reputation: 211268

You can shift the surface image in place with pygame.Surface.scroll. For instance, call

water_surf.scroll(0, 1)

However, this will not satisfy you. See pygame.Surface.scroll:

Move the image by dx pixels right and dy pixels down. dx and dy may be negative for left and up scrolls respectively. Areas of the surface that are not overwritten retain their original pixel values.

You may want to write a function that overwrites the areas wich are not overwritten, with the pixel that is scrolled out of the surface:

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

once per frame to create a water flow effect like a waterfall.

To center an image in a rectangular area, you need to get the bounding rectangle of the image and set the center of the rectnagle through the center of the area. Use the rectangle to blit the image:

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

The same in one line:

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

Minimal example:

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

Upvotes: 1

Related Questions