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。 但是我不知道这与我的代码有何关系,因此 不知道错误在哪里。
答案 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_pos
是Vector2
。因此,在此行之后,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