当前位置: 首页 > 知识库问答 >
问题:

处理带有多个侧面碰撞的简单平台游戏问题

赖翰
2023-03-14

到目前为止,我从一个平坦的平台开始,我的角色在上面。

我已经实现了重力和跳跃功能

因此重力概念如下,继续向下下落,直到玩家与下方物体碰撞。

所以,当我在我的英雄下面有一个平的平台,但当我想实现一个屋顶时,这是可行的。所以我的播放器上下有一个平台。

我的重力函数一直在下降。我的地形都在pygame.Rect列表中。

我的重力函数遍历我所有的地形,检查玩家是否在地板上方,如果是,请继续下落。

我注意到的问题是,由于我的角色上方有物体,所以它一直在下落。我似乎想不出一种方法来忽略我的角色上面的牌,而只关注我的玩家下面的牌,并检查勾结。

一旦我发现了这个共谋问题,我确信我可以在跳起来检查与屋顶的碰撞以及左右移动时发现它。

感谢帮助。

编辑:地形是我的对象平铺列表。现在地形只有两个物体

#this is not correct way initialize just displaying my 2 object's rect
terrain = [<rect(400, 355, 50, 49)>,<rect(500, 198, 50, 49)>]

def GRAVITY(self, terrain):
    '''----------break is cutting of parsing the rest of the terrain.
    ----------Need to search through each terrain. Keep falling until collide with an object under the hero ONLY.
    '''
    for i in range(len(terrain)):
        print i
        #stop falling when colliding with object
        if terrain[i].top > self.rect.bottom:
            print 'above tile while falling'
            self.y += JUMPRATE
            break
        #continue falling if not standing on the object. Also catch when walking of an object then fall.
        elif terrain[i].top <= self.rect.bottom and not self.rect.colliderect(terrain[i]):
            print 'whoops missed tile'
            self.y +=JUMPRATE
            break
        else:
            print 'on tile'
            self.y = self.y
            break

这是玩家跳转时调用的函数。

共有1个答案

林曦之
2023-03-14

在您的代码中,每个子句中都有一个break语句,因此无论列表中有多少Rect,循环都将始终运行一次。

您可以使用碰撞标志,仅在发生碰撞时才中断。

def fall(self, terrain):
   collided = False
   for rect in terrain:
       if self.rect.colliderect(rect):
           collided = True
           break
   if not collided:
       self.y += JUMPRATE

如果没有碰撞,角色就会倒下。否则,它不动。不过,你必须添加一些东西来处理侧面碰撞的情况。此外,角色的脚会稍微穿过地板,所以一旦碰撞,您应该将角色的< code>rect.bottom设置为地形的< code>top。

 类似资料:
  • 我正在做一个2d平板游戏。到目前为止,我已经做了一些事情。我正在使用libgdx的矩形进行基本的碰撞检测,所以考虑到我现在只有草块,我用Java制作了一个单块世界(文件读取器还没有准备好),问题是我的检测只在第一次工作,换句话说,如果我产生碰撞到一个块,它会检测到碰撞并这样做。虽然如果我在没有碰撞的情况下,让我的球员在方块顶部出现,球员将永远摔倒。 这是代码=

  • 我正在开发一个平台,我有一个32x32的精灵和32x32的磁贴。我还使用了一个图块引擎,它在数组的帮助下生成地图。我使用一个< code>RectangleHelper.cs来修复与瓷砖和播放器的碰撞,到目前为止,它可以与瓷砖的顶部碰撞,也可以与瓷砖的左侧碰撞。 在第一张图中,我展示了“在顶部”碰撞工作正常。没有错误什么的。 在图2中,我展示了“碰撞左侧”,这也很棒。 但是在图3中,你可以看到这个

  • 我已经和LWJGL一起开发这个游戏几个星期了。自从我增加了跳跃的能力后,向上的碰撞给我带来了很多问题。 这个游戏是一个基于2D瓷砖的侧翻游戏。总的来说,除了玩家跳跃时,碰撞几乎是完美的。起初我想“哦,也许我只需要改变跳跃机制”,但后来我意识到只有当玩家通过某个x坐标时才会发生这种情况。 现在,对于实际问题本身:如果玩家在传递某个x坐标时跳转,他们将通过平铺,并测试顶部碰撞返回false。 这是整个

  • 我可以阻止吃豆人通过墙的一种方式,但他可以通过墙时去在另一个方向,我使用的代码是: } 我需要他在任何方向上都不要穿过墙!提前谢谢

  • 我正在尝试做一个平台游戏,其中没有斜坡。我正在尝试将碰撞检测降下来,但是我在pygame中找不到一种方法来获得哪一边与另一个Sprite发生了碰撞。有没有人能给我一个好的方法来做到这一点,那不是太庞大,但也能很好地工作在我的情况? 下面是我的玩家类: 我已经将它添加到我的player类中,每次播放器更新时我都运行它,并且它工作...差一点。 在平台顶部的碰撞起作用,在侧面的碰撞几乎总是起作用,除非

  • 我对libgdx和游戏开发非常陌生。我的任务是给我一个非常简单的2D游戏,它已经实现了矩形碰撞检测。 游戏只是由一个可以由玩家控制的正方形组成,该正方形位于墙壁内,墙壁内有其他分散的正方形。我现在需要在玩家方块和散落方块/墙壁之间实现像素完美碰撞。 我最初尝试使用Pixmap,并试图检查当前坐标的像素对于播放器矩形以及与之冲突的任何矩形是否透明,但在正确实现代码时遇到了问题。 我知道我必须在某个坐