1

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

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

4

2 回答 2

1

正如尼尔已经说过的,您只需检查 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

并查看该类的文档Rect以找到许多方便的函数,例如colliderect.

也可以使用 aRect来表示你的炸弹*的位置(就像你一样 for player),你可以使用这样的代码:

if player.rect.colliderect(thing.rect):
    gameOVer = True

* 它可能应该有它自己的类,继承自Sprite,但这是另一个话题

于 2016-11-02T09:30:37.627 回答
0

我不知道 python,但很明显,您用于测试碰撞的条件语句只是检查 y 值是否大于玩家的 y 值,当然,即使在它通过后也是如此屏幕底部。所以你需要一个 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 位置测试,但您似乎已经解决了这个问题。

于 2016-11-01T17:01:22.360 回答