天天看点

Pygame飞机大战(三)——添加背景图片和背景音乐

有了前面两章的学习,相信大家对pygame已经有了一个初步的了解,接下来我们就要开始一步一步完善我们的游戏了;

添加背景图片应该没有什么难度,只需要将图片加载进来,然后再飞机绘制之前将背景图片绘制好就行了,这里不要问为什么要先绘制背景图片,这就好比写错字了,需要用修正液修改,肯定是先涂修正液在重新写吧:

import pygame
import sys
from pygame.locals import *

pygame.init()
screen_size = width,height = 480,700
screen = pygame.display.set_mode(screen_size)
pygame.display.set_caption('飞机大战')
background = pygame.image.load('./images/background.png').convert()
# 惊喜的发现,这里图片加载之后有一个convert()方法,这个方法是用来做什么的呢?
# 这个是用来将图片转换为像素格式,这样在进行图片刷新的时候,程序的效率会更高

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()

    screen.blit(background,(0,0))
    pygame.display.flip()
           

pygame中的pygame.mixer就是专门处理声音的模块,可以处理wav、mp3、wma和ogg格式的音频文件;

同样的,我们先来分析一下播放音乐的过程:

  1. 首先我们要使用pygame.mixer模块,需要先初始化哈

    pygame.mixer.init()

  2. 需要播放,我们肯定需要将音乐文件加载到项目里面来,第二部就是加载:

     第一种加载音乐的方式,这种方式一般是用来加载一些比较短的声音,比如一些音效

    voice = pygame.mixer.Sound('./sound/get_bomb.wav')

    第二种加载的就是像音乐这样,文件比较大,时长比较长的音乐,比如背景音乐

    pygame.mixer.music.load('./sound/game_music.ogg')

  3. 最后就是播放了

    # Sound对象我们用play()方法播放

    voice.play()

    # 用music模块加载进来的音乐,我们用music.play()方法播放音乐

    pygame.mixer.music.play()

接下来,我们来试下怎么加载背景音乐并播放吧:

import pygame
import sys
from random import *
from pygame.locals import *

class PlaneClass(pygame.sprite.Sprite):
    def __init__(self, img, position, speed):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load(img)
        self.rect = self.image.get_rect()
        self.rect.left, self.rect.top = position
        self.speed = speed

    def move(self):
        self.rect = self.rect.move(self.speed)
        if self.rect.left < 0 or self.rect.right > width:
            self.speed[0] = -self.speed[0]
        if self.rect.top < 0 or self.rect.bottom > height:
            self.speed[1] = -self.speed[1]

def collide_check(group):
    for plane in group:
        plane.move()
    for plane in group:
        group.remove(plane)
        if pygame.sprite.spritecollide(plane, group, False, pygame.sprite.collide_mask):
            plane.speed[0] = -plane.speed[0]
            plane.speed[1] = -plane.speed[1]
            collide_voice = pygame.mixer.Sound('./sound/get_bomb.wav')    # 添加飞机碰撞之后产生的音效
            collide_voice.play()
        group.add(plane)
        screen.blit(plane.image, plane.rect)

pygame.init()
screen_size = width, height = 480, 700
screen = pygame.display.set_mode(screen_size)
pygame.display.set_caption('飞机大战')
bg = pygame.image.load('./images/background.png').convert()    # 加载背景图片

pygame.mixer.music.load('./sound/game_music.ogg')    # 加载背景音乐
pygame.mixer.music.set_volume(0.5)                   # 设置音量
pygame.mixer.music.play(-1)                          # 播放背景音乐

imgs = ['./images/me1.png', './images/enemy1.png', './images/enemy2.png']
group = pygame.sprite.Group()

for i in range(3):
    img_position = [i * 200, 10]
    speed = [choice([-2, 2]), choice([-2, 2])]
    airplane = PlaneClass(imgs[i], img_position, speed)
    group.add(airplane)

clock = pygame.time.Clock()

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()

    screen.blit(bg,(0,0))    # 绘制背景图片
    collide_check(group)
    pygame.display.flip()
    clock.tick(60)
           

这里有两个参数需要注意一下:

  1. pygame.mixer.music.set_volume(0.5) 这里设置音量的0.5,就是百分之五十的意思,就是当前系统音量的百分之五十
  2. pygame.mixer.music.play(-1) 这里的-1代表播放的次数,-1就是无限循环下去,反之,如果想要播放一遍就停止,那么只需要将-1改为1就好了