外星人入侵
目录
- 在做项目前需要做什么?
我们要知道我们的项目需要达成哪些功能,以及行为。还需要一个硬性要求就是需要电脑中安装了pygame。针对不同的系统安装的方式不同。
Linux系统+python3:需要使用pip来进行安装
ox系统:需要使用pip来安装pygame
linux系统+python2.7:不需要通过pip
Windows系统:不需要通过pip (虽然不需要通过pip安装,但系统中也是要有pip的)
这里我们还需要知道一个事:我们系统里面有没有pip。
通过在cmd中输入此内容能够判断windows系统中是否安装了pip并且并且能够判断pip所关联的python版本(如果电脑中只有一个python,那不会出现关联错误的问题)否则需要重新安装pip。
安装pip
要安装pip我们要有get-pip.py文件,下载好这个文件(文件地址https://pip.pypa.io/en/stable/installing/)
下载好之后我们在不同操作系统上使用不同的命令来安装
Linux和os x系统中:使用命令sudo python get-pip.py 来进行安装。
windows系统中:使用命令python get-pip.py来进行安装。
安装Pygame
在Windows系统中安装pygame可在pycharm中配置。
linux系统+python2.7:可以使用包管理来安装pygame。
Linux系统+python3:需要先安装pygame所需的库,然后在安装pycharm。(都是在终端中进行)
安装好工具我们开始实战
飞机大战飞机已经能够发射子弹了,三颗子弹都已经准备就绪了。
但是回过头来想脑子里只有框架,整个框架就是围绕类,实例,方法来转,但细节方面没有掌握到什么可用的,为了强化写代码的能力,决定回过头在捋一遍。
1.在设计游戏时我们需要什么模块?各模块的作用是什么?
答:我们需要sys模块和pygame模块。
pygame包含开发游戏的功能
sys能够起到退出的作用
pygame模块:
模块 | 作用 |
---|---|
cdrom | 管理cdrom设备和音频播放 |
cursort | 加载光标图像,包括标准光标 |
display | 控制显示窗口或屏幕 |
draw | 在surface上画简单形状 |
event | 管理事件和事件队列 |
font | 创建并呈现Truetype字体 |
image | 保存和加载图像 |
joystick | 管理控制杆装置 |
key | 管理键盘 |
mouse | 管理鼠标 |
movie | mpeg电影播放 |
sndarray | 数字处理声音 |
surfarray | 数字处理图像 |
time | 控制时间 |
transform | 缩放、旋转和翻转图像 |
sys模块:
sys.argv | 命令行参数List,第一个元素是程序本身路径 |
---|---|
sys.exit(0) | 退出程序,正常退出时exit(0) |
sys.version | 获取Python解释程序的版本信息 |
sys.maxint | 最大的Int值 |
sys.path | 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值 |
sys.platform | 返回操作系统平台名称 |
sys.stdout.write(‘please:’) | 需要配合sys.stdout.flush()把写的刷出来 |
val = sys.stdin.readline()[:-1] | 把输入的东西赋值给val |
2.pygame怎么初始化背景设置?
答:通过代码pygame.init()进行设置。
3.怎么创建显示窗口?
答:使用display模块下面的pygame.display.set_mode()初始化一个准备显示的窗口或屏幕。
4.怎么理解事件循环?
答:我们编写事件循环以便监听事件。
例如:for event in pygame.event.get()从队列中获取事件。
注意:所有鼠标和键盘的事件都将促使for循环。
5.列举每种事件类型定义的事件属性?
答:例如:if event.type=pygame.QUIT:
6.怎么将完整带显示的Surface对象更新到屏幕上?
答:使用pygame.display.flip()来进行更新
7.怎么更改python默认的黑色背景?
答:首先先设置一个背景色作为实参使用,例如:bg_color=(230,230,230),然后用自己设着的背景色来填充屏幕例如:screen.fill(bg.color)
8.如果一个项目存在很多内部设置我们需要怎么简化代码?
答:通常我们新建一个模块(类),再类中将设置进行实例化,例如:
class Settings():
‘’‘存储《外星人入侵》的所有设置的类’’’
def _init_(self):
下面是设置内容
…
…
…
最后将实例导入到主程序中并赋给一个变量用来使用。例如:
ai_settings=Settings()
注:类是抽象概念,类的实例是具体的。比如创建一个类名字叫“学生”,实例化一个学生“张三”,张三就是“学生类”的一个实例。
9.pygame 加载图片我们怎么调用?
答:通过pygame.image.load(“图片地址”)来进行调用。
10.pygame中我们关于图像位置和背景位置需要知道什么?
答:首先我们知道两个图像位置都需要获取
例如:
self.rect=self.image.get_rect()
self.screen.rect=screen.get_rect()
然后一般情况是将图片位置以背景位置为参考
例如:
self.rect.conterx=self.screen.rect.centerx
self.rect.bottom=self.screen.rect.bottom
注:把每一项类中所有的功能封装起来称为方法,一般方法里的内容就是方法的执行过程。
11.怎么将图片绘制在背景上面?
答:我们通过方法blitme()方法来进行绘制
例如:
def blitme(self):
self.screen.blit(self.image,self.rect)
使用方法biltme()要添加的东西就是图像以及图像的矩形位置,所以传入即可
12.在类里面包含的内容是什么 ?有什么作用?例如:ship=Ship(screen)
答:不知道。但这鬼东西能够导入一个飞船,为什么里面是screen啊?
13.怎么将类中的方法调用?
答:先将类赋值给一个变量,然后通过==变量.方法()==来进行调用。
14.重构代码有什么作用?
答:重构代码可以简化既有代码的结构,具体方法是需要我们创建一个新的模块,这个模块用来储存函数。然后修改主程序,将函数中的循环替换成对函数的调用。例如:import 文件名 as 变量
调用:变量.方法()
14.关于函数中形参这块有点模糊?
答:将其他模块的形参导入新建的函数中,形参是哪里来的。
例如:gf.update_screen(ai_settings,screen,ship)
答: ai_settings是模块,screen是什么,ship也是模块。
15.响应事件和响应按键之间的关系?
答:我们需要先响应事件,比如说响应的是键盘上有按下的操作,例如:elif even.typepygame.KEYDOWN:
这就完成了响应事件命令,接下来我们研究下具体是什么事件,也就是说是事件下面的什么按键,例如:if event.keyK_RIGHT.
16.什么情况下作为形参传入,什么时候作为实参传入?
答:当一个形参被放入一个函数中时,那么再调用这个参数就是作为实参使用了。
17.添加属性的重要性?
答:当一个模块需要添加功能时,需要添加属性和方法,相互呼应,我们修改事件的内容来更改标志的内容,然后通过标志的内容来判断实际的案例。实际的案例一般储存在一个更新函数下面,只需在主程序中调用这个更新函数即可。
18.rect 的 centerx 等属性只能存储整数值?那我们怎么精确的修改这个值?
答:我们可以新建一个属性:self.center = float(self.rect.centerx)
然后通过
self.center += self.ai_settings.ship_speed_factor
这样我们把更改后的值放在了变量中
然后再将变量赋值给我们的图形位置方法中。
self.rect.centerx = self.center
19.一个模块中如果出现大致重复的内容,怎么办?
答:为了使代码结构更清晰,我们需要重构代码,一般情况是将重复部分分别用函数装起来。例如:
def check_keydown_events(event, ship):
“”“响应按键”""
if event.key == pygame.K_RIGHT:
ship.moving_right = True
elif event.key == pygame.K_LEFT:
ship.moving_left = True
20.引用别的模块?
答:
class Bullet(Sprite):
“”“一个对飞船发射的子弹进行管理的类”""
def init(self, ai_settings, screen, ship):
“”“在飞船所处的位置创建一个子弹对象”""
super(Bullet, self).init()
这是特殊的格式。继承
引用的类就点
21.子弹的位置和子弹所在的矩形位置不是一个位置?
答:是的
例如:
#更新表示子弹位置的小数值
self.y -= self.speed_factor
#更新表示子弹的rect的位置
self.rect.y = self.y
22.编组怎么创建?
答:直接让参数=Group()即可。
23.按下空格键怎么用事件表示?
答:if event.key==pygame.K_SPACE:
24.什么 是精灵,怎么遍历精灵?
答:通过 方法
for bullet in bullets.sprites()
25.怎么修改for循环中的列表?
答:在 for 循环中,不应从列表或编组中删除条目,因此必须遍历编组的副本。我们使用了方法copy() 来设置 for 循环:
for bullet in bullets.copy():
if bullet.rect.bottom <= 0:
bullets.remove(bullet)
26.获取图像位置怎么弄?
答:
飞船位置:
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 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.bmp’)
self.rect = self.image.get_rect()
#每个外星人最初都在屏幕左上角附近
self.rect.x = self.rect.width
self.rect.y = self.rect.height
#存储外星人的准确位置
self.x = float(self.rect.x)
注:飞船和外星人的定位有一些不同,飞船是采用飞船图像矩形依靠背景来定位,而外星人是依靠自身的位置即x,y坐标来确定的。没有参照物,因为背景的左上角位置为(0,0)。
27.要想创建多个同样的东西,我们需要怎么办?
答:我们需要创建一个空的编组,例如:
bullets=Group()