【第十一周】Python的项目笔记01
目录
- 摘要
- Abstract
- 一、外星人入侵
- 总结
摘要
本周主要是对项目外星人入侵的一个简单的了解,以及一些前期工作,首先需要安装pygame,并且创建了窗口以及用户输入的响应程序,之后控制了帧率以及设置了背景色,在之后,将会对代码进行优化,将一些背景、窗口的参数单独优化成一个大类,这样既简化了程序,易于他人看懂,又能在需要修改的时候,只需修改大类中的参数即可达到全局修改的效果
Abstract
This week I started learning about the Alien Invasion project and did some preparation work. First I installed pygame and created a game window that can respond to user input, then I learned to control the frame rate and set background color. Next I will optimize the code by putting background and window settings into a separate class, which will make the program simpler and easier to understand, and when I need to make changes, I just have to modify the parameters in that class to update the whole program.
一、外星人入侵
这是Python开发式项目的第一个项目,名叫外星人入侵,将使用pygame包开发一款2D游戏,他在玩家每消灭一个向下移动的外星舰队后,让玩家提高一个等级。等级越高,游戏节奏越快,难度越大。
1、 规划项目
在开发大型项目时,先制定好规划再动手编写代码很重要。规划可确保不偏离轨道,提高项目成功的可能性。
下面来为游戏《外星人入侵》编写大概的玩法说明,其中虽然没有涵盖这款游戏的所有细节,但能让你清楚地直到该如何动手开发它:
在游戏《外星人入侵》种,玩家控制着一艘最初出现在屏幕底部中央的武装飞船。玩家可以使用方向
键左右移动飞船,使用空格进行射击。当游戏开始时,一个外星舰队出现在天空种,并向屏幕下方移
动。玩家的任务是消灭这些外星人。玩家将外星人消灭干净后,将出现一个新的外星舰队,其移动速
度更块。只要有外星人撞到玩家的飞船或者到达屏幕下边缘,玩家损失一艘飞船。玩家损失三艘飞船后,游戏结束。
2、安装Pygame
开始写程序前,需要安装Pygame。这里像之前安装pytest那样安装Pyagme——使用pip。
通过如下终端命令即可安装Pygame:
python -m pip install --user pygame
2.1、创建Pygame窗口及相应用户输入
下面创建一个表示游戏的类,以创建空的Pygame窗口。在文本编辑器中新建一个文件,再在其中输入如下代码
import sysimport pygameclass AlienInvasion: def __init__(self): #初始化游戏并创建游戏资源 pygame.init() self.screen = pygame.display.set_mode((1200,800)) pygame.display.set_caption(\"外星人入侵\") def run_game(self): #开始游戏的主循环 while True: for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() #让最近绘制的屏幕可见 pygame.display.flip() if __name__ == \'__main__\': #创建游戏并实例运行游戏 ai = AlienInvasion() ai.run_game()
为开发游戏《外星人入侵》,首先创建一个名为AlienInvasion的类,在这个类_init_()
方法中,调用pygame.init()函数来初始化背景,让Pygame能够正确地工作。然后调用pygame.display.set_mode()创建一个显示窗口,这个游戏的所有图形元素都将在其中绘制。实参(1200, 800)是一个元组,指定了游戏窗口的尺寸——宽1200像素、高800像素(你可以根据自己显示器的尺寸进行调整)。将这个显示窗口赋给属性self.screen,让这个类的所有方法都能够使用它。
赋给属性self.screen的对象是一个surface。在Pygame中,surface是屏幕的一部分,用于显示游戏元素。这个游戏中,每个元素(如外星人或飞船)都是一个surface。display.set_mode()返回的surface表示整个游戏窗口,激活游戏的动画循环后,每经过一次循环都将自动重绘这个surface,将用户输入触发的所有变化都反映出来。
这个游戏由run_game()方法控制。该方法包含一个不断运行的while循环,而这个循环包含了一个事件循环以及管理屏幕更新的代码。事件是用户玩游戏时执行的操作。
我们使用P有game.event.get()函数来访问Pygame检测的事件,这个函数返回一个列表,其中包含它在上一次调用后发生的所有事件。所有键盘和鼠标事件都将导致这个for循环运行。在这个循环中,我们将编写一系列if语句来检测并相应特定的事件。例如,当玩家点击窗口的关闭按钮时,将检测到pygame.QUIT事件,进而调用sys。exit()来退出游戏。
pyame.display.flip(),命令pygame让最近绘制的屏幕可见,在之后的程序中,我们会加入让飞船移动的代码,这样我们需要时刻重绘屏幕,让飞船的持续移动体现在屏幕的刷新上,虽然是重新绘制,但好在绘制的速度很快,在用户眼里,飞船就是在持续移动的。
在这个文件末尾,创建一个游戏实例并调用run_game()。这些代码被放在一个if代码块中,仅当直接运行该文件时,创建一个游戏实例,并调用run_game()。
2.2、控制帧率
理想情况下,游戏在所有系统中都应该以相同的速度运行。对于可在多种系统中运行的游戏,控制帧率是一个复杂的问题,好在Pygame提供了一种相对简单的方式来达成这个目标。我们将创建一个时钟,并确保他在主循环每次通过后都进行计时。当这个循环的通过速度超过我们定义的帧率时,Pygame会计算需要暂停多少时间,以便游戏的运行速度保持一致。
我们在__init__()方法中定义这个时钟:
def __init__(self):#初始化游戏并创建游戏资源pygame.init()self.clock = pygame.time.Clock()--snip--
初始化pygame后,创建pygame.time模块中的Clock类的一个实例,然后在run_game()的while循环末尾让这个时钟进行计时:
def run_game(self): #开始游戏的主循环 while True: for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() #让最近绘制的屏幕可见 pygame.display.flip() self.clock.tick(60)
tick()方法接受一个参数:游戏的帧率。
2.3、设置背景色
Pygame默认创建一个黑色屏幕,下面在__init__()方法末尾将背景设置为另外一种颜色:
def __init__(self): #初始化游戏并创建游戏资源 pygame.init() self.clock = pygame.time.Clock() self.screen = pygame.display.set_mode((1200,800)) pygame.display.set_caption(\"外星人入侵\") #设置背景色 self.bg_color = (230, 230, 230)
#每次循环都重绘屏幕 self.screen.fill(self.bg_color) #让最近绘制的屏幕可见 pygame.display.flip() self.clock.tick(60)
3.4、创建Settings类
每次给游戏添加新功能时,通常会引入一些新设置。下面来编写一个名为settings的模块,其中包含一个名为Settings的类,用于将所有设置都存储在一个地方,以免在代码中到处添加设置。这样,每当需要访问设置时,只需只用一个settings对象。在项目规模增大时,这还让游戏的外观和行为修改起来更加容易。
class Settings: def __init__(self): #初始化游戏的设置 #屏幕设置 self.screen_width = 1200 self.screen_height = 800 self.bg_color = (230, 230, 230)
为了能在项目中创建Settings实例,并使用它来访问设置:
class AlienInvasion: def __init__(self): #初始化游戏并创建游戏资源 pygame.init() self.clock = pygame.time.Clock() self.settings = Settings() self.screen = pygame.display.set_mode((self.settings.screen_width,self.settings.screen_height)) pygame.display.set_caption(\"外星人入侵\") #设置背景色 self.bg_color = (230, 230, 230)
#每次循环都重绘屏幕 self.screen.fill(self.settings.bg_color)
2.4、添加飞船图像
这里使用的是教材上已获得许可的图像,注意,在为游戏选择素材时,务必注意是否有版权许可。最安全、成本最低的方式是使用OpenGameArt等网站提供的免费图形,这些素材无须授权许可即可使用和修改。
2.4.1、创建Ship类
选择好用于表示飞船的图像后,需要将其显示到屏幕上。我们创建一个名为ship的模块,其中包含Ship类,负责管理飞船的大部分行为:
import pygameclass Ship: def __init__(self, ai_game): self.screen = ai_game.screen self.screen_rect = ai_game.screen.get_rect() self.image = pygame.image.load(\'C:\\Users\\zyk\\Desktop\\front - end - prcitse\\python联系\\lianxi\\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)
定义这个类之前,导入模块pygame。Ship的__init__()方法接受了两个参数:除了self引用,还有一个指向当前AlienInvasion中定义的所有游戏资源。将屏幕赋给Ship的一个属性,这样可在这个类的所有i方法中轻松地访问它。使用get_rect()方法访问屏幕的rect属性,并将其赋给self.screen_rect,这让我们能够将飞船放到屏幕的正确位置上。
为了加载图像,我们调用pygame.image.load(),并将飞船的图像的位置传递给它。这个函数返回一个表示飞船的surface,而我们将这个surface赋给了self.image。加载图像后,调用get_rect()获取相应surface的属性rect,以便将来使用它来指定飞船的位置。
在处理rect对象时,可使用矩形的四个角及中心的x坐标和y坐标,通过设置这些值来指定矩形的位置。如果要将游戏元素居中,可设置相应rect对象的属性center、centerx或centery;要让游戏元素与屏幕边缘对齐,可设置属性top、bottom、left、或right。除此之外,还有一些组合属性,比如midbottom、midtop、midleft和midright。要调整游戏元素的水平或垂直位置,可使用属性x和y,它们分别是相应矩形左下角的x坐标和y坐标。这些属性让你无需去做游戏开发人员本需要手动完成的计算,因此很常用。
2.4.2、在屏幕上绘制飞船
下面更新主程序,创建一艘飞船并调用其方法blitme():
import sysimport pygamefrom settings import Settingsfrom ship import Shipclass AlienInvasion: def __init__(self): #初始化游戏并创建游戏资源 pygame.init() self.clock = pygame.time.Clock() self.settings = Settings() self.screen = pygame.display.set_mode((self.settings.screen_width,self.settings.screen_height)) pygame.display.set_caption(\"外星人入侵\") self.ship = Ship(self) #设置背景色 self.bg_color = (230, 230, 230) 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() self.clock.tick(60) if __name__ == \'__main__\': #创建游戏并实例运行游戏 ai = AlienInvasion() ai.run_game()
我们导入Ship类,并在创建屏幕后创建一个Ship实例。在调用Ship()时,必须提供一个参数:一个AlienInvasion实例。在这里,self指向的是当前的AlienInvasion实例。这个参数让Ship能够访问游戏资源,如对象screen。我们将这个Ship实例赋给了self.ship。
填充背景后,调用ship.blieme()将飞船绘制到屏幕上,确保它出现在背景的前面。
现在运行该程序,我们将看到飞船位于游戏屏幕底部的中央:
总结
本周的学习,主要是了解pygame的用途,学习了如何创建一个新的pygame的项目,如何调整屏幕的大小以及屏幕的帧率,创建了一个飞船的实例,了解了pygame中坐标的相关知识,之后将飞船镶嵌到我们之前设定的屏幕中,在下一周的学习中,我们将会理解如何让飞船进行移动,达到我们想要的结果。