你好我在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()
这是我认为导致大部分问题的更新部分的一部分。我知道问题是什么,但我不知道如何解决它。提前谢谢。
答案 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:
您删除了之前的问题,因此无法查看我以前的评论。