|
| 1 | +#!/usr/bin/env python3 |
| 2 | + |
| 3 | +# date:2020.01.21 |
| 4 | +# https://stackoverflow.com/questions/59805177/how-to-make-enemy-follow-player/ |
| 5 | + |
| 6 | +import tkinter as tk |
| 7 | +import random |
| 8 | + |
| 9 | +def follow(player_x, player_y, enemy_x, enemy_y, enemy_speed=5): |
| 10 | + diff_x = player_x - enemy_x |
| 11 | + diff_y = player_y - enemy_y |
| 12 | + |
| 13 | + distance = (diff_x**2 + diff_y**2)**0.5 # Pythagoras: a**2 + b**2 = c**2 |
| 14 | + |
| 15 | + if distance <= enemy_speed: |
| 16 | + return diff_x, diff_y |
| 17 | + |
| 18 | + normal_x = diff_x/distance |
| 19 | + normal_y = diff_y/distance |
| 20 | + |
| 21 | + enemy_move_x = enemy_speed * normal_x |
| 22 | + enemy_move_y = enemy_speed * normal_y |
| 23 | + |
| 24 | + return enemy_move_x, enemy_move_y |
| 25 | + |
| 26 | +def on_key_press(event): |
| 27 | + global player_move_x |
| 28 | + global player_move_y |
| 29 | + |
| 30 | + if event.char == 'w': |
| 31 | + player_move_y -= 5 |
| 32 | + if event.char == 's': |
| 33 | + player_move_y += 5 |
| 34 | + if event.char == 'a': |
| 35 | + player_move_x -= 5 |
| 36 | + if event.char == 'd': |
| 37 | + player_move_x += 5 |
| 38 | + |
| 39 | +def on_key_release(event): |
| 40 | + global player_move_x |
| 41 | + global player_move_y |
| 42 | + |
| 43 | + if event.char == 'w': |
| 44 | + player_move_y -= -5 |
| 45 | + if event.char == 's': |
| 46 | + player_move_y += -5 |
| 47 | + if event.char == 'a': |
| 48 | + player_move_x -= -5 |
| 49 | + if event.char == 'd': |
| 50 | + player_move_x += -5 |
| 51 | + |
| 52 | +def update_game(): |
| 53 | + global player_x |
| 54 | + global player_y |
| 55 | + global enemy_x |
| 56 | + global enemy_y |
| 57 | + |
| 58 | + player_x += player_move_x |
| 59 | + player_y += player_move_y |
| 60 | + canvas.move(player_id, player_move_x, player_move_y) |
| 61 | + |
| 62 | + enemy_move_x, enemy_move_y = follow(player_x, player_y, enemy_x, enemy_y, enemy_speed) |
| 63 | + enemy_x += enemy_move_x |
| 64 | + enemy_y += enemy_move_y |
| 65 | + canvas.move(enemy_id, enemy_move_x, enemy_move_y) |
| 66 | + |
| 67 | + root.after(100, update_game) |
| 68 | + |
| 69 | +# --- main --- |
| 70 | + |
| 71 | +player_x = 250 |
| 72 | +player_y = 250 |
| 73 | +player_move_x = 0 |
| 74 | +player_move_y = 0 |
| 75 | + |
| 76 | +enemy_x = random.randint(0, 500) |
| 77 | +enemy_y = random.randint(0, 500) |
| 78 | +enemy_speed = 5 |
| 79 | + |
| 80 | +root = tk.Tk() |
| 81 | + |
| 82 | +canvas = tk.Canvas(root, width=500, height=500, bg='gray') |
| 83 | +canvas.pack() |
| 84 | +root.bind('<KeyPress>', on_key_press) |
| 85 | +root.bind('<KeyRelease>', on_key_release) |
| 86 | + |
| 87 | +player_id = canvas.create_oval(player_x-5, player_y-5, player_x+5, player_y+5, fill='green') |
| 88 | +enemy_id = canvas.create_oval(enemy_x-5, enemy_y-5, enemy_x+5, enemy_y+5, fill='red') |
| 89 | + |
| 90 | +update_game() |
| 91 | + |
| 92 | +root.mainloop() |
0 commit comments