如何让敌人跟随玩家 [英] How to make enemy follow player

查看:25
本文介绍了如何让敌人跟随玩家的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我找到了有关 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 你必须计算 enemyplayer 之间的向量,并标准化这个向量(所以它的长度将为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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆