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

时间:2018-07-17 13:14:20

标签: python python-3.x pygame

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()

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

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

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

文件“ 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并发生碰撞的AttributeError。 但是我不知道这与我的代码有何关系,因此 不知道错误在哪里。

1 个答案:

答案 0 :(得分: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的位置。

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

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