python - 移动到其他房间时移除所有弹丸
问题描述
我试图做到这一点,当我从 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()
解决方案
评论中有一些混乱,因为projectile_list
实际上不是列表而是pygame.sprite.Group
. 如果要从组中删除所有精灵,可以调用empty方法:projectile_list.empty()
。
请注意,这empty
将仅从该特定组中删除精灵。如果要从所有组中删除相同的精灵,可以遍历精灵并调用它们的kill
方法。
推荐阅读
- html - CSS:背景颜色和图标 - 反转蒙版
- php - 使用php将在线mysql数据库与本地xampp服务器连接
- bash - 在 Bash 中重定向到 STDIN
- vba - 在 VBA 中修剪字典的内容
- php - 通过浏览器运行通过centos 7中的php代码将Docx转换为html不起作用
- flowtype - Flow 中的否定类型
- javascript - 创建 if/else 语句,以便根据光标值更改页面
- jquery - 在具有相同类的多个可放置 div 上拖动图像
- r - 闪亮应用程序中的图像输出
- angular - 使用 Firebase 存储和 Firebase 插入/更新用户个人资料图片