我的敌人AI无法检测到碰撞。我一直在使用用于玩家碰撞检测的代码。我对其进行了调整以适应敌人,但它不起作用:
class Enemy(Entity): def __init__(self, x, y,player): pygame.sprite.Sprite.__init__(self) self.image = Surface((32, 32)) self.xvel = 0 self.yvel = 0 self.image.fill(Color("#FF0000")) #敌人是红色的 self.onGorund = False #敌人是32 * 32像素 self.image.convert() self.rect = Rect(x, y, 32, 32) self.counter = 0 #计数器变量 self.player = player def move(self, speed = 5): #追逐移动 if self.rect.x > self.player.rect.x: #沿x方向移动 self.rect.x -= speed elif self.rect.x < self.player.rect.x: self.rect.x += speed if self.rect.y < self.player.rect.y: #沿y方向移动 self.rect.y += speed elif self.rect.y > self.player.rect.y: self.rect.y -= speed def collide(self, xvel, yvel, platforms): for p in platforms: if pygame.sprite.collide_rect(self, p): if isinstance(p, Player_class): pygame.quit() sys.exit() if xvel > 0: self.rect.right = p.rect.left print ("collide right") if xvel < 0: self.rect.left = p.rect.right print ("collide left") if yvel > 0: self.rect.bottom = p.rect.top self.onGround = True self.yvel = 0 if yvel < 0: self.rect.top = p.rect.bottom def update(self, platforms): if up: if self.onGround: self.yvel -= 10 #只有当敌人在地面上时才跳跃 if down: pass if running: self.xvel = 12 if left: self.xvel = -8 if right: self.xvel = 8 if not self.onGround: self.yvel += 0.3 #只有在空中时才受到重力加速度 if self.yvel > 100: self.yvel = 100 #终端速度 = 100 if not(left or right): self.xvel = 0 self.rect.left += self.xvel #下落或跳跃 self.collide(self.xvel, 0, platforms) #沿x轴创建碰撞 self.rect.top += self.yvel #沿y轴创建碰撞 self.onGround = False; #假设敌人在空中 # 进行y轴碰撞 self.collide(0, self.yvel, platforms)
我一直在尝试在敌人碰到玩家时关闭窗口,问题是,如果敌人不知道它正在碰到玩家,它就无法关闭窗口。如果需要更多代码,请告诉我。
回答:
有一些需要更改的地方。
-
在
move
方法中,你应该设置速度(self.xvel
和self.yvel
),而不是直接移动rect。 -
然后在
update
方法中调用move
方法,移动精灵的rect并处理碰撞。另外,你现在需要在main
函数中调用update
方法而不是move
,并传递platforms
列表:enemy_list.draw(screen)for e in enemy_list: e.update(platforms)
-
在
collide
方法中,你检查平台之一是否是玩家实例:for p in platforms: if pygame.sprite.collide_rect(self, p): if isinstance(p, Player_class): pygame.quit() sys.exit()
然而,玩家精灵不在这个列表中,所以它无法碰撞。
敌人实际上有一个对玩家的引用(
self.player
),所以你可以这样做来检查它们是否碰撞:if pygame.sprite.collide_rect(self, self.player):
或者:
if self.rect.colliderect(self.player.rect):