Python编程之外星人入侵(二)

今天继续分享一下外星人入侵的小游戏编程。在(一)中我们分享了玩这个游戏所需要了解的按键功能,也就是玩家需要了解的信息,也是我们所说的操纵界面。今天我们来看一看这个操纵界面下面所隐藏的一些实质性内容。
这款游戏中的是那个主要元素是飞船,外星人和飞船发射的子弹,今天主要分享这三个元素的设置,分别对应下面三个函数。

首先是飞船的设置ship.py。
import pygame,from pygame.sprite import Sprite,Pygame 是一组用来开发游戏软件的 Python 程序模块,sprite是pygame自带的一个精灵(显示图像的对象的叫法)。ship.py主要是来创建ship类,包含4个方法__init__,update(更新飞船位置),blitme(绘制飞船),center_ship(飞船居中)。
ship类中导入Sprite,ship继承Sprite, super(Ship, self).init()将父类(Sprite)和子类(Ship)联系起来,父类也称为超类。self.screen = screen ,self.ai_settings = ai_settings将形参的值存储在属性中便于调用。
#加载飞船图像并获取其外接矩形
self.image = pygame.image.load(‘images/ship.png’)
self.rect = self.image.get_rect()
self.screen_rect = screen.get_rect()
这三行加载飞船图片,注意图片放在pygame当前工作文件夹下;后两行分别获得图像和屏幕的外接矩形并将它们存储在self中。
#每艘飞船放在屏幕底部中央,这里不再赘述,是通过图像外接矩形和屏幕外接矩形相对位置比较确定的
#飞船属性center中存储小数值,为了使飞船能够在任意位置停留
#移动标志,预先设置逻辑值,游戏过程中实时改变逻辑值实现飞船左右移动
def update(self)是对飞船位置的更新,其中应用if语句比较飞船此时的位置与屏幕边界的位置,当飞船还在可移动范围内时移动飞船
最后两个方法注释中给的很明白。
接着是外星人的设置alien.py。
一共4个方法,第一个方法def__init__是对外星人的初步属性设定,包括加载外星人的图片、设置图片的位置。check_edges方法判断外星人是否超出屏幕的范围并返回逻辑值。update和blitme同ship类中的一样,更新外星人位置和显示外星人。
最后是子弹的设置bullet.py。
一共3个方法。__init__中对子弹属性初步设置,其中通过比较子弹位置和飞船位置确定子弹的初始位置。update和draw分别更新子弹位置和绘制子弹。
通过以上的简单分析可以看出对于游戏中的对象的类大体相同,基本都由初步设置方法,更新方法和绘制方法几个大方法组成。

ship.py

import pygame
from pygame.sprite import Sprite

class Ship(Sprite):

    def __init__(self, ai_settings, screen):
        """初始化飞船"""
        super(Ship, self).__init__()
        self.screen = screen
        self.ai_settings = ai_settings

        # 加载飞船图像并获取其外接矩形
        self.image = pygame.image.load('images/ship.png')
        self.rect = self.image.get_rect()
        self.screen_rect = screen.get_rect()

        # 每艘飞船放在屏幕底部中央
        self.rect.centerx = self.screen_rect.centerx
        self.rect.bottom = self.screen_rect.bottom

        #飞船属性center中存储小数值
        self.center = float(self.rect.centerx)

        #移动标志
        self.moving_right = False
        self.moving_left = False

    def update(self):
         """根据移动标志调整飞船位置"""
         if self.moving_right and self.rect.right < self.screen_rect.right:
             self.center += self.ai_settings.ship_speed_factor

         if self.moving_left and self.rect.left > 0:
             self.center -= self.ai_settings.ship_speed_factor
         #根据self_center更新rect对象
         self.rect.centerx = self.center

    def blitme(self):
        """在指定位置绘制飞船"""
        self.screen.blit(self.image, self.rect)

    def center_ship(self):
        """让飞船在屏幕上居中"""
        self.center = self.screen_rect.centerx

alien.py

import pygame
from pygame.sprite import Sprite

class Alien(Sprite):
    """表示单个外星人的类"""

    def __init__(self, ai_settings, screen):
        """初始化外星人并设置其初始位置"""
        super(Alien, self).__init__()
        self.screen = screen
        self.ai_settings = ai_settings

        #加载外星人图像并设置其rect属性
        self.image = pygame.image.load('images/alien.png')
        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 check_edges(self):
        """如果外星人位于屏幕边缘就返回 True"""
        screen_rect = self.screen.get_rect()
        if self.rect.right >= screen_rect.right:
            return True
        elif self.rect.left < 0:
            return True

    def update(self):
        """向左/右移动外星人"""
        self.x += self.ai_settings.alien_speed_factor * self.ai_settings.fleet_direction
        self.rect.x = self.x

    def blitme(self):
        """指定位置绘制外星人"""
        self.screen.blit(self.image, self.rect)

bullet.py

import pygame
from pygame.sprite import Sprite

class Bullet(Sprite):
    """对飞船发射的子弹管理的类"""

    def __init__(self, ai_settings, screen, ship):
        """在飞船所处的位置创建一个子弹对象"""
        super(Bullet, self).__init__()
        self.screen = screen

        #在(0,0)处创建一个子弹矩形再设置正确的位置
        self.rect = pygame.Rect(0, 0, ai_settings.bullet_width, ai_settings.bullet_height)
        self.rect.centerx = ship.rect.centerx
        self.rect.top = ship.rect.top

        #存储用小数表示的子弹位置
        self.y = float(self.rect.y)

        self.color = ai_settings.bullet_color
        self.speed_factor = ai_settings.bullet_speed_factor

    def update(self):
        """向上移动子弹"""
        #更新表示子弹位置的小数值
        self.y -= self.speed_factor
        #更新子弹rect的位置
        self.rect.y = self.y

    def draw_bullet(self):
        """屏幕上绘制子弹"""
        pygame.draw.rect(self.screen, self.color, self.rect)

你可能感兴趣的:(Python)