Versión: 2.x.
Una pequeña simulación utilizando PyGame y el módulo scheduler para el control de las animaciones.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pygame
from scheduler import Scheduler
WHITE = 255, 255, 255
RED = 255, 0, 0
BLUE = 0, 0, 255
class AnimatedScale(object):
def __init__(self, surface, size):
self.surface = surface
self.size = size
self.positions = self._get_pos_path(surface.get_size(), size)
def _get_pos_addends(self, a, b):
dist_x = float(a[0] - b[0]) * -1
dist_y = float(a[1] - b[1]) * -1
loops = max(abs(dist_x), abs(dist_y))
return (loops, (dist_x / loops if loops > 0 else 0,
dist_y / loops if loops > 0 else 0))
def _get_pos_path(self, a, b):
loops, (add_x, add_y) = self._get_pos_addends(a, b)
for i in range(1, int(loops + 1)):
yield int(a[0] + round(add_x*i)), int(a[1] + round(add_y*i))
def update(self):
return pygame.transform.smoothscale(
self.surface, next(self.positions))
class Main(object):
def __init__(self):
pygame.init()
self.screen = pygame.display.set_mode((600, 400))
pygame.display.set_caption("Transformación del panadero")
run = True
self.moving = False
self.stage = 0
self.scaling = False
self.scaling_sprites = []
self.create_surfaces()
pygame.draw.rect(self.first, RED, [0, 0, 252, 252 / 2])
pygame.draw.rect(self.second, BLUE, [0, 0, 252, 252 / 2])
self.screen.fill(WHITE)
scheduler = Scheduler()
scheduler.add(0.01, 0, self.animate_sprite_movement)
scheduler.add(2, 0, self.handle_stage)
from time import sleep
sleep(15)
while run:
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
break
scheduler.run()
pygame.display.flip()
pygame.quit()
def animate_sprite_movement(self):
if self.scaling:
for i, animated_scale in enumerate(self.scaling_sprites):
try:
surface = animated_scale.update()
except StopIteration:
self.scaling = False
if i == len(self.scaling_sprites) - 1:
self.stage += 1
self.scaling_sprites = []
else:
self.surface = surface
if not i:
self.clean()
self.screen.blit(self.surface,
(0, self.surface.get_size()[1] * i))
elif self.moving:
if self.offset[1] < 252 / 2:
self.offset[1] += 1
else:
self.offset[0] -= 1
self.clean()
self.screen.blit(self.first, (0, 0))
self.screen.blit(self.second, self.offset)
if self.offset[0] == 0:
self.moving = False
self.stage = 0
def clean(self):
pygame.draw.rect(self.screen, WHITE, [0, 0, 504, 504])
def create_surfaces(self):
self.first = pygame.Surface((252, 252 / 2))
self.second = self.first.copy()
def handle_stage(self):
if self.stage == 0:
self.clean()
self.screen.blit(self.first, (0, 0))
self.screen.blit(self.second, (0, 252 / 2))
self.stage += 1
elif self.stage == 1 and not self.scaling:
self.scaling = True
for sprite in (self.first, self.second):
self.scaling_sprites.append(
AnimatedScale(sprite, (252 * 2, 252 / 4))
)
self.screen.blit(self.first, (0, 0))
self.screen.blit(self.second, (0, 252 / 4))
elif self.stage == 2 and not self.moving:
self.offset = [252, 0]
self.moving = True
self.create_surfaces()
self.first.blit(
self.screen, (0, 0), [0, 0, 252, 252 / 2])
self.second.blit(
self.screen, (0, 0), [252, 0, 252, 252 / 2])
if __name__ == "__main__":
Main()
Curso online 👨💻
¡Ya lanzamos el curso oficial de Recursos Python en Udemy!
Un curso moderno para aprender Python desde cero con programación orientada a objetos, SQL y tkinter en 2024.
Consultoría 💡
Ofrecemos servicios profesionales de desarrollo y capacitación en Python a personas y empresas. Consultanos por tu proyecto.