首页 > 解决方案 > 移动到其他房间时移除所有弹丸

问题描述

我试图做到这一点,当我从 A 房间移动到 B 房间时,房间里的所有弹丸都消失了。目前,如果我向右射击 3 枚弹丸,然后向左进入另一个房间,弹丸仍会出现在屏幕上,直到它们被带出屏幕尺寸。

使用该all_sprites_list.remove(projectile)功能可以让我在从一个房间移动到另一个房间时一次移除一颗子弹。

例如,当我使用那行代码时,如果屏幕上当前有 3 颗子弹,而我从 A 房间移动到 B 房间,屏幕上的一颗子弹会被移除,而另外 2 颗子弹会留下。回到房间 A 会移除另一颗子弹,再次移动到房间 B 会移除第三颗子弹。

我的问题是,如何在我换房间时同时移除所有三个子弹而不是游戏移除单个子弹?这是我的事件处理 - 我认为不需要更多代码,但如果需要,请告诉我。

# ---------- MAIN PROGRAM LOOP ---------- #


    while not done:


# --- Event Processing ---

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                done = True

# Controls
            elif event.type == pygame.KEYDOWN:
                projectile = None

                if event.key == pygame.K_LEFT:
                    projectile = ProjectileLeft("projectile.png", 0, 0)
                    projectile.rect.x = player.rect.x-15
                    projectile.rect.y = player.rect.y+33
                elif event.key == ord('a'):
                    player.changespeed(-7, 0)
                elif event.key == ord('d'):
                    player.changespeed(7, 0)
                elif event.key == ord('w'):
                    player.changespeed(0, -7)
                elif event.key == ord('s'):
                    player.changespeed(0, 7)


                if projectile:
                    projectile_list.add(projectile)


            elif event.type == pygame.KEYUP:
                if event.key == ord('a'):
                    player.changespeed(7, 0)
                elif event.key == ord('d'):
                    player.changespeed(-7, 0)
                elif event.key == ord('w'):
                    player.changespeed(0, 7)
                elif event.key == ord('s'):
                    player.changespeed(0, -7)


        all_sprites_list.update()
        projectile_list.update()

这是我的游戏逻辑;

player.move(current_room.wall_list)

if player.rect.x < -15:
    if current_room_no == 0:
        current_room_no = 3
        current_room = rooms[current_room_no]
        player.rect.x = 790
        projectile_list.remove(projectile)
        all_sprites_list.remove(projectile)
    elif current_room_no == 3:
        current_room_no = 2
        current_room = rooms[current_room_no]
        player.rect.x = 790
        projectile_list.remove(projectile)
        all_sprites_list.remove(projectile)
    elif current_room_no == 2:
        current_room_no = 1
        current_room = rooms[current_room_no]
        player.rect.x = 790
        projectile_list.remove(projectile)
        all_sprites_list.remove(projectile)
    else:
        current_room_no = 0
        current_room = rooms[current_room_no]
        player.rect.x = 790
        projectile_list.remove(projectile)
        all_sprites_list.remove(projectile)

if player.rect.x > 801:
    if current_room_no == 0:
        current_room_no = 1
        current_room = rooms[current_room_no]
        player.rect.x = 0
        projectile_list.remove(projectile)
        all_sprites_list.remove(projectile)
    elif current_room_no == 1:
        current_room_no = 2
        current_room = rooms[current_room_no]
        player.rect.x = 0
        projectile_list.remove(projectile)
        all_sprites_list.remove(projectile)
    elif current_room_no == 2:
        current_room_no = 3
        current_room = rooms[current_room_no]
        player.rect.x = 0
        projectile_list.remove(projectile)
        all_sprites_list.remove(projectile)
    else:
        current_room_no = 0
        current_room = rooms[current_room_no]
        player.rect.x = 0
        projectile_list.remove(projectile)
        all_sprites_list.remove(projectile)

这是我的脚本的结尾:

# Load background to current room       
        screen.blit(current_room.background_image, current_room.background_position)


    # Load time to screen
        Timer = font.render(output_string, True, constants.WHITE)
        screen.blit(Timer, [350, 30])

# Draw all sprites in lists on screen
        all_sprites_list.draw(screen)
        current_room.wall_list.draw(screen)
        current_room.enemy_sprites.draw(screen)
        if len(projectile_list)!=0
            projectile_list.draw(screen)

        frame_count += 1

        clock.tick(frame_rate)

        pygame.display.flip()

    pygame.quit()

if __name__ == "__main__":
    main()

标签: pythonpygame

解决方案


评论中有一些混乱,因为projectile_list实际上不是列表而是pygame.sprite.Group. 如果要从组中删除所有精灵,可以调用empty方法:projectile_list.empty()

请注意,这empty将仅从该特定组中删除精灵。如果要从所有组中删除相同的精灵,可以遍历精灵并调用它们的kill方法。


推荐阅读