敌人AI碰撞检测不工作

我的敌人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.xvelself.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):

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注