微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

pygame 敌人向玩家的二维运动,如何计算 x 和 y 速度?

如何解决pygame 敌人向玩家的二维运动,如何计算 x 和 y 速度?

在我目前正在制作的游戏中,我需要让敌人向玩家移动(这里的敌人是一个 blob)才能做到这一点,我已经创建了一个函数def calculate_enemy_movement(enemy): 并在里面放了什么该功能要做

计算每帧需要添加什么x值(x速度),以及每帧需要添加什么y值(y速度)到enemy.xenemy.y走向{ {1}} 和 player.x 然后返回 x 速度和 y 速度。
此处调用函数:将 x 速度和 y 速度添加到每帧敌人的 x 和 y 位置 player.y

现在我只需要有人帮我创建这个函数。我已经研究过它,我知道它与向量数学有关,但我不确定它究竟是如何工作的,所以如果有人可以编写函数并解释它是如何工作的,我会非常高兴。

如果您需要其余的代码

enemy_blob.x,enemy_blob.y += calculate_enemy_movement(enemy_blob)

解决方法

计算从敌人位置到玩家位置的向量:

dx = player_x - enemy_x
dy = player_y - enemy_y

计算向量的长度(Euclidean distance):

dist = math.sqrt(dx*dx + dy*dy)

dist = math.hypot(dx,dy)

对向量进行归一化 (Unit vector)。归一化向量的长度为 1:

if dist > 0:
    dx /= dist
    dy /= dist

将敌人沿矢量方向移动一定距离。确保移动距离不大于敌人到玩家的剩余距离:

move_dist = min(enemy_vel,dist)

enemy_x += move_dist * dx
enemy_y += move_dist * dy 

有关更复杂的解决方案,请参阅 How to make smooth movement in pygame

另见Follow target or mouse


最小示例:

import pygame,math

pygame.init()
window = pygame.display.set_mode((400,400))
clock = pygame.time.Clock()
player_x,player_y,player_vel = 100,100,5
enemy_x,enemy_y,enemy_vel = 300,300,3

run = True
while run:
    clock.tick(60)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False          
        
    keys = pygame.key.get_pressed()
    player_x = max(10,min(390,player_x + player_vel * (keys[pygame.K_d] - keys[pygame.K_a])))
    player_y = max(10,player_y + player_vel * (keys[pygame.K_s] - keys[pygame.K_w])))

    dx = player_x - enemy_x
    dy = player_y - enemy_y
    dist = math.hypot(dx,dy)
    if dist > 0:
        enemy_x += min(enemy_vel,dist) * dx / dist
        enemy_y += min(enemy_vel,dist) * dy / dist

    window.fill(0)
    pygame.draw.circle(window,(0,128,255),(player_x,player_y),10)
    pygame.draw.circle(window,(255,32,32),(enemy_x,enemy_y),10)
    pygame.display.flip()

pygame.quit()
exit()

对于您的特定代码,calculate_enemy_movement 函数可能如下所示:

def calculate_enemy_movement(enemy_blob):
    dx = player.player_rect.x - enemy_blob.x
    dy = player.player_rect.y - enemy_blob.y
    dist = math.hypot(dx,dy)
    if dist > 0:
        move_x = min(enemy_blob.speed,dist) * dx / dist
        move_y = min(enemy_blob.speed,dist) * dy / dist
        return move_x,move_y
    return 0,0
move_x,move_y = calculate_enemy_movement(enemy_blob)
enemy_blob.x += move_x
enemy_blob.y += move_y

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。