与pygame崩溃的事件

时间:2016-11-01 16:54:33

标签: python pygame pygame-surface

我正在制作一个简单的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

我已经为此工作了大约一个星期而没有取得任何进展。感谢您的任何帮助。

2 个答案:

答案 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位置测试,但你似乎已经完成了整理。