【有书共读05】python编程--从入门到实践12
武装飞船
现在我开始制作一个小型项目了!!!(还是参考书本o_o ....)
一、准备工作
安装Pygame模块
推荐使用pip方式安装
windows环境下可以这样安装(其他环境大家找度娘……
pip install Pygame
二、创建Pygame窗口以及响应用户输入
alien_invasion.py
import sys import pygame def rungame(): #初始化游戏,并创建一个游戏变量 pygame.init() screen = pygame.display.set_mode((1200,800)) pygame.display.set_caption("Alien Invasion") #设置背景色 bg_color = (230,230,230) #开始游戏的主循环 while True: #监视键盘和鼠标事件 for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() #每次循环时都重绘屏幕 screen.fill(bg_color) #让最近回值的屏幕可见 pygame.display.flip() pass rungame()
pygame.init():是初始化背景设置,让Pygame可以正确的工作
screen = pygame.display.set_mode((1200,800)):通过调用 pygame.display.set_mode()来创建一个名为screen的显示窗口,且这个窗口的宽为1200像素,高为800像素
对象screen是一个surface。在Pygame中,surface是屏幕的一部分,用于显示游戏元素。在该游戏中, 每个元素(比如外星人和飞船)都是一个surface。而pygame.display.set_mode()返回的surface表示整个游戏窗口。我们激活游戏的动画循环后,每经过一次循环都将自动重绘这个surface。
游戏是由while循环控制,其中包括一个事件循环以及管理屏幕更新的代码。事件是用户玩游戏的执行的操作,如按键或是移动鼠标。为了让程序响应事件,我们编写了一个时间循环来侦听事件,并根据发生的时间来执行相应的任务。
pygame.event.get():通过此方法来访问Pygame监测到的事件。
pygame.display.flip():命令Pygame让最近绘制的屏幕可见。在这里,它在每次执行while循环时都绘制一个空屏幕,并擦去旧屏幕,使得只有新屏幕可见。在我们移动游戏元素时,pygame.display.flip()将不断更新屏幕,以显示元素的新位置,并在原来的位置隐藏元素,从而营造平滑移动的效果。
bg_color = (230,230,230):在Pygame中,颜色以RGB值指定的。如果不太清楚,可以问度娘!
screen.fill(bg_color):我们调用该方法,用背景色填充屏幕,这个方法只接受一个参数:一种RGB颜色
三、创建设置类
每次给游戏添加新功能时,通常需要添加一些新的设置。所以我们需要单独一个模块存贮这些信息。
我将设置信息存放在名为settings的模块中。
settings.py
class Settings(): """存储《外星人入侵》所有设置的类""" def _init_(self): '''初始化游戏的设置''' #屏幕设置 self.screen_width = 1200 self.screen_height = 700 self.bg_color = (230,230,230)
因为引入了Settings类,相应地,我们要将aliens_invasion.py做一些更改
import sys import pygame from settings import Settings def rungame(): #初始化游戏,并创建一个游戏变量 pygame.init() screen = pygame.display.set_mode((Settings.screen_width,Settings.screen_height)) pygame.display.set_caption("Alien Invasion") #设置背景色 bg_color = Settings.bg_color #开始游戏的主循环 while True: #监视键盘和鼠标事件 for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() #每次循环时都重绘屏幕 screen.fill(bg_color) #让最近回值的屏幕可见 pygame.display.flip() pass rungame()
在主程序文件中为我们导入Settings类,调用pygame.init(),再创建一个Settings实例,并将其存储在变量ai_settings中。创建屏幕时,使用了ai_settings的属性,填充颜色时也使用了ai_settings的属性。
三、创建ship类
ship.py
import pygame class ship(object): """初始化飞船并获取其外接图形""" def __init__(self, screen): self.screen = screen #加载飞船图像并获取其外接图形 self.image = pygame.image.load('images/ship.bmp') 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 def blitme(self): """在指定区域绘制飞船""" self.screen.blit(self.image, self.rect) pass
首先,先引用了pygame模块
init():此方法接收两个参数self和screen,其中后者指定了要将飞船绘制到什么地方。为加载图像,调用了pygame.image.load(),此函数返回一个表示飞船的surface,我们将这个surface存储到self.image中。
get_rect():获取相应surface的属性rect。(rect是矩形的简写)
处理rect对象时,可使用矩形四角和中心的x,y坐标。可通过设置这些值来指定矩形的位置。
要将游戏元素居中,可设置相应rect对象的属性center、centerx或centery。要将游戏元素与屏幕边缘对齐,可使用属性top、bottom、left或right;要调整游戏元素水平或垂直位置,可使用属性x和y,它们分别是相应矩形左上角的x和y坐标。
四、在屏幕上绘制飞船
下面来更新alien_invasion.py,使其创建一艘飞船,并调用其方法blitme();
alien_invasion.py
import sys import pygame from settings import Settings from ship import Ship def rungame(): #初始化游戏,并创建一个游戏变量 pygame.init() ai_settings = Settings() screen = pygame.display.set_mode((ai_settings.screen_width, ai_settings.screen_height)) pygame.display.set_caption("Alien Invasion") #创建一艘飞船 ship = Ship(screen) #设置背景色 bg_color = ai_settings.bg_color #开始游戏的主循环 while True: #监视键盘和鼠标事件 for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() #每次循环时都重绘屏幕 screen.fill(bg_color) ship.blitme() #让最近回值的屏幕可见 pygame.display.flip() pass rungame()
我们导入Ship类,并在创建屏幕后创建一个名为ship的Ship实例。必须在主循环前面创建该实例 ,以免每次循环时都创建一艘飞船。填充背景后,我们调用ship.blitme()将飞船绘制到屏幕上,确保它出现在背景前面。
运行后的结果如图所示
ship.bmp
此小项目的目的只是让大家熟悉一下用python绘制窗口的基本操作,远远没有达到制作小游戏的程度。饭要一口一口地吃,之后再讲解外星人入侵的加强版、进阶版!这个版本就叫基础版吧→_→
#Python#