python实战游戏开发——创建一群外星人

1、创建alien类

#alien.py
import pygame
from pygame.sprite import Sprite
class Alien(Sprite):
      def __init__(self,ai_settings,screen):
          super().__init__()
          self.screen=screen
          self.ai_settings=ai_settings
          
          self.image=pygame.image.load('image/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)

      def blitme(self):
          self.screen.blit(self.image,self.rect)

2、创建alien实例

#alien_invasion.py

# -*- coding: utf-8 -*-
from settings import Settings
from ship import Ship
import pygame
from pygame.sprite import Group
from alien import Alien
import game_functions as gf

def run_game():
    #初始化游戏并创建一个屏幕对象
    pygame.init()
    ai_settings=Settings()
    screen=pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))
    pygame.display.set_caption("Alien Invasion")

    #设置游戏背景色
    bg_color=(230,230,230)
   
    #创建一艘飞船
    ship=Ship(ai_settings,screen)

    #创建一个用于存储子弹的编组
    bullets=Group()

    aliens=Group()

    #创建外星人群
    gf.create_fleet(ai_settings,screen,ship,aliens)


    #开始游戏主循环
    while True:
          gf.check_events(ai_settings,screen,ship,bullets)
          ship.update()
          gf.update_bullets(bullets)
          gf.update_screen(ai_settings,screen,ship,aliens,bullets)

run_game()

#game_functions.py

# -*- coding: utf-8 -*-
import sys
import pygame
from bullet import Bullet
from alien import Alien
def check_keydown_events(event,ai_settings,screen,ship,bullets):
    #响应按键
    if event.key==pygame.K_RIGHT:
       ship.moving_right=True
    elif event.key==pygame.K_LEFT:
         ship.moving_left=True
    elif event.key==pygame.K_SPACE:
         fire_bullet(ai_settings,screen,ship,bullets)
    elif event.key==pygame.K_q:
         sys.exit()

def fire_bullet(ai_settings,screen,ship,bullets):
    if len(bullets)             #创建一颗新子弹,并将其加入到编组bullets中
            new_bullet=Bullet(ai_settings,screen,ship)
            bullets.add(new_bullet)


def check_keyup_events(event,ship):
    #响应松开
    if event.key==pygame.K_RIGHT:
       ship.moving_right=False
    elif event.key==pygame.K_LEFT:
         ship.moving_left=False


def check_events(ai_settings,screen,ship,bullets):
    #"""监视键盘和鼠标事件"""
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
           sys.exit()
        elif event.type==pygame.KEYDOWN:
             check_keydown_events(event,ai_settings,screen,ship,bullets)
        elif event.type==pygame.KEYUP:
             check_keyup_events(event,ship)


def update_screen(ai_settings,screen,ship,aliens,bullets):
    #"""更新屏幕上的图像,并切换到新屏幕"""
    #每次循环时都会重绘屏幕
    screen.fill(ai_settings.bg_color)
    ship.blitme()
    aliens.draw(screen)

  #对编组调用draw()时,pygame自动绘制编组的每个元素,绘制位置由元素的属性rect决定。

   在这里,aliens.draw(screen)在屏幕上绘制编组中的每个外星人

    #在飞船和所有外星人后面重绘所有子弹
    for bullet in bullets.sprites():
        bullet.draw_bullet()

    #让最近绘制的屏幕可见
    pygame.display.flip()


def update_bullets(bullets):
    #"""更新子弹的位置,并删除已消失的子弹
    bullets.update()
    #删除已消失的子弹
    for bullet in bullets.copy():   #遍历副本
        if bullet.rect.bottom<=0:
           bullets.remove(bullet)


def get_number_aliens_x(ai_settings,alien_width):
    #计算每行可容纳多少个外星人
    available_space_x=ai_settings.screen_width-2*alien_width
    number_aliens_x=int(available_space_x/(2*alien_width))
    return number_aliens_x


def get_number_rows(ai_settings,ship_height,alien_height):
    #计算屏幕可容纳多少行外星人
    avaliable_space_y=(ai_settings.screen_height-3*alien_height-ship_height)
    number_rows=int(avaliable_space_y/(2*alien_height))
    return number_rows


def create_alien(ai_settings,screen,aliens,alien_number,row_number):
    alien=Alien(ai_settings,screen)
    alien_width=alien.rect.width
    alien_height=alien.rect.height
    alien.rect.x=alien_width+2*alien_width*alien_number
    alien.rect.y=alien_height+2*alien_height*row_number
    aliens.add(alien)

def create_fleet(ai_settings,screen,ship,aliens):
    alien=Alien(ai_settings,screen)
    number_aliens_x=get_number_aliens_x(ai_settings,alien.rect.width)
    number_rows=get_number_rows(ai_settings,ship.rect.height,alien.rect.height)

    #创建外星人群
    for row_number in range(number_rows):
        for alien_number in range(number_aliens_x):
            create_alien(ai_settings,screen,aliens,alien_number,row_number)


你可能感兴趣的:(python实战游戏开发)