我正在尝试制作Towerdefense游戏为了检查敌人是否在塔的命中圈内,我想使用函数pygame.sprite.collide_mask来了解他们是否在接触。
这是输出:AttributeError:"pygame.mask.mask"对象没有属性"add_internal">
我怎样才能让它工作?我在游戏中检测碰撞的方向是否正确?
我希望这个代码可以像一样工作
import pygame
pygame.init()
class Tower(pygame.sprite.Sprite):
def __init__(self, window):
self.collision_circle =
pygame.image.load('assets/Towers&Projectiles/Collision_Circle/collision_circle.png')
self.tower_mask = pygame.mask.from_surface(self.collision_circle)
class Enemy(pygame.sprite.Sprite):
def __init__(self, window):
self.enemy_mask_image = pygame.image.load('Assets/Enemy/WALK_000.png')
self.enemy_mask = pygame.mask.from_surface(self.enemy_mask_image)
pygame.display.set_caption("Tower Defense")
width = 1200
height = 840
display_surface = pygame.display.set_mode((width, height))
my_enemy = Enemy(display_surface)
my_tower = Tower(display_surface)
while True:
enemy_sprite = pygame.sprite.GroupSingle(my_enemy.enemy_mask)
tower_sprite = pygame.sprite.GroupSingle(my_tower.tower_mask)
if pygame.sprite.spritecollide(enemy_sprite.sprite,tower_sprite,False,pygame.sprite.collide_mask()):
print("collision")
collide_mask
使用Spirate的.rect
和.mask
对象。因此,Mask属性的名称必须是mask
,而不是tower_mask
或enemy_mask
此外,对象必须具有名为rect
的属性,该属性是具有精灵位置的pygame.Rect
对象
此外,super
调用类构造函数中缺少的。例如:
class TowerCircle(pygame.sprite.Sprite):
def __init__(self, centerx, centery):
super().__init__()
self.image = pygame.image.load('assets/Towers&Projectiles/Collision_Circle/collision_circle.png')
self.mask = pygame.mask.from_surface(self.collision_circle)
self.rect = self.image.get_rect(center = (centerx, centery))
class Enemy(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = pygame.image.load('Assets/Enemy/WALK_000.png')
self.mask = pygame.mask.from_surface(self.enemy_mask_image)
self.rect = self.image.get_rect(topleft = (x, y))
请参见Pygame遮罩碰撞和在Pygame中将一条线作为具有自身碰撞的精灵。