精灵遇到位置后打印文本

时间:2014-04-26 13:46:14

标签: python position pygame sprite

目前我正在研究一个小型太空入侵者'使用pygame的风格游戏,我想根据分数/健康水平创建各种结果。我想这样做,如果敌人的船只已经通过了玩家并且玩家尚未达到70的分数限制以通过该等级,我想显示一条消息,说明目标分数未得到满足。

到目前为止,我有这个代码,我认为应该允许这种情况发生:

        if block.rect.y == random.randrange(600) and health >=25 and score < 70:
            font = pygame.font.Font("freesansbold.ttf", 30)
            label = font.render("Score target not met", 1, (0,255,0))
            labelRect = label.get_rect()
            labelRect.center = (400, 250)
            break

这里有更详细的说明:

for bullet in bullet_list:

    block_hit_list = pygame.sprite.spritecollide(bullet, block_list, True)

    for block in block_hit_list:
        explosion.play()
        bullet_list.remove(bullet)
        all_sprites_list.remove(bullet)
        score += 10

        if health >= 25 and score == 70:
            win.play()
            font = pygame.font.Font("freesansbold.ttf", 30)
            label = font.render("LEVEL COMPLETE!", 1, (0,255,0))
            labelRect = label.get_rect()
            labelRect.center = (400, 250)
            bullet_list.remove(bullet)
            all_sprites_list.remove(bullet)
            break

        if block.rect.y == random.randrange(600) and health >=25 and score < 70 and score > 0:
            font = pygame.font.Font("freesansbold.ttf", 30)
            label = font.render("Score target not met", 1, (0,255,0))
            labelRect = label.get_rect()
            labelRect.center = (400, 250)
            break

    if score >= 70:
        collision.stop()
        laser.stop()
        explosion.stop()
        bullet_list.remove(bullet)
        all_sprites_list.remove(bullet)
        block_list.remove(block)
        all_sprites_list.remove(block)
        player_list.remove(player)
        all_sprites_list.remove(player)

    if health == 0:
        laser.stop()
        bullet_list.remove(bullet)
        all_sprites_list.remove(bullet)

    if bullet.rect.y < -10:
        bullet_list.remove(bullet)
        all_sprites_list.remove(bullet)

然而,一旦我执行此代码,一旦敌人的船只通过,实际上没有任何文本粘贴到窗口上。

继续我的完整代码,任何人都知道为什么会发生这种情况:

http://pastebin.com/C0V5MnSH

1 个答案:

答案 0 :(得分:1)

我可以看到一些问题。首先,你不应该检查

内屏幕上的敌人
for bullet in bullet_list:
    for block in block_hit_list:

你应该在主循环上创建一个新行。

其次,每次打电话

random.randrange(600)

你会在0到600之间得到一个新的随机数。因此,如果阻止在屏幕上,则以下代码的运行几率为百分之六。如果块出现在屏幕上,则有0%的几率。相反,写

if block.rect.y >= 600:

所以整个事情应该是这样的:

for bullet in bullet_list:

    block_hit_list = pygame.sprite.spritecollide(bullet, block_list, True)

    for block in block_hit_list:
        explosion.play()
        bullet_list.remove(bullet)
        all_sprites_list.remove(bullet)
        score += 10

        if health >= 25 and score == 70:
            win.play()
            font = pygame.font.Font("freesansbold.ttf", 30)
            label = font.render("LEVEL COMPLETE!", 1, (0,255,0))
            labelRect = label.get_rect()
            labelRect.center = (400, 250)
            bullet_list.remove(bullet)
            all_sprites_list.remove(bullet)
            break

    if score >= 70:
        collision.stop()
        laser.stop()
        explosion.stop()
        bullet_list.remove(bullet)
        all_sprites_list.remove(bullet)
        block_list.remove(block)
        all_sprites_list.remove(block)
        player_list.remove(player)
        all_sprites_list.remove(player)

    if health == 0:
        laser.stop()
        bullet_list.remove(bullet)
        all_sprites_list.remove(bullet)

    if bullet.rect.y < -10:
        bullet_list.remove(bullet)
        all_sprites_list.remove(bullet)


if block.rect.y >= 600 and health >=25 and score < 70 and score > 0:
    font = pygame.font.Font("freesansbold.ttf", 30)
    label = font.render("Score target not met", 1, (0,255,0))
    labelRect = label.get_rect()
    labelRect.center = (400, 250)

希望有所帮助!