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