学习如何开发《外星人入侵》小游戏_3

  • Post author:
  • Post category:其他


作者:雷蕾

在经过创建Pygame窗口及响应用户输入、设置背景颜色和创建存储所有新功能的类后,我们要在《外星人入侵》小游戏中添加飞船图像啦~

在进行添加飞船图像时,我们要注意将飞船图像保存在与主程序文件的同一文件夹下,也可在与主程序文件的同一文件夹下新建一个名为images的文件夹,用以保存飞船图像。

选择用于表示飞船的图像后,接下来的任务就是将飞船图像能够成功显示在屏幕上。

import pygame
class Ship:
    '''管理飞船的类'''
    def __init__(self,ai_game):
        '''初始化飞船并设置其初始位置'''
        self.screen=ai_game.screen
        self.screen_rect=ai_game.screen.get_rect()
        #加载飞船图像并获取其外接矩形
        self.image=pygame.image.load('images/ship.bmp')
        self.rect=self.image.get_rect()
        #对于每艘新飞船,都将其放在屏幕底部的中央
        self.rect.midbottom=self.screen_rect.midbottom
    def blitme(self):
        '''在指定位置绘制飞船'''
        self.screen.blit(self.image,self.rect)

在这个示例中,定义类Ship之前,我们先导入Pygame模块。

在类Ship中的方法__init__()接受了两个参数(形参):引用self和指向主程序文件中类AlienInvasion实例的引用(让Ship能够访问AlienInvasion中定义的所有资源)

代码行 self.screen=ai_game.screen中将屏幕赋给了Ship的一个属性,以便在这个类的所有方法能够轻松访问。

代码行self.screen_rect=ai_game.screen.get_rect()使用方法get_rect()访问屏幕的属性rect,并将其赋给了self.screen_rect,这是能够让我们知道飞船放在屏幕中的正确位置。


rect对象

是Pygame能够像

处理矩形

一样处理所有的游戏元素,即使它的形状并不是矩形的,在示例中Pygame将游戏元素视为矩形。

代码行self.image=pygame.image.load(‘images/ship.bmp’)是调用pygame.image.load()加载图像,将飞船图像位置传递给它,图像位置位于文件夹images下,文件名为’ship.bmp’。该函数返回一个表示飞船的surface,在示例中将surface赋给变量 self.image。

代码行 self.rect=self.image.get_rect()是加载图像之后,使用get_rect()获取相应surface的属性rect,以便以后能够用它来指定飞船的位置。

代码行 self.rect.midbottom=self.screen_rect.midbottom是将飞船图像放在屏幕底部的中央,将 self.rect.midbottom设置为表示屏幕的矩形的属性midbottom。

在Pygame中使用rect属性来放置飞船图像,在要指定矩形位置时,如果要让游戏元素居中,可设置相应rect对象的属性:center、centerx、centery。

要让游戏元素与屏幕边缘对齐,可设置相应rect对象的属性:top、bottom、left、right。

除此之外还有一些组合属性:midbottom、midtop、midleft和midright。

代码行 def blitme(self)是定义了方法blitme(),该方法可将图像绘制到self.rect指定的位置。

由于添加了要添加图像飞船的类Ship,并且要在主程序文件中导入类Ship,我们对之前的主程序文件进行更新:

import sys
import pygame
from settings import Settings
from ship import Ship
class AlienInvasion:
    '''管理资源和行为的类'''
    def __init__(self):
        '''初始化游戏并创建游戏资源'''
        pygame.init()
        self.settings=Settings()
        self.screen=pygame.display.set_mode(
            (self.settings.screen_width,self.settings.screen_height))
        pygame.display.set_caption("AlienInvasion")
        self.ship=Ship(self)
    def run_game(self):
        '''开始游戏的主循环'''
        while True:
            #监视键盘和鼠标
            for event in pygame.event.get():
                if event.type==pygame.QUIT:
                    sys.exit()
            #每次循环时都重绘屏幕
            self.screen.fill(self.settings.bg_color )
            self.ship.blitme()
            #让最近绘制的屏幕可见
            pygame.display.flip()
if __name__=='__main__':
    #创建游戏实例并运行游戏
    ai=AlienInvasion()
    ai.run_game()

添加的代码行 self.ship=Ship(self)是创建了一个Ship实例,当调用Ship()时,必须提供一个参数:一个 AlienInvasion实例。在示例中,self指向的是当前 AlienInvasion实例,这个参数让Ship能够访问游戏资源,将实例Ship赋给了 self.ship。

添加的代码行self.ship.blitme()是调用ship.blitme()将飞船绘制到屏幕上,并确保它出现在背景前面。

运行主程序文件:

在这里插入图片描述

可以看到飞船图像位于屏幕底部中央。



版权声明:本文为gufe_hfding原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。