陨石动效完成!从零开始用Python编程制作飞机大战游戏 P07
2023-01-28 17:24 作者:xiaotiaotiao2011 | 我要投稿

import pygame # 导入pygame import random # 导入random import os #bug:石头无法旋转 # 设置常量,常量就是在python中不变的量 FPS = 60 # FPS是指帧数,指在一秒内运行多少次 WIDTH = 500 HEIGHT = 600 WHITE = (255, 255, 255) # 这是一个RGB,R表示red,G表示green,B表示blue,数值是一个元组,必须带括号 GREEN = (0, 255, 0) RED = (225, 0, 0) YELLOW = (255, 255, 0) BLACK = (0, 0, 0) # 初始化pygame pygame.init() pygame.mixer.init() screen = pygame.display.set_mode( (WIDTH, HEIGHT)) # 创建一个窗口,宽为WIDTH常量,高为HEIGHT常量 clock = pygame.time.Clock() # 设置帧数 background_img=pygame.image.load(os.path.join("img", "background.png")).convert() player_img=pygame.image.load(os.path.join("img","player.png")).convert() rock_img=pygame.image.load(os.path.join("img","rock.png")).convert() bullet_img=pygame.image.load(os.path.join("img","bullet.png")).convert() pygame.display.set_caption('plane_war') # 窗口标题为字符串“plane_war”,引号是英文 hoot_sound=pygame.mixer.Sound(os.path.join("sound","shoot.wav")) expl_sounds=[pygame.mixer.Sound(os.path.join("sound","expl0.wav")), pygame.mixer.Sound(os.path.join("sound","expl1.wav"))] pygame.mixer.music.load(os.path.join("sound","background.ogg")) pygame.mixer.music.set_volume(0.3) class Player(pygame.sprite.Sprite): # 设置一个类,继承父类pygame.sprite.Sprite def __init__(self): # 设置初始化内容 pygame.sprite.Sprite.__init__(self) self.image = pygame.transform.scale(player_img,(50,40)) self.image.set_colorkey((BLACK)) self.rect = self.image.get_rect() # 获取长方形的矩形位置 self.rect.centerx = WIDTH/2 # 设置长方形中心在x轴的中心 self.rect.bottom = HEIGHT-20 # 设置长方形的底部在y轴的580位置 self.speedx = 8 # 设置每次移动的像素(px) def update(self): # 定义update函数 key_pressed = pygame.key.get_pressed() # 获取键盘状态 # 判断键盘状态 if key_pressed[pygame.K_RIGHT]: # 判断键盘右键是否按下 self.rect.x += self.speedx if key_pressed[pygame.K_LEFT]: # 判断键盘左键是否按下 self.rect.x -= self.speedx # 判断位置 if self.rect.right > WIDTH: # 如果右边的位置大于宽 self.rect.right = WIDTH if self.rect.left < 0: # 如果左边小于宽 self.rect.left = 0 def shoot(self): bullet = Bullet(self.rect.centerx, self.rect.centery) all_sprites.add(bullet) bullets.add(bullet) hoot_sound.play( ) def k_shoot(self): for i in range(100): 偏差 = random.randrange(-250, 250) bullet = Bullet(self.rect.centerx+偏差, self.rect.centery) all_sprites.add(bullet) bullets.add(bullet) hoot_sound.play( ) class Rock(pygame.sprite.Sprite): # 设置一个类,继承父类pygame.sprite.Sprite def __init__(self): # 设置初始化内容 pygame.sprite.Sprite.__init__(self) self.image_origin=rock_img self.image_origin.set_colorkey(BLACK) self.image=self.image_origin.copy() self.big_or_small=random.randint(30,70) self.image = pygame.transform.scale(rock_img, (self.big_or_small, self.big_or_small)) self.image.set_colorkey((BLACK)) self.rect = self.image.get_rect() # 获取长方形的矩形位置 # 随机生成位置和速度 try: self.rect.x = random.randint(0, WIDTH-self.rect.x) self.rect.y = random.randint(-40, -10) self.speedy = random.randint(2, 10) # 设置每次移动的像素(px) self.speedx = random.randint(-3, 3) except: self.rect.x = random.randint(0, 470) self.rect.y = -10 self.speedy = random.randint(2, 10) self.speedx = random.randint(-3, 3) self.total_degree=0 self.rot_degree=random.randrange(-3,3) def rotate(self): self.total_degree+=3 self.total_degree%=360 self.image=pygame.transform.rotate(self.image_origin,self.rot_degree) center=self.rect.center self.rect=self.image.get_rect() self.rect.center=center def update(self): # 定义update函数 self.rect.y += self.speedy # y轴增加 self.rect.x += self.speedx # x轴增加 if self.rect.top > HEIGHT or self.rect.left > WIDTH or self.rect.right < 0: try: self.rect.x = random.randint(0, WIDTH-self.rect.x) self.rect.y = random.randint(-40, -10) self.speedy = random.randint(2, 10) # 设置每次移动的像素(px) self.speedx = random.randint(-3, 3) except: self.rect.x = random.randint(0, 470) self.rect.y = -10 self.speedy = random.randint(2, 10) self.speedx = random.randint(-3, 3) class Bullet(pygame.sprite.Sprite): # 设置一个类,继承父类pygame.sprite.Sprite def __init__(self, x, y): # 设置初始化内容 pygame.sprite.Sprite.__init__(self) self.image =pygame.transform.scale(bullet_img,(5,20)) # 创建一个宽10,高20的长方形,数值为数组 self.image.set_colorkey(BLACK) self.rect = self.image.get_rect() self.rect.x = x self.rect.y = y self.speedy = -10 # 速度-10 def update(self): # 定义update函数 self.rect.y += self.speedy # y轴增加 if self.rect.bottom < 0: self.kill() # 隐藏 all_sprites = pygame.sprite.Group() # 创建一个所有精灵列表 rocks = pygame.sprite.Group() bullets = pygame.sprite.Group() player = Player() all_sprites.add(player) pygame.mixer.music.play(-1) for i in range(8): rock = Rock() all_sprites.add(rock) rocks.add(rock) running = True # 设running为布尔值True,表示真 # 主循环 while running: clock.tick(FPS) # 设置帧数为60/s for event in pygame.event.get(): # 判断窗口状态 if event.type == pygame.QUIT: # 检测窗口是否关闭 running = False # 如果是,将running设为False,停止判断 elif event.type == pygame.KEYDOWN: if event.key == pygame.K_SPACE: player.shoot() if event.key==pygame.K_k: player.k_shoot() # 更新游戏 all_sprites.update() hits_rockandbullet = pygame.sprite.groupcollide( rocks, bullets, True, True) # 检测子弹与陨石是否碰撞 for hit in hits_rockandbullet: # 打中一个再生成一个 random.choice(expl_sounds).play() r = Rock() all_sprites.add(r) rocks.add(r) # 显示画面 hits_rockandbullet=pygame.sprite.spritecollide(player,rocks,False) if hits_rockandbullet: running=False#True screen.fill(BLACK) screen.blit(background_img,(0,0)) all_sprites.draw(screen) pygame.display.update() # 窗口刷新 pygame.quit()