目录
要安装pip我们要有get-pip.py文件,下载好这个文件(文件地址https://pip.pypa.io/en/stable/installing/)
下载好之后我们在不同操作系统上使用不同的命令来安装
Linux和os x系统中:使用命令sudo python get-pip.py 来进行安装。
windows系统中:使用命令python get-pip.py来进行安装。
在Windows系统中安装pygame可在pycharm中配置。
linux系统+python2.7:可以使用包管理来安装pygame。
Linux系统+python3:需要先安装pygame所需的库,然后在安装pycharm。(都是在终端中进行)
安装好工具我们开始实战
飞机大战飞机已经能够发射子弹了,三颗子弹都已经准备就绪了。
但是回过头来想脑子里只有框架,整个框架就是围绕类,实例,方法来转,但细节方面没有掌握到什么可用的,为了强化写代码的能力,决定回过头在捋一遍。
答:我们需要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 |
答:通过代码pygame.init()进行设置。
答:使用display模块下面的pygame.display.set_mode()初始化一个准备显示的窗口或屏幕。
答:我们编写事件循环以便监听事件。
例如:for event in pygame.event.get()从队列中获取事件。
注意:所有鼠标和键盘的事件都将促使for循环。
答:例如:if event.type=pygame.QUIT:
答:使用pygame.display.flip()来进行更新
答:首先先设置一个背景色作为实参使用,例如:bg_color=(230,230,230),然后用自己设着的背景色来填充屏幕例如:screen.fill(bg.color)
答:通常我们新建一个模块(类),再类中将设置进行实例化,例如:
class Settings():
‘’‘存储《外星人入侵》的所有设置的类’’’
def _init_(self):
下面是设置内容
…
…
…
最后将实例导入到主程序中并赋给一个变量用来使用。例如:
ai_settings=Settings()
注:类是抽象概念,类的实例是具体的。比如创建一个类名字叫“学生”,实例化一个学生“张三”,张三就是“学生类”的一个实例。
答:通过pygame.image.load(“图片地址”)来进行调用。
答:首先我们知道两个图像位置都需要获取
例如:
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
注:把每一项类中所有的功能封装起来称为方法,一般方法里的内容就是方法的执行过程。
答:我们通过方法blitme()方法来进行绘制
例如:
def blitme(self):
self.screen.blit(self.image,self.rect)
使用方法biltme()要添加的东西就是图像以及图像的矩形位置,所以传入即可
答:不知道。但这鬼东西能够导入一个飞船,为什么里面是screen啊?
答:先将类赋值给一个变量,然后通过==变量.方法()==来进行调用。
答:重构代码可以简化既有代码的结构,具体方法是需要我们创建一个新的模块,这个模块用来储存函数。然后修改主程序,将函数中的循环替换成对函数的调用。例如:import 文件名 as 变量
调用:变量.方法()
答:将其他模块的形参导入新建的函数中,形参是哪里来的。
例如:gf.update_screen(ai_settings,screen,ship)
答: ai_settings是模块,screen是什么,ship也是模块。
答:我们需要先响应事件,比如说响应的是键盘上有按下的操作,例如:elif even.typepygame.KEYDOWN:
这就完成了响应事件命令,接下来我们研究下具体是什么事件,也就是说是事件下面的什么按键,例如:if event.keyK_RIGHT.
答:当一个形参被放入一个函数中时,那么再调用这个参数就是作为实参使用了。
答:当一个模块需要添加功能时,需要添加属性和方法,相互呼应,我们修改事件的内容来更改标志的内容,然后通过标志的内容来判断实际的案例。实际的案例一般储存在一个更新函数下面,只需在主程序中调用这个更新函数即可。
答:我们可以新建一个属性:self.center = float(self.rect.centerx)
然后通过
self.center += self.ai_settings.ship_speed_factor
这样我们把更改后的值放在了变量中
然后再将变量赋值给我们的图形位置方法中。
self.rect.centerx = self.center
答:为了使代码结构更清晰,我们需要重构代码,一般情况是将重复部分分别用函数装起来。例如:
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
答:
class Bullet(Sprite):
“”“一个对飞船发射的子弹进行管理的类”""
def init(self, ai_settings, screen, ship):
“”“在飞船所处的位置创建一个子弹对象”""
super(Bullet, self).init()
这是特殊的格式。继承
引用的类就点
答:是的
例如:
#更新表示子弹位置的小数值
self.y -= self.speed_factor
#更新表示子弹的rect的位置
self.rect.y = self.y
答:直接让参数=Group()即可。
答:if event.key==pygame.K_SPACE:
答:通过 方法
for bullet in bullets.sprites()
答:在 for 循环中,不应从列表或编组中删除条目,因此必须遍历编组的副本。我们使用了方法copy() 来设置 for 循环:
for bullet in bullets.copy():
if bullet.rect.bottom <= 0:
bullets.remove(bullet)
答:
飞船位置:
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)。
答:我们需要创建一个空的编组,例如:
bullets=Group()