平台碰撞出错了

时间:2015-12-09 07:17:52

标签: python pygame

你好我在pygame上制作了一个平台游戏,但我遇到了玩家和平台之间发生碰撞的麻烦,包括地板。问题是当玩家在地面上试图向下移动一个像素但是立即被提起时,因为程序无法决定它是应该上升还是下降。以下是导致问题的代码:

def ground_check(self):
    if self.onGround == False:
        self.speedy += self.gravity
    if self.onGround:
        self.speedy = 0

这会检查玩家是否在地上,所以如果onGround为False,那么玩家应该被重力拉下来。

def check_platforms(self):
    block_list = pygame.sprite.spritecollide(self, platform_group, False)
    for block in block_list:
        if self.rect.bottom < block.rect.top:
            self.onGround = False
        elif self.rect.bottom > block.rect.top:
            self.onGround = True
            self.rect.bottom = block.rect.top

这将检查sprite组中的任何平台冲突。

def update(self):
    self.speedx = 0
    self.onGround = False
    self.check_walls()
    self.check_platforms()
    self.ground_check()

这是我认为导致大部分问题的更新部分的一部分。我知道问题是什么,但我不知道如何解决它。提前谢谢。

1 个答案:

答案 0 :(得分:1)

这里的问题有两个方面。首先,您在每次更新时都错误地将播放器设置为onGroud = False。你为什么要这样做?

接下来,输入check_walls()方法。我将假设这对球员的Y位置或动作没有任何作用。

然后输入check_platforms()方法。如果您正在与平台发生碰撞,使得您的播放器底部低于平台顶部,则将onGround设置为True,然后将set.rect.bottom设置为等于block.ret.top。 [这就是你的问题开始]。我们现在处于这样的状态:self.rect.bottom == block.rect.top并且if self.rect.bottom < block.rect.top:elif self.rect.bottom > block.rect.top:都没有被捕获 - 所以如果onGround需要更新 - 太糟糕了,那就是假的

现在我们输入ground_check(),它将更新Y速度以增加重力。

这就是你的播放器弹跳的原因。

通过1: 根据速度更新位置(代码不存在) 画精灵(代码不存在) 运行更新。    - 玩家与平台发生碰撞,    - 将其位置重置为平台上的像素。    - 不给Y速度。

通过2: 更新位置 - 没有变化,因为没有Y速度。 画精灵 - 没有变化。 运行更新。    - 将onGround设置为False    - 检查Planforms - 因为self.rect.bottom == block.rect.top而与块冲突,但是没有采取任何行动。仍然onGround ==错误。    - 在地面检查中更新速度。

通过3: 更新位置 - 玩家掉线。 在平台&#34;中绘制精灵 - 现在&#34; 运行更新。    - 将onGround设置为False。    - 碰撞阻止,重置self.rect.bottom = block.rect.top的位置    - onGroup == True    - 将速度更新为0。

通过4: 更新位置 - 玩家跳起几个像素。

每四个周期冲洗并重复一次。

简单的解决方案应该是更改check_platforms中的以下代码行:

elif self.rect.bottom >= block.rect.top:

您删除了之前的问题,因此无法查看我以前的评论。