Minggu, 12 April 2026

Python Animation - Drone 5

 




import tkinter as tk

import math


class QuadcopterAnimation:

    def __init__(self, root):

        self.root = root

        self.root.title("2D Quadcopter Control")

        

        # Setup Canvas

        self.canvas = tk.Canvas(root, width=800, height=600, bg='white')

        self.canvas.pack()

        

        # Start Button

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

        self.start_btn.pack()

        

        # Initial Drone Position

        self.x, self.y = 400, 300

        self.speed = 10

        self.drone_items = []

        self.propeller_angle = 0

        self.running = False

        

        # Keyboard Binding

        self.root.bind("<w>", self.move_up)

        self.root.bind("<s>", self.move_down)

        self.root.bind("<a>", self.move_left)

        self.root.bind("<d>", self.move_right)


    def draw_quadcopter(self):

        self.canvas.delete("drone")

        self.drone_items = []

        

        # Body

        body = self.canvas.create_rectangle(self.x-40, self.y-10, self.x+40, self.y+10, fill='blue', tags="drone")

        

        # Props

        prop_coords = [

            (self.x-40, self.y-20), (self.x+40, self.y-20),

            (self.x-40, self.y+20), (self.x+40, self.y+20)

        ]

        

        for px, py in prop_coords:

            # Propeller rotation math

            self.propeller_angle += 20

            r = 15

            x1 = px + r * math.cos(math.radians(self.propeller_angle))

            y1 = py + r * math.sin(math.radians(self.propeller_angle))

            x2 = px + r * math.cos(math.radians(self.propeller_angle + 180))

            y2 = py + r * math.sin(math.radians(self.propeller_angle + 180))

            self.canvas.create_line(x1, y1, x2, y2, width=3, fill='black', tags="drone")

            self.canvas.create_oval(px-5, py-5, px+5, py+5, fill='grey', tags="drone")


    def animate(self):

        if self.running:

            self.draw_quadcopter()

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


    def start_animation(self):

        if not self.running:

            self.running = True

            self.animate()

        else:

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


    # Movement Functions

    def move_up(self, event): self.y -= self.speed

    def move_down(self, event): self.y += self.speed

    def move_left(self, event): self.x -= self.speed

    def move_right(self, event): self.x += self.speed


if __name__ == "__main__":

    root = tk.Tk()

    app = QuadcopterAnimation(root)

    root.mainloop()

Tidak ada komentar: