gpt4 book ai didi

python - 敌人跟随中间的玩家

转载 作者:太空宇宙 更新时间:2023-11-03 20:33:06 26 4
gpt4 key购买 nike

敌人在屏幕上方生成,并尝试在屏幕中间跟随玩家,但当它靠近玩家时,游戏会崩溃并出现错误,而不是游戏结束。

如何在敌人类 update() 方法中传递玩家坐标而不是 600,325,即窗口的高度、宽度。

我想让敌人跟随玩家,并在玩家外部的随机位置生成敌人,而不是仅从屏幕上方生成敌人,以及如何随着分数的增加而增加敌人。

我得到的错误是:

dirvect.normalize()
ValueError: Can't normalize Vector of length Zero

下面的代码是类敌人:

class Mob(pg.sprite.Sprite):
def __init__(self):
pg.sprite.Sprite.__init__(self)
self.image = pg.image.load('enemy.png').convert_alpha()
self.image = pg.transform.smoothscale(pg.image.load('enemy.png'), (33, 33))
self.image_orig = self.image.copy()
self.radius = int(29 * .80 / 2)
self.rect = self.image.get_rect()
self.rect.x = random.randrange(width - self.rect.width)
self.rect.y = random.randrange(-100, -40)
self.speed = 4
self.rot = 0
self.rot_speed = 5
self.last_update = pg.time.get_ticks()

def rotate(self):
now = pg.time.get_ticks()
if now - self.last_update > 50:
self.last_update = now
self.rot = (self.rot + self.rot_speed) % 360
new_image = pg.transform.rotozoom(self.image_orig, self.rot, 1)
old_center = self.rect.center
self.image = new_image
self.rect = self.image.get_rect()
self.rect.center = old_center

def update(self):
self.rotate()
dirvect = pg.math.Vector2(600 - self.rect.x,
325 - self.rect.y)
dirvect.normalize()
# Move along this normalized vector towards the player at current speed.
dirvect.scale_to_length(self.speed)
self.rect.move_ip(dirvect)
if self.rect.top > height + 10 or self.rect.left < -25 or self.rect.right > width + 20:
self.rect.x = random.randrange(width - self.rect.width)
self.rect.y = random.randrange(-100, -40)
self.speed = random.randrange(1, 4)

以下用于添加敌人:

    for i in range(5):
m = Mob()
all_sprites.add(m)
mobs.add(m)
score = 0

如果这对玩家类的代码有帮助:

class Rotator(pg.sprite.Sprite):
def __init__(self, screen_rect):
pg.sprite.Sprite.__init__(self)
self.screen_rect = screen_rect
self.master_image = pg.image.load('spaceship.png').convert_alpha()
self.master_image = pg.transform.smoothscale(pg.image.load('spaceship.png'), (33, 33))
self.radius = 12
self.image = self.master_image.copy()
self.rect = self.image.get_rect(center=[width / 2, height / 2])
self.delay = 10
self.timer = 0.0
self.angle = 0
self.distance = 0
self.angle_offset = 0

def get_angle(self):
mouse = pg.mouse.get_pos()
offset = (self.rect.centerx - mouse[0], self.rect.centery - mouse[1])
self.angle = math.degrees(math.atan2(*offset)) - self.angle_offset
old_center = self.rect.center
self.image = pg.transform.rotozoom(self.master_image, self.angle, 1)
self.rect = self.image.get_rect(center=old_center)
self.distance = math.sqrt((offset[0] * offset[0]) + (offset[1] * offset[1]))

def update(self):
self.get_angle()
self.display = 'angle:{:.2f} distance:{:.2f}'.format(self.angle, self.distance)
self.dx = 1
self.dy = 1
self.rect.clamp_ip(self.screen_rect)

def draw(self, surf):
surf.blit(self.image, self.rect)

def shoot(self, mousepos):
dx = mousepos[0] - self.rect.centerx
dy = mousepos[1] - self.rect.centery
if abs(dx) > 0 or abs(dy) > 0:
bullet = Bullet(self.rect.centerx, self.rect.centery, dx, dy)
all_sprites.add(bullet)
bullets.add(bullet)

最佳答案

这个错误的原因是,dirvect 的长度为零。注意, Unit vector 的长度为 1,单位向量的计算方法是向量除以长度。

在计算单位向量之前检查向量的长度。使用length_squared()得到平方Euclidean length向量的长度,这比通过 lenght() 获取长度要快,因为省略了昂贵的平方根运算:

if vectdirvect.length_squared() > 0:
vectdirvect = vectdirvect.normalize()

进一步注意,normalize()计算单位向量,但它并不将结果存储到“自身”,而是通过返回值返回结果。

<小时/>

当您使用 scale_to_length() 时,会发生类似的问题,因为 scale_to_length() 必须先计算单位向量,然后才能将向量缩放到给定长度:

if dirvect.length_squared() > 0:
dirvect.scale_to_length(self.speed)

关于python - 敌人跟随中间的玩家,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57355857/

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