天天看點

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就好了