嗨,我在玩游戏做一个平台,但是我对玩家和平台之间的碰撞有麻烦,包括地板。问题是,当玩家在地面上时,试图下降一个像素,但立即被放置,因为程序不能决定它是应该上升还是下降。造成问题的代码如下:
def ground_check(self):
if self.onGround == False:
self.speedy += self.gravity
if self.onGround:
self.speedy = 0这会检查玩家是否在地面上,所以如果onGround是假的,那么玩家就应该被地心引力拉下来。
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()这是更新部分的一部分,我认为这是造成大部分问题的原因。我知道问题出在哪里,但我不知道如何解决。提前谢谢。
发布于 2015-12-09 19:15:51
这里的问题有两方面。首先,您错误地将您的播放器设置为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 - Check Planforms -由于self.rect.bottom == block.rect.top与块发生冲突,但不采取任何行动。onGround ==仍然是假的。-更新地面速度-检查。
传球3:升级位置-玩家掉线.绘制精灵-现在“在平台”运行通过更新。-将onGround设置为False。-带块的对撞机,self.rect.bottom = block.rect.top - onGroup == True的重置位置-将速度更新为0。
传球4:更新位置-玩家跳几个像素.
每四个周期冲洗和重复一次。
简单的解决方案应该是更改check_platforms中的以下代码行:
elif self.rect.bottom >= block.rect.top:你删除了你以前的问题,所以我看不出我之前的评论是什么。
https://stackoverflow.com/questions/34172836
复制相似问题