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 回答
在
Player
类中,您具有以下功能:注意这一行
player_pos
是Vector2
. 所以,在这一行之后,self.rect
也将是Vector2
.但pygame库中处理Sprites的每个函数都希望Sprite具有
Rect
类型的rect
字段 . 因此错误:spritecollide
想要使用Rect.colliderect
.您可以使用自定义碰撞功能并在
spritecollide
中使用它,但恕我直言,如果您将摆脱player_pos
并且只使用rect
字段来存储Sprite的位置会更好 .另一种方法是将Rect更改为存储在Vector中的位置,就像您已经在
__init__
函数中那样: