Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pygame. How do I resize a surface and keep all objects within proportionate to the new window size?

If I set a pygame window to resizable and then click and drag on the border of the window the window will get larger but nothing blit onto the surface will get larger with it. (Which is understandable) How would I make it so that when I resize a window all blit objects resize with it and fill the window properly?

For example: Say I have a window of 200 x 200 and I blit a button at window_width/2 and window_height/2. The button would be in the center of the window at 100 x 100. Now if I resize the window to 300 x 300 the button stays at 100 x 100 instead of 150 x 150.

I tried messing around with pygame.Surface.get_width ect, but had no luck. Basically I'm trying to resize a program's window and have all blit images stay proportionate.

like image 430
RatstabOfficial Avatar asked Jan 20 '16 20:01

RatstabOfficial


People also ask

What does the blit () function do in pygame?

blit() — blit stands for Block Transfer—and it's going to copy the contents of one Surface onto another Surface . 00:17 The two surfaces in question are the screen that you created and the new Surface . So, . blit() will take that rectangular Surface and put it on top of the screen.


1 Answers

Don't draw on the screen directly, but on another surface. Then scale that other surface to size of the screen and blit it on the screen.

Here's a simple example:

import pygame
from pygame.locals import *

def main():
    pygame.init()
    screen = pygame.display.set_mode((200, 200),HWSURFACE|DOUBLEBUF|RESIZABLE)
    fake_screen = screen.copy()
    pic = pygame.surface.Surface((50, 50))
    pic.fill((255, 100, 200))

    while True:
        for event in pygame.event.get():
            if event.type == QUIT: 
                pygame.display.quit()
            elif event.type == VIDEORESIZE:
                screen = pygame.display.set_mode(event.size, HWSURFACE|DOUBLEBUF|RESIZABLE)

        fake_screen.fill('black')
        fake_screen.blit(pic, (100, 100))
        screen.blit(pygame.transform.scale(fake_screen, screen.get_rect().size), (0, 0))
        pygame.display.flip()
    
main()    
like image 164
sloth Avatar answered Nov 14 '22 23:11

sloth