pygame入門小遊戲(外星人入侵(6) 外星飛船來啦!【二】)
阿新 • • 發佈:2019-01-05
看了課本和幾個例項,發現還是使用精靈中的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)
執行程式,如下
下節實現敵機的移動