我正在制作一个简单的pygame项目,目前它有来自屏幕顶部并落到屏幕底部的坠落炸弹。如果玩家击中炸弹,他们就会死亡。到目前为止,一切都很顺利。问题是,当炸弹通过播放器但尚未离开屏幕时,它仍会杀死播放器。意思是,炸弹将通过玩家的下半部分但是如果你穿过,在它穿过屏幕的下半部分之前,你将会死亡。他是我的代码:
if player.rect.y < thing_starty + thing_height:
if player.rect.x > thing_startx and player.rect.x < thing_startx + thing_width or player.rect.x + 28 > thing_startx and player.rect.x + 28 < thing_startx + thing_width:
gameOver = True
值如下:
thing_startx = random.randrange(0, S_WIDTH)
thing_starty = -300
thing_speed = 3
thing_width = 128
thing_height = 128
player.rect.x的值范围从120到500,具体取决于播放器在屏幕上的位置。 (当您移动时,屏幕将从左向右滚动。)28来自角色图像的宽度。
下降对象的代码如下:
if thing_starty > S_HEIGHT:
pygame.mixer.Sound.play(bomb_sound)
thing_starty = 0 - thing_height
thing_startx = random.randrange(0, S_WIDTH)
dodged += 1
thing_speed += .5
我已经为此工作了大约一个星期而没有取得任何进展。感谢您的任何帮助。
答案 0 :(得分:1)
正如Neal所说,你只需检查y值是否大于玩家的y值。
但我的建议是,停止使用这样的代码:
if player.rect.y < thing_starty + thing_height:
if player.rect.x > thing_startx and player.rect.x < thing_startx + thing_width or player.rect.x + 28 > thing_startx and player.rect.x + 28 < thing_startx + thing_width:
gameOver = True
并查看documentation for the Rect
class以找到许多方便的功能,例如colliderect
。
使用Rect
代表炸弹*的位置(就像你对player
一样),你可以使用这样的代码:
if player.rect.colliderect(thing.rect):
gameOVer = True
*应该有自己的类,继承自Sprite
,但这是另一个话题
答案 1 :(得分:0)
我不知道python但很明显,你用来测试碰撞的条件语句只是检查y值是否大于玩家的sy值,当然,即使它通过屏幕的底部后也是如此。所以你需要一个AND操作数。
伪代码(因为我不知道python ......或者你正在使用的任何东西)
if (bomb.y >= player.y AND bomb.y <= player.y + player.height){
run bomb hits player logic
}
或者如果你不想使用AND操作数(它不会是AND,但每种语言都有自己的版本),那么你可以使用像这样的嵌套条件块
伪码
if (bomb.y >= player.y){
if (bomb.y <= player.y + player.height){
run bomb collision logic
}
}
这样,如果炸弹低于播放器/关闭屏幕,则碰撞逻辑不会运行。当然,它也需要通过x位置测试,但你似乎已经完成了整理。