Scaling An Image/rectangle In Pygame
Is it possible to 'scale' a rectangle inside of pygame. Kinda like when you scale your windows on your desktop, I'm wondering how you could do so in pygame. Your cursor will contro
Solution 1:
You can simply change the width and the height of the rect (the w
and h
attributes). When the mouse gets moved (a MOUSEMOTION
event is added to the queue) and if the rect is selected, add the relative movement event.rel
to the width and the height.
import pygame as pg
pg.init()
screen = pg.display.set_mode((640, 480))
clock = pg.time.Clock()
rect = pg.Rect(100, 100, 161, 100)
rect_selected = False
done = Falsewhilenot done:
for event in pg.event.get():
if event.type == pg.QUIT:
done = Trueelif event.type == pg.MOUSEBUTTONDOWN:
# Set rect_selected to True when the user clicks on the rect.if rect.collidepoint(event.pos):
rect_selected = Trueelif event.type == pg.MOUSEBUTTONUP:
rect_selected = Falseelif event.type == pg.MOUSEMOTION:
if rect_selected:
# Simply adjust the width and the height of the screen# by subtracting the relative mouse movement.
rect.w += event.rel[0]
rect.h += event.rel[1]
# 10*10 px is the minimal size, so that the rect can# still be clicked.
rect.w = max(rect.w, 10)
rect.h = max(rect.h, 10)
screen.fill((30, 30, 30))
pg.draw.rect(screen, (0, 100, 250), rect)
pg.display.flip()
clock.tick(30)
If you want to do this with several rects, you can just assign the clicked rect to a variable (selected_rect
in this case) and then scale it.
import pygame as pg
pg.init()
screen = pg.display.set_mode((640, 480))
clock = pg.time.Clock()
rect1 = pg.Rect(100, 100, 161, 100)
rect2 = pg.Rect(300, 200, 161, 100)
selected_rect = None
done = Falsewhilenot done:
for event in pg.event.get():
if event.type == pg.QUIT:
done = Trueelif event.type == pg.MOUSEBUTTONDOWN:
# Set selected_rect to the colliding rect.for rect in (rect1, rect2):
if rect.collidepoint(event.pos):
selected_rect = rect
elif event.type == pg.MOUSEBUTTONUP:
selected_rect = None# De-select.elif event.type == pg.MOUSEMOTION:
if selected_rect isnotNone: # Scale if a rect is selected.
selected_rect.w += event.rel[0]
selected_rect.h += event.rel[1]
selected_rect.w = max(selected_rect.w, 10)
selected_rect.h = max(selected_rect.h, 10)
screen.fill((30, 30, 30))
pg.draw.rect(screen, (0, 100, 250), rect1)
pg.draw.rect(screen, (0, 200, 120), rect2)
pg.display.flip()
clock.tick(30)
Solution 2:
This is a working example. You are going to have to adapt it to your situation.
import pygame
rect = pygame.Rect(50, 50, 100, 100)
screen = pygame.display.set_mode((200, 200))
running = True
while running:
foreventin pygame.event.get():
ifevent.type == pygame.QUIT:
running = False
elif event.type == pygame.MOUSEMOTION andevent.buttons[0]:
p = event.pos[0] - event.rel[0], event.pos[1] - event.rel[1]
if pygame.Rect(rect.left, rect.top - 2, rect.width, 4).collidepoint(*p): # top
rect = pygame.Rect(rect.left, rect.top + event.rel[1], rect.width, rect.height - event.rel[1])
elif pygame.Rect(rect.left, rect.bottom - 2, rect.width, 4).collidepoint(*p): # bottom
rect = pygame.Rect(rect.left, rect.top, rect.width, rect.height + event.rel[1])
if pygame.Rect(rect.left - 2, rect.top, 4, rect.height).collidepoint(*p): # left
rect = pygame.Rect(rect.left + event.rel[0], rect.top, rect.width - event.rel[0], rect.height)
elif pygame.Rect(rect.right - 2, rect.top, 4, rect.height).collidepoint(*p): # right
rect = pygame.Rect(rect.left, rect.top, rect.width + event.rel[0], rect.height)
screen.fill((0, 0, 0))
pygame.draw.rect(screen, (255, 255, 255), rect)
pygame.display.update()
Post a Comment for "Scaling An Image/rectangle In Pygame"