gpt4 book ai didi

python - Pygame 三角函数 : Following the hypotenuse?

转载 作者:行者123 更新时间:2023-11-28 20:37:45 25 4
gpt4 key购买 nike

我的 Enemy 类中有一个名为 huntPlayer 的方法。它需要一个播放器对象 p。在这里:

def huntPlayer(self, p):   
if self.dist2p < 200:
self.hunting = True
if p.x > self.rect.x:
self.rect.x += self.speed #this is a constant at value 1
elif p.x < self.rect.x:
self.rect.x -= self.speed
else:
self.rect.x += 0
if p.y > self.rect.y:
self.rect.y += self.speed
elif p.y < self.rect.y:
self.rect.y -= self.speed
else:
self.rect.y += 0
else:
self.rect.x += 0
self.rect.y += 0

敌人随机放置在一个 2d 自上而下的平原周围,他们随机在这个平原上漫游。我计算了到玩家的最短距离的斜边 = Enemy.dist2p -- 当 dist2p 值 < 200 时,敌人将向玩家移动,p.x p.y 分别。

我上面的解决方案很粗糙,所以我的问题是敌人在 x 或 y 轴上平均移动 1 个位置,导致每个轴的对角线移动,然后沿着轴滑动直到它到达玩家。 (播放器位于中心屏幕附近的固定位置。)

你能帮我修复 huntPlayer 方法/算法,让敌人沿着斜边路径到达玩家,而不是到 x/y 轴的最快路径吗?

编辑:如果您需要我可能遗漏的任何进一步信息,请告诉我。

最佳答案

在斜边上移动很可能需要您的对象在 y 轴或 x 轴上每帧移动少于一个像素,并且由于 rects 只能容纳整数,因此您需要一个新的属性 position 包含浮点精度的 Sprite 位置。您可以使用 pygame.math.Vector2 通过有用的方法创建一个向量,例如 normalize() 以及与其他向量相加、相减、相乘等。

假设你已经创建了一个属性 self.position = pygame.math.Vector2(0, 0)(或者你希望它开始的任何位置)你可以这样做:

def hunt_player(self, player):
player_position = pygame.math.Vector2(player.rect.topleft)
direction = player_position - self.position
velocity = direction.normalize() * self.speed

self.position += velocity
self.rect.topleft = self.position

通过用敌人的位置减去玩家的位置,您将得到一个从敌人指向玩家的向量。如果我们将方向向量添加到我们的位置,我们将立即传送到玩家。相反,我们将向量归一化(使其长度为 1 个像素)并乘以我们的速度属性。新创建的矢量将是一个指向玩家的矢量,其长度为我们的速度。

完整示例

import pygame
pygame.init()


SIZE = WIDTH, HEIGHT = 720, 480
FPS = 60
BACKGROUND_COLOR = pygame.Color('white')

screen = pygame.display.set_mode(SIZE)
clock = pygame.time.Clock()


class Hunter(pygame.sprite.Sprite):

def __init__(self, position):
super(Hunter, self).__init__()

self.image = pygame.Surface((32, 32))
self.image.fill(pygame.Color('red'))
self.rect = self.image.get_rect(topleft=position)
self.position = pygame.math.Vector2(position)
self.speed = 2

def hunt_player(self, player):
player_position = player.rect.topleft
direction = player_position - self.position
velocity = direction.normalize() * self.speed

self.position += velocity
self.rect.topleft = self.position

def update(self, player):
self.hunt_player(player)


class Player(pygame.sprite.Sprite):

def __init__(self, position):
super(Player, self).__init__()

self.image = pygame.Surface((32, 32))
self.image.fill(pygame.Color('blue'))
self.rect = self.image.get_rect(topleft=position)

self.position = pygame.math.Vector2(position)
self.velocity = pygame.math.Vector2(0, 0)
self.speed = 3

def update(self):
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
self.velocity.x = -self.speed
elif keys[pygame.K_RIGHT]:
self.velocity.x = self.speed
else:
self.velocity.x = 0

if keys[pygame.K_UP]:
self.velocity.y = -self.speed
elif keys[pygame.K_DOWN]:
self.velocity.y = self.speed
else:
self.velocity.y = 0

self.position += self.velocity
self.rect.topleft = self.position

player = Player(position=(350, 220))
monster = Hunter(position=(680, 400))
running = True
while running:

clock.tick(FPS)

for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False

player.update()
monster.update(player)

screen.fill(BACKGROUND_COLOR)
screen.blit(player.image, player.rect)
screen.blit(monster.image, monster.rect)

pygame.display.update()

结果

enter image description here

关于python - Pygame 三角函数 : Following the hypotenuse?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42093038/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com