敌人跟随中间的玩家

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


如何在敌人类 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


ibeautiful
浏览 101回答 1
1回答

交互式爱情

这个错误是原因,因为长度dirvect为零。注意,单位向量的长度为1,单位向量的计算方法是将向量除以其长度。在计算单位向量之前检查向量的长度。用于length_squared()获取向量的平方欧几里得长度,这比通过 获取长度更快lenght(),因为省略了昂贵的平方根运算:if&nbsp;vectdirvect.length_squared()&nbsp;>&nbsp;0: &nbsp;&nbsp;&nbsp;&nbsp;vectdirvect&nbsp;=&nbsp;vectdirvect.normalize()进一步注意,它normalize()计算单位向量,但它不将结果存储到“自身”,它通过返回值返回结果。使用 时会发生类似的问题scale_to_length(),因为scale_to_length()必须先计算单位向量,然后才能将向量缩放到给定长度:if&nbsp;dirvect.length_squared()&nbsp;>&nbsp;0: &nbsp;&nbsp;&nbsp;&nbsp;dirvect.scale_to_length(self.speed)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python