Senin, 13 April 2026

Python Animation - Drone 12

 



import tkinter as tk
import math

class DroneAnimation:
    def __init__(self, root):
        self.root = root
        self.root.title("2D Drone Animation with Rotating Propellers")

        # Canvas setup
        self.canvas_width = 600
        self.canvas_height = 400
        self.canvas = tk.Canvas(root, width=self.canvas_width, height=self.canvas_height, bg="skyblue")
        self.canvas.pack()

        # Drone parameters
        self.drone_center = [300, 200]
        self.body_width = 120
        self.body_height = 40
        self.propeller_radius = 20
        self.spokes = 4
        self.angle = 0  # rotation angle for propellers
        self.fly_dx = 2  # horizontal movement speed
        self.fly_dy = 1  # vertical movement speed

        # Draw drone body
        self.body = self.canvas.create_rectangle(
            self.drone_center[0] - self.body_width // 2,
            self.drone_center[1] - self.body_height // 2,
            self.drone_center[0] + self.body_width // 2,
            self.drone_center[1] + self.body_height // 2,
            fill="gray", outline="black"
        )

        # Propeller positions (relative to body)
        self.propeller_offsets = [
            (-self.body_width // 2, -self.body_height // 2),  # top-left
            (self.body_width // 2, -self.body_height // 2),   # top-right
            (-self.body_width // 2, self.body_height // 2),   # bottom-left
            (self.body_width // 2, self.body_height // 2)     # bottom-right
        ]

        # Store propeller parts
        self.propeller_circles = []
        self.propeller_spokes = []

        for offset in self.propeller_offsets:
            cx = self.drone_center[0] + offset[0]
            cy = self.drone_center[1] + offset[1]
            circle = self.canvas.create_oval(
                cx - self.propeller_radius, cy - self.propeller_radius,
                cx + self.propeller_radius, cy + self.propeller_radius,
                outline="black", width=2
            )
            self.propeller_circles.append(circle)

            spokes_list = []
            for _ in range(self.spokes):
                spoke = self.canvas.create_line(cx, cy, cx, cy, fill="black", width=2)
                spokes_list.append(spoke)
            self.propeller_spokes.append(spokes_list)

        self.animate()

    def animate(self):
        # Move drone
        self.drone_center[0] += self.fly_dx
        self.drone_center[1] += self.fly_dy

        # Bounce off walls
        if self.drone_center[0] < 100 or self.drone_center[0] > self.canvas_width - 100:
            self.fly_dx *= -1
        if self.drone_center[1] < 60 or self.drone_center[1] > self.canvas_height - 60:
            self.fly_dy *= -1

        # Move body
        self.canvas.coords(
            self.body,
            self.drone_center[0] - self.body_width // 2,
            self.drone_center[1] - self.body_height // 2,
            self.drone_center[0] + self.body_width // 2,
            self.drone_center[1] + self.body_height // 2
        )

        # Rotate propellers
        self.angle += 15  # rotation speed
        for i, offset in enumerate(self.propeller_offsets):
            cx = self.drone_center[0] + offset[0]
            cy = self.drone_center[1] + offset[1]

            # Update circle position
            self.canvas.coords(
                self.propeller_circles[i],
                cx - self.propeller_radius, cy - self.propeller_radius,
                cx + self.propeller_radius, cy + self.propeller_radius
            )

            # Update spokes
            for j, spoke in enumerate(self.propeller_spokes[i]):
                spoke_angle = math.radians(self.angle + (360 / self.spokes) * j)
                x_end = cx + self.propeller_radius * math.cos(spoke_angle)
                y_end = cy + self.propeller_radius * math.sin(spoke_angle)
                self.canvas.coords(spoke, cx, cy, x_end, y_end)

        # Schedule next frame
        self.root.after(50, self.animate)

# Run the animation
if __name__ == "__main__":
    root = tk.Tk()
    app = DroneAnimation(root)
    root.mainloop()


Tidak ada komentar: