这里的第一次海报。
我试着尽量保持这个简单。我试图在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
答案 0 :(得分:1)
我认为您的if/else
不正确。
可能在飞行触地时,您将vspeed
设置为零,然后if/else
检查hspeed
,并使用地left/right
更改飞left/right
。
我知道一种方法。
if/else
与vspeed
if/else
与hspeed
-
编辑:
# 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