Criando uma Animação Interativa com Linguagem de Programação (Python): Explosão de Estrelas



O Python é uma linguagem versátil, permitindo desde processamento de dados até animações interativas. Neste post, vamos explorar um código que utiliza a biblioteca Tkinter para criar uma divertida explosão de estrelas no clique de um botão. O código se baseia na criação de múltiplas estrelas, que se espalham pelo espaço de um canvas, proporcionando uma experiência visual única e dinâmica.

Introdução ao Tkinter e ao Canvas

Tkinter é uma biblioteca padrão do Python para construção de interfaces gráficas (GUI). Aqui, a classe StarExplosion é responsável pela configuração da interface e pela criação do efeito da explosão. Utilizamos o Canvas, um elemento gráfico que permite o desenho de formas, imagens e animações em uma janela Tkinter. A interface possui um botão que, ao ser pressionado, inicia a explosão de estrelas.

Construindo Estrelas e Configurando a Explosão

Dentro da classe StarExplosion, o método create_star cria as estrelas como pequenos círculos coloridos. Para cada estrela, definimos uma posição central e um raio, além de escolher uma cor aleatória para garantir uma estética vibrante e dinâmica. A função explode gera 50 estrelas no centro do canvas e chama o método animate para iniciar a animação.

def create_star(self, x, y, r, color):
    star = self.canvas.create_oval(x-r, y-r, x+r, y+r, fill=color, outline=color)
    return {'id': star, 'x': x, 'y': y, 'r': r, 'vx': random.uniform(-2, 2), 'vy': random.uniform(-2, 2), 'color': color}
        

Animação das Estrelas com Movimentação Aleatória

Para a animação, o método animate move cada estrela com uma velocidade aleatória (vx, vy) em diferentes direções. Quando uma estrela atinge a borda do canvas, ela é reposicionada no centro, mantendo o efeito visual por mais tempo. Isso permite um ciclo contínuo de movimento até que o botão seja pressionado novamente, criando uma nova explosão.

def animate(self):
    for star in self.stars:
        self.canvas.move(star['id'], star['vx'], star['vy'])
        star['x'] += star['vx']
        star['y'] += star['vy']
        if star['x'] < 0 or star['x'] > 400 or star['y'] < 0 or star['y'] > 400:
            self.canvas.delete(star['id'])
            new_star = self.create_star(200, 200, 2, star['color'])
            self.stars[self.stars.index(star)] = new_star
    if self.stars:
        self.root.after(10, self.animate)
        

Iniciando a Interface Gráfica

Para rodar o código, basta chamar a função Tk() para iniciar a interface e mainloop() para manter o loop da interface gráfica, onde os eventos de animação são atualizados a cada 10 milissegundos. Este projeto é ideal para quem quer explorar as possibilidades de criação de animações e interações dinâmicas com Python.

Código Completo

import tkinter as tk
from tkinter import Canvas
import random
import math

class StarExplosion:
    def __init__(self, root):
        self.root = root
        self.root.title("Explosão de Estrelas")
        self.canvas = Canvas(root, width=400, height=400, bg='black')
        self.canvas.pack()
        
        self.button = tk.Button(root, text="Explodir!", command=self.explode)
        self.button.pack()

        self.stars = []

    def create_star(self, x, y, r, color):
        star = self.canvas.create_oval(x-r, y-r, x+r, y+r, fill=color, outline=color)
        return {'id': star, 'x': x, 'y': y, 'r': r, 'vx': random.uniform(-2, 2), 'vy': random.uniform(-2, 2), 'color': color}

    def explode(self):
        self.canvas.delete("all")  # Limpa o canvas para uma nova explosão
        x, y = 200, 200  # Centro do canvas
        for _ in range(50):  # Número de estrelas
            color = f'#{random.randint(0, 0xFFFFFF):06x}'  # Cor aleatória
            self.stars.append(self.create_star(x, y, 2, color))
        self.animate()

    def animate(self):
        for star in self.stars:
            self.canvas.move(star['id'], star['vx'], star['vy'])
            star['x'] += star['vx']
            star['y'] += star['vy']
            
            # Se a estrela sair do canvas, reposiciona no centro
            if star['x'] < 0 or star['x'] > 400 or star['y'] < 0 or star['y'] > 400:
                self.canvas.delete(star['id'])
                new_star = self.create_star(200, 200, 2, star['color'])
                self.stars[self.stars.index(star)] = new_star
        
        if self.stars:  # Continua a animação se ainda houver estrelas
            self.root.after(10, self.animate)

if __name__ == "__main__":
    root = tk.Tk()
    app = StarExplosion(root)
    root.mainloop()
        

Postar um comentário

0 Comentários