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