Senin, 13 April 2026

Python Animation - Drone 13

 



import tkinter as tk
import math

class DroneAnimation:
    def __init__(self, root):
        self.root = root
        self.canvas = tk.Canvas(root, width=600, height=500, bg='white')
        self.canvas.pack()

        # Drone properties
        self.x, self.y = 300, 250
        self.speed = 10
        self.angle = 0
        self.prop_radius = 20
        self.drone_size = 40

        # Draw Drone Elements
        self.body = self.canvas.create_oval(self.x-self.drone_size, self.y-self.drone_size,
                                             self.x+self.drone_size, self.y+self.drone_size, fill='gray')
        
        # Propeller positions (4 corners)
        self.props = []
        prop_offsets = [(-30, -30), (30, -30), (-30, 30), (30, 30)]
        for dx, dy in prop_offsets:
            p_center = (self.x + dx, self.y + dy)
            circle = self.canvas.create_oval(p_center[0]-self.prop_radius, p_center[1]-self.prop_radius,
                                              p_center[0]+self.prop_radius, p_center[1]+self.prop_radius, outline='blue', width=2)
            
            # 4 spokes
            spokes = [self.canvas.create_line(p_center[0], p_center[1], p_center[0], p_center[1], fill='blue') for _ in range(4)]
            self.props.append({'circle': circle, 'spokes': spokes, 'center': (dx, dy)})

        # Key Bindings
        self.root.bind("<KeyPress>", self.move)
        
        # Start Animation
        self.animate()

    def animate(self):
        self.angle += 15
        
        # Update Propellers
        for prop in self.props:
            dx, dy = prop['center']
            px, py = self.x + dx, self.y + dy
            
            # Rotate spokes
            for i, spoke in enumerate(prop['spokes']):
                spoke_angle = self.angle + (i * 90)
                end_x = px + self.prop_radius * math.cos(math.radians(spoke_angle))
                end_y = py + self.prop_radius * math.sin(math.radians(spoke_angle))
                self.canvas.coords(spoke, px, py, end_x, end_y)
            
            # Move propeller circles
            self.canvas.coords(prop['circle'], px-self.prop_radius, py-self.prop_radius,
                                px+self.prop_radius, py+self.prop_radius)
        
        # Move body
        self.canvas.coords(self.body, self.x-self.drone_size, self.y-self.drone_size,
                           self.x+self.drone_size, self.y+self.drone_size)
        
        self.root.after(50, self.animate)

    def move(self, event):
        if event.keysym == 'w': self.y -= self.speed
        elif event.keysym == 's': self.y += self.speed
        elif event.keysym == 'a': self.x -= self.speed
        elif event.keysym == 'd': self.x += self.speed

if __name__ == "__main__":
    root = tk.Tk()
    root.title("2D Drone Animation")
    app = DroneAnimation(root)
    root.mainloop()


Tidak ada komentar: