簡體   English   中英

如何讓敵人跟隨玩家

[英]How to make enemy follow player

我找到了有關 pygame 的信息,但我無法在 tkinter 中解釋它。
圖標 - 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()

我有一個敵人的清單。 在這個列表中,我有 (enemy, random_move 函數) 的元組。

要跟隨player您必須計算enemyplayer之間的向量,並將此向量歸一化(因此其長度將為 1),然后您可以將其乘以敵人的速度以獲得它必須移動的距離

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: division by zero


編輯:最小工作示例 - 使用鍵WASD移動綠色圓圈,紅色圓圈將跟隨。

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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM