import tkinter as tk
import math
import random
import time
# Game constants
WIDTH, HEIGHT = 800, 600
DRONE_SPEED = 5
TORPEDO_SPEED = 8
ENEMY_TORPEDO_SPEED = 4
ENEMY_COUNT = 5
ENEMY_FIRE_INTERVAL = 3000 # milliseconds
class Game:
def __init__(self, root):
self.root = root
self.root.title("Undersea Drone Animation")
self.canvas = tk.Canvas(root, width=WIDTH, height=HEIGHT, bg="deep sky blue")
self.canvas.pack()
# Player drone position
self.drone_x, self.drone_y = WIDTH // 2, HEIGHT // 2
self.drone_angle = 0
# Lists for torpedoes and enemies
self.torpedoes = []
self.enemy_torpedoes = []
self.enemies = []
self.enemy_angles = []
# Create enemies
for _ in range(ENEMY_COUNT):
ex = random.randint(50, WIDTH - 50)
ey = random.randint(50, HEIGHT - 50)
self.enemies.append([ex, ey])
self.enemy_angles.append(0)
# Key bindings
self.keys = set()
self.root.bind("<KeyPress>", self.key_press)
self.root.bind("<KeyRelease>", self.key_release)
# Start enemy firing loop
self.root.after(ENEMY_FIRE_INTERVAL, self.enemy_fire)
# Start animation
self.animate()
def key_press(self, event):
self.keys.add(event.keysym)
if event.keysym == "space":
self.fire_torpedo()
def key_release(self, event):
self.keys.discard(event.keysym)
def fire_torpedo(self):
self.torpedoes.append([self.drone_x, self.drone_y, self.drone_angle])
def enemy_fire(self):
for ex, ey in self.enemies:
if ex != -9999: # alive enemy
angle = math.atan2(self.drone_y - ey, self.drone_x - ex)
self.enemy_torpedoes.append([ex, ey, angle])
self.root.after(ENEMY_FIRE_INTERVAL, self.enemy_fire)
def draw_propeller(self, x, y, angle, size=15):
for i in range(4):
a = math.radians(angle + i * 90)
x1 = x + size * math.cos(a)
y1 = y + size * math.sin(a)
self.canvas.create_line(x, y, x1, y1, fill="black", width=2)
def move_objects(self):
# Player movement
if "w" in self.keys:
self.drone_y -= DRONE_SPEED
if "s" in self.keys:
self.drone_y += DRONE_SPEED
if "a" in self.keys:
self.drone_x -= DRONE_SPEED
if "d" in self.keys:
self.drone_x += DRONE_SPEED
# Keep inside bounds
self.drone_x = max(20, min(WIDTH - 20, self.drone_x))
self.drone_y = max(20, min(HEIGHT - 20, self.drone_y))
# Move player torpedoes
for t in self.torpedoes:
t[0] += TORPEDO_SPEED * math.cos(math.radians(t[2]))
t[1] += TORPEDO_SPEED * math.sin(math.radians(t[2]))
# Move enemy torpedoes
for et in self.enemy_torpedoes:
et[0] += ENEMY_TORPEDO_SPEED * math.cos(et[2])
et[1] += ENEMY_TORPEDO_SPEED * math.sin(et[2])
def check_collisions(self):
# Player torpedo hits enemy
for t in self.torpedoes:
for i, (ex, ey) in enumerate(self.enemies):
if ex != -9999 and math.hypot(t[0] - ex, t[1] - ey) < 20:
self.enemies[i] = [-9999, -9999] # remove enemy
t[0] = -9999 # remove torpedo
def animate(self):
self.canvas.delete("all")
# Update angles
self.drone_angle = (self.drone_angle + 10) % 360
for i in range(len(self.enemy_angles)):
self.enemy_angles[i] = (self.enemy_angles[i] + 10) % 360
# Move objects
self.move_objects()
# Check collisions
self.check_collisions()
# Draw player drone
self.canvas.create_oval(self.drone_x - 20, self.drone_y - 10,
self.drone_x + 20, self.drone_y + 10,
fill="gray")
self.draw_propeller(self.drone_x + 25, self.drone_y, self.drone_angle)
# Draw enemies
for (ex, ey), angle in zip(self.enemies, self.enemy_angles):
if ex != -9999:
self.canvas.create_oval(ex - 20, ey - 10, ex + 20, ey + 10, fill="red")
self.draw_propeller(ex - 25, ey, angle)
# Draw torpedoes
for t in self.torpedoes:
self.canvas.create_oval(t[0] - 3, t[1] - 3, t[0] + 3, t[1] + 3, fill="yellow")
for et in self.enemy_torpedoes:
self.canvas.create_oval(et[0] - 3, et[1] - 3, et[0] + 3, et[1] + 3, fill="orange")
# Remove off-screen torpedoes
self.torpedoes = [t for t in self.torpedoes if 0 < t[0] < WIDTH and 0 < t[1] < HEIGHT]
self.enemy_torpedoes = [et for et in self.enemy_torpedoes if 0 < et[0] < WIDTH and 0 < et[1] < HEIGHT]
# Loop animation
self.root.after(50, self.animate)
if __name__ == "__main__":
root = tk.Tk()
Game(root)
root.mainloop()

Tidak ada komentar:
Posting Komentar