如何解决碰撞错误 self.rect.colliderect(sprite.rect)
这段代码在碰到精灵之前开始打印“碰撞”。
这定义了“子弹”
fig = plt.figure(figsize=(12,7))
ax = fig.add_subplot()
img = ax.scatter(xs,ys,c=t_low,cmap=plt.hot())
fig.colorbar(img)
ax.set_xlabel('X')
ax.set_ylabel('Y')
plt.show()
这是碰撞检测代码
class Magic(pygame.sprite.Sprite):
def __init__(self,x,y):
self.x = x
self.y = y
self.image = pygame.image.load("Magic.png")
self.rect = self.image.get_rect()
pygame.sprite.Sprite.__init__(self,spritegroup)
def is_collided_with(self,sprite):
return self.rect.colliderect(sprite.rect)
这定义了敌人
if magic.is_collided_with(enemy1):
print("collision")
enemy1.kill()
enemy1 是下面定义的敌人
class Enemy(pygame.sprite.Sprite):
def __init__(self,y):
self.x = x
self.y = y
self.image = pygame.image.load("Enemy1.png")
self.rect = self.image.get_rect()
pygame.sprite.Sprite.__init__(self,spritegroup)
def render(self):
screen.blit(self.image,(self.x,self.y))
解决方法
pygame.Surface.get_rect.get_rect()
返回一个具有 Surface 对象大小的矩形,但它返回一个矩形,它总是从 (0,0) 开始,因为 Surface对象没有位置。
Surface 使用 blit
函数放置在显示屏上的某个位置。
您必须通过分配给虚拟属性(参见 pygame.Rect
)来设置矩形的位置,例如:
class Magic(pygame.sprite.Sprite):
# [...]
def is_collided_with(self,sprite):
sprite.rec.topleft = sprite.x,sprite.y
self.rect.topleft = self.x,self.y
return self.rect.colliderect(sprite.rect)
但是,我建议删除 x
和 y
属性。请改用 rect.x
和 rect.y
。通过关键字参数设置矩形的位置:
class Magic(pygame.sprite.Sprite):
def __init__(self,x,y):
self.image = pygame.image.load("Magic.png")
self.rect = self.image.get_rect(topleft = (x,y))
pygame.sprite.Sprite.__init__(self,spritegroup)
def is_collided_with(self,sprite):
return self.rect.colliderect(sprite.rect)
class Enemy(pygame.sprite.Sprite):
def __init__(self,y):
self.image = pygame.image.load("Enemy1.png")
self.rect = self.image.get_rect(topleft = (x,spritegroup)
def render(self):
screen.blit(self.image,self.rect)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。