如何解决pygame 敌人向玩家的二维运动,如何计算 x 和 y 速度?
在我目前正在制作的游戏中,我需要让敌人向玩家移动(这里的敌人是一个 blob)才能做到这一点,我已经创建了一个函数:def calculate_enemy_movement(enemy):
并在里面放了什么该功能需要做:
计算每帧需要添加什么x值(x速度),以及每帧需要添加什么y值(y速度)到enemy.x
和enemy.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
最小示例:
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 举报,一经查实,本站将立刻删除。