在学习实现alien_invasion这个项目的时候,遇到了bullet这个class,需要用到pygame的Sprite和Group,觉得不好理解,所以把bullet的相关功能单独抽取出来。简化为在屏幕底部开火,今后再整合到整个项目中。
import sys
import pygame
from pygame.sprite import Sprite
from pygame.sprite import Group
class Bullet(Sprite):
def __init__(self,screen):
super().__init__()
self.screen = screen
self.rect = pygame.Rect(0,0,3,15)
# 将发射位置简化为屏幕底部中央
self.rect.centerx = screen.get_rect().centerx
self.rect.bottom = screen.get_rect().bottom
# 子弹向上飞
def update(self):
self.rect.y -= 1
# 绘制子弹
def draw_bullet(self):
pygame.draw.rect(self.screen,(60,60,60),self.rect)
# 对编组中的子弹进行位置更新和删除
def update_bullets(bullets):
# 更新所有子弹的位置
bullets.update()
# 删除飞出屏幕的子弹
for bullet in bullets.copy(): # 必须使用.copy()
if bullet.rect.bottom <= 0:
bullets.remove(bullet)
# 开火,控制屏幕上最多子弹数量为3个
def fire_bullet(bullets,screen):
if len(bullets) < 3:
new_bullet = Bullet(screen)
bullets.add(new_bullet)
pygame.init()
screen = pygame.display.set_mode((1200,800))
bullets = Group()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
fire_bullet(bullets,screen)
screen.fill((230,230,230))
# 绘制编组中的每个子弹
for bullet in bullets.sprites():
bullet.draw_bullet()
update_bullets(bullets)
pygame.display.flip()