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:
Posting Komentar