陨石动效完成!从零开始用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()

