【问题标题】:Working on simple platform game issue with multiple side collisions处理具有多个侧面碰撞的简单平台游戏问题
【发布时间】:2012-04-25 21:16:46
【问题描述】:

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

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

所以重力概念的工作原理如下,继续向下坠落,直到玩家与下方的物体发生碰撞。

所以,当我的英雄下方有一个平坦的平台时,这很有效,但是当我想实现一个屋顶时。 所以我的播放器顶部和下方都有一个平坦的平台。

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

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

我注意到的问题是,因为我的角色上方有物体,所以它不断下落。我似乎无法找到一种方法来忽略角色上方的图块,而只关注玩家下方的图块并检查是否存在合谋。

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

帮助表示赞赏。

编辑: 地形是我的对象瓷砖的列表。 现在地形只有 2 个对象

#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

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

【问题讨论】:

  • 这不是a good question。发布一些代码,给我们一个您面临的确切问题 - 我们不知道您的代码是如何工作的,那么我们该如何回答?然而,这里明显的注释是don'treinventthewheel
  • zyeek,我已经对您的代码进行了两次格式化。请确保当您将代码粘贴到您的问题中时,它的格式正确。这意味着您需要在每行前面添加四个 additional 空格。此外,您似乎在源代码中混合了制表符和空格。这是一个坏主意。见:stackoverflow.com/questions/120926/…
  • 嗯好的。我将标签设置为 4 个空格。更容易管理,当我确实需要缩进时它不是一个很大的块。

标签: python collision-detection pygame collision gravity


【解决方案1】:

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

您可以做的是使用collided 标志并且仅在发生碰撞时中断。

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

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

【讨论】:

  • 是的,谢谢。我实际上和一个也有同样想法的同学交谈过。最后检查我何时与一个物体发生碰撞,这意味着我专注于那个地形。然后判断它是否在播放器下,如果是的话。别跌倒了。
  • 这听起来是一个很好的思考方式——隔离碰撞的地形。不管怎样,很高兴你在路上。
猜你喜欢
  • 2011-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-26
相关资源
最近更新 更多