Minggu, 12 April 2026

Python Animation - Drone 8

 




import tkinter as tk

import math


class QuadcopterApp:

    def __init__(self, root):

        self.root = root

        self.root.title("Quadcopter Animation")


        # Canvas setup

        self.canvas = tk.Canvas(root, width=800, height=600, bg="skyblue")

        self.canvas.pack()


        # Start button

        self.start_btn = tk.Button(root, text="Start Quadcopter", command=self.start_animation)

        self.start_btn.pack(pady=10)


        # Quadcopter state

        self.x, self.y = 400, 300  # center position

        self.size = 60             # body size

        self.propeller_length = 20

        self.angle = 0             # propeller rotation angle

        self.speed_x = 0

        self.speed_y = 0

        self.running = False


        # Keyboard bindings

        self.root.bind("<KeyPress>", self.on_key_press)

        self.root.bind("<KeyRelease>", self.on_key_release)


    def start_animation(self):

        """Start the quadcopter animation loop."""

        if not self.running:

            self.running = True

            self.animate()


    def on_key_press(self, event):

        """Handle movement keys."""

        if event.keysym.lower() == 'w':

            self.speed_y = -3

        elif event.keysym.lower() == 's':

            self.speed_y = 3

        elif event.keysym.lower() == 'a':

            self.speed_x = -3

        elif event.keysym.lower() == 'd':

            self.speed_x = 3


    def on_key_release(self, event):

        """Stop movement when key is released."""

        if event.keysym.lower() in ('w', 's'):

            self.speed_y = 0

        elif event.keysym.lower() in ('a', 'd'):

            self.speed_x = 0


    def draw_quadcopter(self):

        """Draw the quadcopter with rotating propellers."""

        self.canvas.delete("all")


        # Draw body

        half = self.size / 2

        self.canvas.create_rectangle(

            self.x - half, self.y - half,

            self.x + half, self.y + half,

            fill="yellow", outline="black", width=2

        )


        # Propeller positions (relative to body center)

        offsets = [

            (-half, -half),  # top-left

            (half, -half),   # top-right

            (-half, half),   # bottom-left

            (half, half)     # bottom-right

        ]


        for ox, oy in offsets:

            cx = self.x + ox

            cy = self.y + oy

            self.draw_rotating_propeller(cx, cy)


    def draw_rotating_propeller(self, cx, cy):

        """Draw a single rotating propeller."""

        angle_rad = math.radians(self.angle)

        dx = self.propeller_length * math.cos(angle_rad)

        dy = self.propeller_length * math.sin(angle_rad)


        # First blade

        self.canvas.create_line(cx - dx, cy - dy, cx + dx, cy + dy, fill="black", width=3)

        # Second blade (90 degrees rotated)

        dx2 = self.propeller_length * math.cos(angle_rad + math.pi / 2)

        dy2 = self.propeller_length * math.sin(angle_rad + math.pi / 2)

        self.canvas.create_line(cx - dx2, cy - dy2, cx + dx2, cy + dy2, fill="black", width=3)


    def animate(self):

        """Main animation loop."""

        if not self.running:

            return


        # Update position

        self.x += self.speed_x

        self.y += self.speed_y


        # Keep inside canvas bounds

        self.x = max(self.size / 2, min(800 - self.size / 2, self.x))

        self.y = max(self.size / 2, min(600 - self.size / 2, self.y))


        # Rotate propellers

        self.angle = (self.angle + 20) % 360


        # Draw quadcopter

        self.draw_quadcopter()


        # Schedule next frame

        self.root.after(50, self.animate)



if __name__ == "__main__":

    root = tk.Tk()

    app = QuadcopterApp(root)

    root.mainloop()

Tidak ada komentar: