我与平台图像的冲突问题如何解决?

时间:2020-05-12 14:48:08

标签: python pygame

问题是,当我与平台碰撞时,它似乎使我走得比platform更高,它对我所有的平台都执行了此操作,并且知道为什么

我与平台的碰撞

job_resrcs

我的完整代码

        for enemy in enemies:
            if playerman.rect.colliderect(enemy.rect):
                collide = True
                playerman.y = enemy.rect.top - playerman.height + 1
                if playerman.rect.right > enemy.rect.left and playerman.rect.left < enemy.rect.left - playerman.width:
                    playerman.x = enemy.rect.left - player.width
                if playerman.rect.left < enemy.rect.right and playerman.rect.right > enemy.rect.right + playerman.width:
                    playerman.x = enemy.rect.right

1 个答案:

答案 0 :(得分:2)

该问题隐藏在Platform类中,因为self.platformsplatform不同。
注意self.platforms缩放到其一半大小,因此在设置矩形(self.platforms)时必须使用platform而不是self.rect

self.rect = pygame.Rect(x,y,platforms.get_width(), platforms.get_height())

self.rect = pygame.Rect(x,y, self.platforms.get_width(), self.platforms.get_height())

无论如何,我建议通过get_rect()获取矩形:

self.rect = self.platforms.get_rect(topleft = (x, y))

Paltform类:

class enemy:
    def __init__(self,x,y,height,width,color):
        self.x = x
        self.y = y
        self.height = height
        self.width = width
        self.color = color
        self.rect = pygame.Rect(x,y,height,width)
        self.platforms = pygame.image.load("rat.png")
        self.platforms = pygame.transform.scale(self.platforms,(self.platforms.get_width()//2,self.platforms.get_height()//2))

        self.rect = self.platforms.get_rect(topleft = (x, y)) # <---

        self.direction = "left" #set a stating direction

如果图像的顶部不是可击中的,例如散布的草,则必须按草的高度缩小击中框。
将方法添加到类enemy中,该方法将返回点击框:

class enemy:
    # [...]

    def get_hitbox(self):
        grass_height = 25
        hitboxb = self.rect
        hitboxb.top += grass_height
        return hitboxb
class botts:
    # [...]

    def get_hitbox(self):
        return self.rect

使用点击框进行碰撞检测:

for enemy in enemies:

     enemy_hitbox = enemy.get_hitbox()

     if playerman.rect.colliderect(enemy_hitbox):
         collide = True
         playerman.y = enemy_hitbox.top - playerman.height + 1
         # [...]