pygame - 敌人在与地面相撞时飞离屏幕?

时间:2016-01-13 16:03:10

标签: python pygame game-physics

这里的第一次海报。

我试着尽量保持这个简单。我试图在pygame中制作游戏,但似乎我的碰撞检测正在起作用。我有一个玩家类,可以检测玩家是否与地面或环境列表中的任何其他对象发生碰撞,并且我有一个敌人类与同一列表中的任何内容发生碰撞。敌人会找出他们需要前往的方向,以便尝试击中玩家。重力很可能在问题中发挥重要作用。

问题在于,当苍蝇'虽然他们的X和Y值看起来(根据屏幕上的项目记录)根本不会移动,但它们会立即从屏幕上跳下来然后掉落到地面上

作为澄清,两只苍蝇'被放入辅助列表以允许碰撞检测。另外,作为旁注,“故障”是一个小问题。如果没有左右碰撞检测,则不会发生...感谢任何可以提供帮助的人:)

def collisions():

#Detection Working as intended
    for fly in Fly.List:
        fly_proj = pygame.sprite.spritecollide(fly, Projectile.List, True)
        if len(fly_proj) > 0:
            for hit in fly_proj:
                fly.health -= 100

        X = pygame.sprite.spritecollide(fly, current_level.object_list, False)
        if len(X) == 0: #Gravity here:
            if (fly.vspeed == 0):
                fly.vspeed = 1
                print("Gravity")
            else:
                fly.vspeed += 0.35
        if len(X) > 1: 
            for hit in X:

                if fly.vspeed > 0:            
                    fly.rect.bottom = hit.rect.top +1
                    fly.vspeed = 0
                elif fly.vspeed < 0:    
                    fly.rect.top = hit.rect.bottom -1
                elif fly.hspeed > 0:
                    fly.rect.right = hit.rect.left
                    fly.hspeed = 0
                elif fly.hspeed < 0:            
                    fly.rect.left = hit.rect.right
                    fly.hspeed = 0

        print(len(X),framecounter, fly.vspeed, fly.hspeed)
#Kill fly if health reaches 0            
        if fly.health <= 0:
            fly.destroy(Fly)

 #Detect where the player is
        if window_rect.contains(fly.rect):
            fly.playersnapshot = player.rect.x
        if fly.rect.x - player.rect.x >= -10:
            #print("LEFTING")
            fly.hspeed = -2
        if fly.rect.x - player.rect.x <= 10:
            fly.hspeed = 2
        fly.truefalse = True
        event = None

        fly.rect.y += fly.vspeed
        fly.rect.x += fly.hspeed

2 个答案:

答案 0 :(得分:1)

我认为您的if/else不正确。

可能在飞行触地时,您将vspeed设置为零,然后if/else检查hspeed,并使用地left/right更改飞left/right

我知道一种方法。

  1. 垂直移动
  2. 检查冲突并将if/elsevspeed
  3. 一起使用
  4. 水平移动
  5. 检查冲突并将if/elsehspeed
  6. 一起使用

    -

    编辑:

     # move horizontally only
    
     fly.rect.x += fly.hspeed
    
     X = pygame.sprite.spritecollide( ... )
    
     for hit in X:
         if fly.hspeed > 0:
             fly.rect.right = hit.rect.left
         else:
             fly.rect.left = hit.rect.right
    
     # move vertically only
    
     fly.rect.y += fly.vspeed
    
     X = pygame.sprite.spritecollide( ... )
    
     for hit in X:
         if fly.vspeed > 0:
             fly.rect.bottom = hit.rect.top
         else:
             fly.rect.top = hit.rect.bottom
    
         # on_ground = True
    

    我在&#34;平台跳线&#34;的源代码中找到了这个方法。在ProgramArcadeGames.com

    请参阅页面:platform_jumper.py

答案 1 :(得分:0)

感谢furas为我提供了一些可以解决的问题,我已经找到了问题所在。对于那些感兴趣的人,代码被替换了:

                if fly.vspeed > 0:            
                    fly.rect.bottom = hit.rect.top +1
                    fly.vspeed = 0
                elif fly.vspeed < 0:    
                    fly.rect.top = hit.rect.bottom -1
                elif fly.hspeed > 0:
                    fly.rect.right = hit.rect.left
                    fly.hspeed = 0
                elif fly.hspeed < 0:            
                    fly.rect.left = hit.rect.right
                    fly.hspeed = 0

使用:

                fly.rect.y += fly.hspeed
                if fly.vspeed > 0:
                    fly.rect.bottom = hit.rect.top
                else:
                    fly.rect.top = hit.rect.bottom

                if fly.rect.bottom == hit.rect.top:
                    fly.vspeed = 0
                if fly.vspeed == 0:
                    fly.rect.x += fly.vspeed
                    if fly.hspeed > 0:
                        fly.rect.right = hit.rect.left
                    else:
                        fly.rect.left = hit.rect.right

但是,现在我遇到一个问题,即飞行物体无法控制地下降(vspeed不断增加),罪魁祸首就是这么少的代码:

if self.vspeed == 0: 
    self.vspeed = 1 
else: 
    self.vspeed += 0.35 #Rate of gravity

如果有人知道这里发生了什么,请不要犹豫回答:)

<强>更新

感谢Furas,他基本上为我完成了所有工作:D感谢教给我一些新东西:)

对于那些感兴趣的人,最终的工作代码是这样的:当调用colllisions()函数时调用(on_ground)。

        fly.rect.y += fly.vspeed

        X = pygame.sprite.spritecollide(fly, current_level.object_list, False)

        for hit in X:
            if fly.vspeed > 0:
                fly.rect.bottom = hit.rect.top
                on_ground = True
            else:
                fly.rect.top = hit.rect.bottom

        # move horizontally only

        fly.rect.x += fly.hspeed

        X = pygame.sprite.spritecollide(fly, current_level.object_list, False)

        for hit in X:
            if fly.hspeed > 0:
                fly.rect.right = hit.rect.left
            else:
                fly.rect.left = hit.rect.right

        if on_ground == True:
            fly.vspeed = 0
            #print("WAT2")
        else:
            fly.vspeed += 0.35