首页 文章

如何使用向量在PyGame中创建精灵碰撞?

提问于
修改于
浏览 1926
0

https://github.com/maartenww/100daysOfCode_projectOne/tree/StackOverflow(这里的参考是我的代码的回购,带有错误的代码分支,(所以它仍然可供其他人阅读))

嗨,我正在创建一个平台游戏,我遇到了一个问题,我尝试使用pygame库在两个精灵之间进行碰撞 .

class Game:

    def sprite_col(self, player_1, platform_list):
        sprites_hit = pygame.sprite.spritecollide(player_1, platform_list, False)

使用pygame向量计算精灵位置

vec = pygame.math.Vector2

class Player(pygame.sprite.Sprite):

    # Player Constructor
    def __init__(self, player_width, player_height, player_color):
        pygame.sprite.Sprite.__init__(self)
        self.rect = self.image.get_rect()
        self.player_pos = vec(screen_width / 2, screen_height / 2)
        self.rect.x = self.player_pos.x
        self.rect.y = self.player_pos.y

我不知道为什么顶部代码块不会运行 . 我用谷歌搜索了我的问题并查看了我用于参考的视频:

https://www.youtube.com/watch?v=pN9pBx5ln40&list=PLsk-HSGFjnaG-BwZkuAOcVwWldfCLu1pq&index=3(跳至8:40)

它给了我以下错误:

回溯(最近一次调用最后一次):文件“C:/ScrewAround/100DaysOfCodeProject1/main.py”,第81行,在main()中

主g.run(Player_1)中的文件“C:/ScrewAround/100DaysOfCodeProject1/main.py”,第76行

文件“C:/ScrewAround/100DaysOfCodeProject1/main.py”,第65行,运行self.update_game(player_1)

在update_game self.sprite_col(player_1)中的文件“C:/ScrewAround/100DaysOfCodeProject1/main.py”,第58行

文件“C:/ScrewAround/100DaysOfCodeProject1/main.py”,第41行,sprite_col sprites_hit = pygame.sprite.spritecollide(player_1,platform_sprites,False)

文件“C:\ ScrewAround \ 100DaysOfCodeProject1 \ venv \ lib \ site-packages \ pygame \ sprite.py”,第1524行,spritecollide spritecollide = sprite.rect.colliderect

AttributeError:'pygame.math.Vector2'对象没有属性'colliderect'

正如您所看到的,它是带有Vectors和colliderect的AttributeError . 但是我不知道这与我的代码有什么关系,因此不知道错误所指的位置 .

1 回答

  • 2

    Player 类中,您具有以下功能:

    def update_player(self):
        # Gravity
        self.player_vel.y += self.player_acc.y
        self.player_pos.y += self.player_vel.y + self.player_acc.y * .5
        # Acceleration
        self.rect = self.player_pos
        self.player_vel.x += self.player_acc.x
        self.player_pos.x += self.player_vel.x + self.player_acc.x * .5
        # Friction
        self.player_acc.x += (self.player_vel.x * -PLAYER_FRIC) / 1000
        if (self.player_vel.x > -.1) and (.1 > self.player_vel.x):
            self.player_acc.x = 0
            self.player_vel.x = 0
        elif(self.player_vel.x > 15) and (-15 > self.player_vel.x):
            self.player_vel.x = 15
            self.player_acc.x = 15
    

    注意这一行

    self.rect = self.player_pos
    

    player_posVector2 . 所以,在这一行之后, self.rect 也将是 Vector2 .

    但pygame库中处理Sprites的每个函数都希望Sprite具有 Rect 类型的 rect 字段 . 因此错误: spritecollide 想要使用 Rect.colliderect .

    您可以使用自定义碰撞功能并在 spritecollide 中使用它,但恕我直言,如果您将摆脱 player_pos 并且只使用 rect 字段来存储Sprite的位置会更好 .

    另一种方法是将Rect更改为存储在Vector中的位置,就像您已经在 __init__ 函数中那样:

    self.rect.x = self.player_pos.x
     self.rect.y = self.player_pos.y
    

相关问题