1. 程式人生 > >pygame入門小遊戲(外星人入侵(6) 外星飛船來啦!【二】)

pygame入門小遊戲(外星人入侵(6) 外星飛船來啦!【二】)

看了課本和幾個例項,發現還是使用精靈中的groupcollide()來檢測碰撞比較簡單,所以我們接著第五節,把外星飛船也使用精靈來繪製,(上節因為並沒有使用Sprite,感覺實現擊落飛船有點困難,所以咱們接著5,繼續)

首先建立一個儲存外星飛船的類Alien()

import pygame
from pygame.sprite import Sprite
class Alien(Sprite):
    def __init__(self, screen):
        super().__init__()
        self.screen = screen
        #載入影象
self.image = pygame.image.load(r'images\alien.bmp') self.rect = self.image.get_rect() #每個敵機出現在螢幕左上角附近 self.rect.x = self.rect.width self.rect.y = self.rect.height #儲存敵機位置(後面會使用) self.x = float(self.rect.x) #在指定位置畫出alien def blit_alien
(self):
self.screen.blit(self.image, self.rect)

主程式中需要建立一個外星人
alien = Alien(screen)

還要在update_screen()中呼叫blit_alien 才能讓它出現在螢幕上

def update_screen(my_setting, screen, ship, bullets, alien):
    ...............................
    alien.blit_alien
    .....................

執行程式,如圖
這裡寫圖片描述
一架孤獨的敵機出現在螢幕上, 何不多新增些外星飛船

接下來建立一外星人群(可在g_fun.py中建立)


from alien import Alien

......................
#建立外星人群
def alien_fleet(screen, aliens):

    alien = Alien(screen)
    alien_width = alien.rect.width
    #計算一行可以容下多少外星飛船(可以自己調節引數來確定合適的數量)
    available_space_x = 800 - 1.2 * alien_width
    number_aliens_x = int(available_space_x / (1.2 * alien_width))


    for alien_number in range(number_aliens_x):

        alien = Alien(screen)
        alien.x = alien_width + 1.2 * alien_width * alien_number
        alien.rect.x = alien.x
        aliens.add(alien)

對了, 主程式中也需要少許改動

alien = Alien(screen)——>aliens = Group()
ck.alien_fleet(screen, aliens)[呼叫此函式]

alien.blit_alien——> aliens.draw(screen)
draw()用來繪製編組中的所有外星人

效果如下
這裡寫圖片描述

為了實現多行外星飛船的出現,我們重構下alien_fleet()

def get_number_aliens_x(alien_width):
    available_space_x = 800 - 1.2 * alien_width
    number_aliens_x = int(available_space_x / (1.2 * alien_width))
    return number_aliens_x
def create_alien(screen, aliens, alien_number):
    alien = Alien(screen)
    alien_width = alien.rect.width
    alien.x = alien_width + 1.2 * alien_width * alien_number
    alien.rect.x = alien.x
    aliens.add(alien)
def alien_fleet(screen, aliens):
    alien = Alien(screen)
    number_aliens_x = get_number_aliens_x(alien.rect.width)
    for alien_number in range(number_aliens_x):
        create_alien(screen, aliens, alien_number)

接下來要計算螢幕可以容納多少行敵機,思想與每行能容納多少敵機類似
更新後的程式

#計算容納多少行敵機
def get_number_rows(ship_height, alien_height):
    available_space_y = (600 - (3 * alien_height) - ship_height)
    number_rows = int((available_space_y) / (2 * alien_height))
    return number_rows
def get_number_aliens_x(alien_width):
    available_space_x = 800 - 1.2 * alien_width
    number_aliens_x = int(available_space_x / (1.2 * alien_width))
    return number_aliens_x
def create_alien(screen, aliens, alien_number, row_number):
    alien = Alien(screen)
    alien_width = alien.rect.width
    alien.x = alien_width + 1.2 * alien_width * alien_number
    alien.rect.x = alien.x
    alien.rect.y = alien.rect.height + 2 * alien.rect.height * row_number
    aliens.add(alien)
def alien_fleet(screen, aliens, ship):
    alien = Alien(screen)
    number_aliens_x = get_number_aliens_x(alien.rect.width)
    number_rows = get_number_rows(ship.rect.height,
        alien.rect.height)
    for row_number in range(number_rows):
        for alien_number in range(number_aliens_x):
            create_alien(screen, aliens, alien_number, row_number)

由於在alien_fleet()中使用了ship,我們在主程式中呼叫alien_fleet()時需要傳遞引數ship
ck.alien_fleet(screen, aliens, ship)

執行程式,如下
這裡寫圖片描述

下節實現敵機的移動