如何让敌人跟随玩家 [英] How to make enemy follow player
问题描述
我找到了有关 pygame 的信息,但我无法在 tkinter 中解释它.
图标 - https://imgur.com/a/PQx9tpW
pastebin - https://pastebin.com/ykUzj9Pc
I found information about pygame, but i cant interpret this in tkinter.
icons - https://imgur.com/a/PQx9tpW
pastebin - https://pastebin.com/ykUzj9Pc
def key_pressed(event):
global e
if event.keysym == 'Up':
move_wrap(player, (0, -step))
if event.keysym == 'Down':
move_wrap(player, (0, step))
if event.keysym == 'Left':
move_wrap(player, (-step, 0))
if event.keysym == 'Right':
move_wrap(player, (step, 0))
check_move()
# for enemy in enemies:
# direction = enemy[1]() # вызвать функцию перемещения у "врага"
# move_wrap(enemy[0], direction) # произвести перемещение
# print(e)
for enemy in enemies:
direction = enemy[1]()
move_wrap(enemy[0], direction)
list_ = [(step, 0), (-step, 0), (0, step), (0, -step)]
predictions = []
for i in list_:
predictions.append([canvas.coords(enemy[0])[0] + i[0], canvas.coords(enemy[0])[1] + i[1]])
for i in predictions:
if i[0] - canvas.coords(player)[0] > i[1] - canvas.coords(player)[1]:
if predictions.index(i) == 1:
move_wrap(enemy[0], (step, 0))
elif predictions.index(i) == 2:
move_wrap(enemy[0], (-step, 0))
elif predictions.index(i) == 3:
move_wrap(enemy[0], (0, step))
elif predictions.index(i) == 4:
move_wrap(enemy[0], (0, -step))
predictions.clear()
我有一份敌人清单.在这个列表中,我有一个带有(敌人,random_move 函数)的元组.
I have a list with enemies. In this list i have tuple with (enemy, random_move function).
推荐答案
要跟随 player
你必须计算 enemy
和 player
之间的向量,并标准化这个向量(所以它的长度将为1),然后你可以将它乘以敌人的速度以获得它必须移动的距离
To follow player
you have to calculate vector between enemy
and player
, and normalize this vector (so its lenght will be 1), and then you can multiplciate it by enemy's speed to get what distance it has to move
player_x, player_y = 0, 0
enemy_x, enemy_y = 100, 100
diff_x = player_x - enemy_x
diff_y = player_y - enemy_y
distance = (diff_x**2 + diff_y**2)**0.5 # Pythagoras: a**2 + b**2 = c**2
normal_x = diff_x/distance
normal_y = diff_y/distance
print(normal_x, normal_y)
enemy_speed = 5
enemy_move_x = enemy_speed * normal_x
enemy_move_y = enemy_speed * normal_y
print(enemy_move_x, enemy_move_y)
您可能还需要检查 distance
是否不为零,因为您可能会收到 ZeroDivisionError: 除以零
You may have to also check if distance
is not zero because you may get ZeroDivisionError: division by zero
最小工作示例 - 使用 WASD
键移动绿色圆圈,红色圆圈将跟随.
Minimal working example - use keys WASD
to move green circle and red circle will follow.
import tkinter as tk
import random
def follow(player_x, player_y, enemy_x, enemy_y, enemy_speed=5):
diff_x = player_x - enemy_x
diff_y = player_y - enemy_y
distance = (diff_x**2 + diff_y**2)**0.5 # Pythagoras: a**2 + b**2 = c**2
if distance <= enemy_speed:
return diff_x, diff_y
normal_x = diff_x/distance
normal_y = diff_y/distance
enemy_move_x = enemy_speed * normal_x
enemy_move_y = enemy_speed * normal_y
return enemy_move_x, enemy_move_y
def on_key_press(event):
global player_move_x
global player_move_y
if event.char == 'w':
player_move_y -= 5
if event.char == 's':
player_move_y += 5
if event.char == 'a':
player_move_x -= 5
if event.char == 'd':
player_move_x += 5
def on_key_release(event):
global player_move_x
global player_move_y
if event.char == 'w':
player_move_y -= -5
if event.char == 's':
player_move_y += -5
if event.char == 'a':
player_move_x -= -5
if event.char == 'd':
player_move_x += -5
def update_game():
global player_x
global player_y
global enemy_x
global enemy_y
player_x += player_move_x
player_y += player_move_y
canvas.move(player_id, player_move_x, player_move_y)
enemy_move_x, enemy_move_y = follow(player_x, player_y, enemy_x, enemy_y, enemy_speed)
enemy_x += enemy_move_x
enemy_y += enemy_move_y
canvas.move(enemy_id, enemy_move_x, enemy_move_y)
root.after(100, update_game)
# --- main ---
player_x = 250
player_y = 250
player_move_x = 0
player_move_y = 0
enemy_x = random.randint(0, 500)
enemy_y = random.randint(0, 500)
enemy_speed = 5
root = tk.Tk()
canvas = tk.Canvas(root, width=500, height=500, bg='gray')
canvas.pack()
root.bind('<KeyPress>', on_key_press)
root.bind('<KeyRelease>', on_key_release)
player_id = canvas.create_oval(player_x-5, player_y-5, player_x+5, player_y+5, fill='green')
enemy_id = canvas.create_oval(enemy_x-5, enemy_y-5, enemy_x+5, enemy_y+5, fill='red')
update_game()
root.mainloop()
这篇关于如何让敌人跟随玩家的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!