Rabu, 22 April 2026

Python - Animation Wheels WIth Text And Missile

 



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: