import tkinter as tk
import math
# --- Configuration ---
W, H = 800, 400
WHEEL_RADIUS = 30
SPOKES = 4
VEHICLE_SPEED = 3
ROTATION_SPEED = 5 # degrees per frame
MISSILE_SPEED = 8
class VehicleAnimation:
def __init__(self, root):
self.root = root
self.canvas = tk.Canvas(root, width=W, height=H, bg="skyblue")
self.canvas.pack()
# Initial position
self.x = 100
self.y = 250
self.angle = 0
self.missiles = []
# Draw wheels
self.left_wheel = self.canvas.create_oval(
self.x, self.y, self.x + WHEEL_RADIUS*2, self.y + WHEEL_RADIUS*2, fill="black"
)
self.right_wheel = self.canvas.create_oval(
self.x + 120, self.y, self.x + 120 + WHEEL_RADIUS*2, self.y + WHEEL_RADIUS*2, fill="black"
)
# Draw spokes
self.left_spokes = []
self.right_spokes = []
for _ in range(SPOKES):
self.left_spokes.append(self.canvas.create_line(0, 0, 0, 0, fill="white", width=2))
self.right_spokes.append(self.canvas.create_line(0, 0, 0, 0, fill="white", width=2))
# Draw vehicle body
self.body = self.canvas.create_rectangle(
self.x + 10, self.y - 40, self.x + 170, self.y, fill="saddlebrown"
)
# Add text
self.text = self.canvas.create_text(
self.x + 90, self.y - 20, text="hello", font=("Arial", 14), fill="white"
)
# Draw cannon
self.cannon = self.canvas.create_rectangle(
self.x + 150, self.y - 50, self.x + 170, self.y - 40, fill="gray"
)
# Bind space key for firing
self.root.bind("<space>", self.fire_missile)
# Start animation
self.animate()
def draw_spokes(self, wheel_center_x, wheel_center_y, spokes_list):
"""Draw rotating spokes for a wheel."""
for i in range(SPOKES):
angle_deg = self.angle + (360 / SPOKES) * i
angle_rad = math.radians(angle_deg)
x1 = wheel_center_x + math.cos(angle_rad) * WHEEL_RADIUS
y1 = wheel_center_y + math.sin(angle_rad) * WHEEL_RADIUS
x2 = wheel_center_x - math.cos(angle_rad) * WHEEL_RADIUS
y2 = wheel_center_y - math.sin(angle_rad) * WHEEL_RADIUS
self.canvas.coords(spokes_list[i], x1, y1, x2, y2)
def fire_missile(self, event=None):
"""Create a missile from the cannon."""
missile = self.canvas.create_rectangle(
self.x + 170, self.y - 45, self.x + 180, self.y - 40, fill="red"
)
self.missiles.append(missile)
def animate(self):
# Move vehicle
self.x += VEHICLE_SPEED
self.angle = (self.angle + ROTATION_SPEED) % 360
# Update wheel positions
self.canvas.coords(self.left_wheel,
self.x, self.y,
self.x + WHEEL_RADIUS*2, self.y + WHEEL_RADIUS*2)
self.canvas.coords(self.right_wheel,
self.x + 120, self.y,
self.x + 120 + WHEEL_RADIUS*2, self.y + WHEEL_RADIUS*2)
# Update spokes
self.draw_spokes(self.x + WHEEL_RADIUS, self.y + WHEEL_RADIUS, self.left_spokes)
self.draw_spokes(self.x + 120 + WHEEL_RADIUS, self.y + WHEEL_RADIUS, self.right_spokes)
# Update body, text, cannon
self.canvas.coords(self.body,
self.x + 10, self.y - 40,
self.x + 170, self.y)
self.canvas.coords(self.text,
self.x + 90, self.y - 20)
self.canvas.coords(self.cannon,
self.x + 150, self.y - 50,
self.x + 170, self.y - 40)
# Move missiles
for missile in list(self.missiles):
self.canvas.move(missile, MISSILE_SPEED, 0)
coords = self.canvas.coords(missile)
if coords[0] > W: # Remove if off-screen
self.canvas.delete(missile)
self.missiles.remove(missile)
# Loop animation
self.root.after(30, self.animate)
if __name__ == "__main__":
root = tk.Tk()
root.title("Vehicle Animation with Cannon")
app = VehicleAnimation(root)
root.mainloop()

Tidak ada komentar:
Posting Komentar