笔记

创建一个窗口

1
2
3
4
5
6
7
8
import sys   # 导入sys用于退出用
import pygame # 创建窗口用

# 窗口的宽长他是一个元组
i=(1200,800)

# 创建一个窗口
screen=pygame.display.set_mode(i)

看一下运行结果,他只显示了,标题没有显示窗口啊]

![2021-03-16 09-05-57](https://zssnp-1301606049.cos.ap-nanjing.myqcloud.com/img/2021-03-16 09-05-57.png)

显示窗口可以用pygame.display.flip()

代码

1
2
3
4
5
6
7
8
9
10
11
import sys   # 导入sys用于退出用
import pygame # 创建窗口用

# 窗口的宽长他是一个元组
i=(1200,800)

# 创建一个窗口
screen=pygame.display.set_mode(i)

# 绘制屏幕可见
pygame.display.flip()

结果会很快就消失了

![2021-03-16 09-12-19](https://zssnp-1301606049.cos.ap-nanjing.myqcloud.com/img/2021-03-16 09-12-19.png)

我们可以添加循环,这样每次都会刷新绘制屏幕可见

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
import sys   # 导入sys用于退出用
import pygame # 创建窗口用

# 窗口的宽长他是一个元组
i=(1200,800)

# 创建一个窗口
screen=pygame.display.set_mode(i)

# 死循环
while True:
# 绘制屏幕可见
pygame.display.flip()

结果可以看见一直都是显示

image-20210317103052622

我们可以设置他的标题名字pygame.display.set_caption(标题名)

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import sys   # 导入sys用于退出用
import pygame # 创建窗口用

# 窗口的宽长他是一个元组
i=(1200,800)

# 创建一个窗口
screen=pygame.display.set_mode(i)

# 标题名字
m="abc"
pygame.display.set_caption(m)

# 死循环
while True:
# 绘制屏幕可见
pygame.display.flip()

结果

image-20210316092344835

然后我们发现他的窗口是关闭不了的,我们可以用sys模块进行判断关闭窗口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import sys
import pygame

# 窗口的宽长他是一个元组
i=(1200,800)

# 创建一个窗口
screen=pygame.display.set_mode(i)

# 标题名字
m="abc"
pygame.display.set_caption(m)

# 死循环
while True:

# 监听键盘和鼠标的事件
for event in pygame.event.get():

# 点击窗口的关闭,就会检查到pygame.QUIT然后退出循环
if event.type==pygame.QUIT:
sys.exit()

# 绘制屏幕可见
pygame.display.flip()

结果然后就可以关闭了

image-20210317103907215

设置背景颜色

他默认是黑色,我们可以用screen.fill()方法来填充颜色

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import sys
import pygame

# 窗口的宽长他是一个元组
i=(1200,800)

# 创建一个窗口
screen=pygame.display.set_mode(i)

# 标题名字
m="abc"
pygame.display.set_caption(m)

# 背景颜色
bg=(230,230,230)

# 死循环
while True:

# 监听键盘和鼠标的事件
for event in pygame.event.get():

# 点击窗口的关闭,就会检查到pygame.QUIT然后退出循环
if event.type==pygame.QUIT:
sys.exit()


# 填充颜色
screen.fill(bg)

# 绘制屏幕可见
pygame.display.flip()

结果

image-20210317104402334

创建类

书上说的意思是如果这样写下去会代码很长,我们就可以创建一个类就可以避免这个代码太长不好管理的问题他默认是黑色,我们可以用screen.fill()方法来填充颜色

我叫上面的代码分到两个文件里面

PingMuXianShi.py文件里面内容,我这个文件是设置屏幕的我为了自己好认就自己改了个名字

1
2
3
4
5
6
7
8
9
class XianShi():
def __init__(self):
# 窗口的宽
self.width=1200
# 窗口的长
self.height=800

# 背景颜色
self.gb=(230,230,230)

zhu1.py这个是住文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import sys 
import pygame

# PingMuXianShi是文件名,XianShi是PingMuXianShi文件里面的类名
from PingMuXianShi import XianShi


# 创建一个函数
def game():

# 创建对象
xian_shi=XianShi()

# 创建一个窗口,都有XianShi类里面的width和height
screen=pygame.display.set_mode((xian_shi.width,xian_shi.height))

# 窗口的名字
pygame.display.set_caption("abc")

# 死循环
while True:

pygame.init()

# 监听键盘和鼠标的事件
for event in pygame.event.get():

# 点击窗口的关闭,就会检查到pygame.QUIT然后退出循环
if event.type==pygame.QUIT:
sys.exit()


# 填充颜色 ,用的是PingMuXianShi文件里面的XianShi类的gb属性
screen.fill(xian_shi.gb)

# 绘制屏幕可见
pygame.display.flip()

构建飞船

我添加一个ship.py文件

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import pygame 
class Ship():

# screen用于传参数
def __init__(self,screen):

# 叫screen穿的参数给self.screen
self.screen=screen


# 去哪个目录加载图像返回值给了self.ima
self.ima=pygame.image.load('/home/zss/笔记/外星人入侵项目/ima/ship.bmp')

# 获得外部矩形
self.rect=self.ima.get_rect()

# 屏幕矩形
self.screen_rect=screen.get_rect()


# centerx这个英文是中间的意思,就是叫图片放到中间,这个就是x轴,他还有一个y轴
self.rect.centerx=self.screen_rect.centerx

# bottom英文是底部的意思,就是叫图片放到底部
self.rect.bottom=self.screen_rect.bottom


# 创建一个blitme类
def blitme(self):

# 在屏幕上绘制图形
self.screen.blit(self.ima,self.rect)

运行结果

zhu1.py里面代码添加

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import sys 
import pygame

# PingMuXianShi是文件名,XianShi是PingMuXianShi文件里面的类名
from PingMuXianShi import XianShi

# 导入ship文件里面的ship的类
from ship import Ship


# 创建一个函数
def game():

# 创建对象
xian_shi=XianShi()

# 创建一个窗口,都有XianShi类里面的width和height
screen=pygame.display.set_mode((xian_shi.width,xian_shi.height))

# 窗口的名字
pygame.display.set_caption("abc")

# 创建一个飞船
ship=Ship(screen)


# 死循环
while True:


# 监听键盘和鼠标的事件
for event in pygame.event.get():

# 点击窗口的关闭,就会检查到pygame.QUIT然后退出循环
if event.type==pygame.QUIT:
sys.exit()


# 填充颜色 ,用的是PingMuXianShi文件里面的XianShi类的gb属性
screen.fill(xian_shi.gb)



ship.blitme()
# 绘制屏幕可见
pygame.display.flip()

game()

查看运行结果,可以看见有一个小船

image-20210318090503734

重构

下面这样更容易让我们扩展,可以避免住文件里面太长

我们创建一个game_funcltions.py文件用于关闭和屏幕显

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import sys 
import pygame


# 监听键盘和鼠标的事件
def check_events():
for event in pygame.event.get():
# 点击窗口的关闭,就会检查到pygame.QUIT然后退出循环
if event.type==pygame.QUIT:
sys.exit()

def update_screen(xian_shi,screen,ship):

# 填充颜色 ,用的是PingMuXianShi文件里面的XianShi类的gb属性
screen.fill(xian_shi.gb)

# 绘制飞船
ship.blitme()

# 绘制屏幕可见
pygame.display.flip()

主文件代码就变得很少了

下面是zhu1.py文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import sys 
import pygame
# PingMuXianShi是文件名,XianShi是PingMuXianShi文件里面的类名
from PingMuXianShi import XianShi
# 导入ship文件里面的ship的类
from ship import Ship

# 导入game_funcltions文件
import game_funcltions



# 创建一个函数
def game():

# 创建对象
xian_shi=XianShi()

# 创建一个窗口,都有XianShi类里面的width和height
screen=pygame.display.set_mode((xian_shi.width,xian_shi.height))

# 窗口的名字
pygame.display.set_caption("外星人入侵")

# 创建一个飞船
ship=Ship(screen)


# 死循环
while True:

# 用game_funcltions文件里面的check_events函数 点击窗口的关闭
game_funcltions.check_events()

# 用game_funcltions文件里面的update_screen绘制图形
game_funcltions.update_screen(xian_shi,screen,ship)


game()

结果

image-20210318092845374

移动飞船

右移动

在python里面每一个键盘和鼠标垫事件都会pygame.event.get()捕获到,然后我们就可以按一个建加飞船的x和y轴

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import sys 
import pygame


# 监听键盘和鼠标的事件
def check_events(ship):
for event in pygame.event.get():
# 点击窗口的关闭,就会检查到pygame.QUIT然后退出循环
if event.type==pygame.QUIT:
sys.exit()

# 监听建键盘的建,如果你按键盘了他是会被执行
elif event.type==pygame.KEYDOWN:

# K_RIGHT这个就是我们键盘的右建事件如果我们点击了下面就会被执行
if event.key==pygame.K_RIGHT:

# 像右移动多少
ship.rect.centerx+=1

def update_screen(xian_shi,screen,ship):

# 填充颜色 ,用的是PingMuXianShi文件里面的XianShi类的gb属性
screen.fill(xian_shi.gb)

# 绘制飞船
ship.blitme()

# 绘制屏幕可见
pygame.display.flip()

上面添加的代码是

1
2
3
4
5
6
7
8
# 监听建键盘的建,如果你按键盘了他是会被执行
elif event.type==pygame.KEYDOWN:

# K_RIGHT这个就是我们键盘的右建事件如果我们点击了下面就会被执行
if event.key==pygame.K_RIGHT:

# 像右移动多少
ship.rect.centerx+=1

持续移动

上面的点一下他才运行,下面用到了两个事件,进行持续移动

KEYDOWN如果你按键盘了他是会被执行

KEYUP我们按键松了他是会被执行

game_funcltions.py文件代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import sys 
import pygame


# 监听键盘和鼠标的事件
def check_events(ship):
for event in pygame.event.get():
# 点击窗口的关闭,就会检查到pygame.QUIT然后退出循环
if event.type==pygame.QUIT:
sys.exit()

# 监听建键盘的建,如果你按键盘了他是会被执行
elif event.type==pygame.KEYDOWN:

# K_RIGHT这个就是我们键盘的右建事件如果我们点击和松开了下面就会被执行
if event.key==pygame.K_RIGHT:

# 就会叫这个ship.moving_right属性设置为True
ship.moving_right=True

# 我们按键松开就会检查到KEYUP事件,下面的代码就会执行
elif event.type==pygame.KEYUP:

# K_RIGHT这个就是我们键盘的右建事件如果我们点击和松开了下面就会被执行
if event.key==pygame.K_RIGHT:

# 就会叫这个ship.moving_right属性设置为False
ship.moving_right=False

def update_screen(xian_shi,screen,ship):

# 填充颜色 ,用的是PingMuXianShi文件里面的XianShi类的gb属性
screen.fill(xian_shi.gb)

# 绘制飞船
ship.blitme()

# 绘制屏幕可见
pygame.display.flip()

修改的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# 监听建键盘的建,如果你按键盘了他是会被执行
elif event.type==pygame.KEYDOWN:

# K_RIGHT这个就是我们键盘的右建事件如果我们点击和松开了下面就会被执行
if event.key==pygame.K_RIGHT:

# 就会叫这个ship.moving_right属性设置为True
ship.moving_right=True

# 我们按键松开就会检查到KEYUP事件,下面的代码就会执行
elif event.type==pygame.KEYUP:

# K_RIGHT这个就是我们键盘的右键事件如果我们点击和松开了下面就会被执行
if event.key==pygame.K_RIGHT:

# 就会叫这个ship.moving_right属性设置为False
ship.moving_right=False

zhu1.py文件主代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import sys 
import pygame
# PingMuXianShi是文件名,XianShi是PingMuXianShi文件里面的类名
from PingMuXianShi import XianShi
# 导入ship文件里面的ship的类
from ship import Ship

# 导入game_funcltions文件
import game_funcltions


# 创建一个函数
def game():

# 创建对象
xian_shi=XianShi()

# 创建一个窗口,都有XianShi类里面的width和height
screen=pygame.display.set_mode((xian_shi.width,xian_shi.height))

# 窗口的名字
pygame.display.set_caption("外星人入侵")

# 创建一个飞船
ship=Ship(screen)


# 死循环
while True:


# 用game_funcltions文件里面的check_events函数 点击窗口的关闭
game_funcltions.check_events(ship)

# 调用ship文件里面的update方法
ship.update()
# 用game_funcltions文件里面的update_screen绘制图形
game_funcltions.update_screen(xian_shi,screen,ship)


game()

里面添加了

1
2
# 调用ship文件里面的update方法
ship.update()

运行结果

![2021-03-19 16-53-40](https://zssnp-1301606049.cos.ap-nanjing.myqcloud.com/img/2021-03-19 16-53-40.png)

左右移动

上面的他只可以右移动,像对应的还有,按左键事件K_LEFT我们用这个事件就可以叫他向左移动

game_funcltions.py文件代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import sys 
import pygame


# 监听键盘和鼠标的事件
def check_events(ship):
for event in pygame.event.get():
# 点击窗口的关闭,就会检查到pygame.QUIT然后退出循环
if event.type==pygame.QUIT:
sys.exit()

# 监听建键盘的建,如果你按键盘了他是会被执行
elif event.type==pygame.KEYDOWN:

# K_RIGHT这个就是我们键盘的右建事件如果我们点击和松开了下面就会被执行
if event.key==pygame.K_RIGHT:

# 就会叫这个ship.moving_right属性设置为True
ship.moving_right=True
# K_LEFT这个就是我们键盘的左建事件如果我们点击和松开了下面就会被执行
elif event.key==pygame.K_LEFT: # 新加的代码

# 就会叫这个self.moving_left属性设置为True
ship.moving_left=True # 新加的代码


# 我们按键松开就会检查到KEYUP事件,下面的代码就会执行
elif event.type==pygame.KEYUP:

# K_RIGHT这个就是我们键盘的右建事件如果我们点击和松开了下面就会被执行
if event.key==pygame.K_RIGHT:

# 就会叫这个ship.moving_right属性设置为False
ship.moving_right=False

## K_LEFT这个就是我们键盘的左建事件如果我们点击和松开了下面就会被执行
elif event.key==pygame.K_LEFT: # 新加的代码

# 就会叫这个self.moving_left属性设置为False
ship.moving_left=False # 新加的代码


def update_screen(xian_shi,screen,ship):

# 填充颜色 ,用的是PingMuXianShi文件里面的XianShi类的gb属性
screen.fill(xian_shi.gb)

# 绘制飞船
ship.blitme()

# 绘制屏幕可见
pygame.display.flip()

ship.py文件增加左移动值代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import pygame 
class Ship():

# screen用于传参数
def __init__(self,screen):

# 叫screen穿的参数给self.screen
self.screen=screen


# 去哪个目录加载图像返回值给了self.ima
self.ima=pygame.image.load('/home/zss/笔记/外星人入侵项目/ima/ship.bmp')

# 获得外部矩形
self.rect=self.ima.get_rect()

# 屏幕矩形
self.screen_rect=screen.get_rect()


# centerx这个英文是中间的意思,就是叫图片放到中间,这个就是x轴,他还有一个y轴
self.rect.centerx=self.screen_rect.centerx

# bottom英文是底部的意思,就是叫图片放到底部
self.rect.bottom=self.screen_rect.bottom

# 右移动标志
self.moving_right=False
# 左移动标志
self.moving_left=False # 新加的代码
def update(self):

# game_funcltions文件里面有键盘监听事件按键按下去就会吧这个属性设置成True
if self.moving_right:

# 这个就给x加1
self.rect.centerx+=1

# game_funcltions文件里面有键盘监听事件按键按下去就会吧这个属性设置成True
if self.moving_left: # 新加的代码

# 这个就给x减
self.rect.centerx-=1 # 新加的代码

# 创建一个blitme类
def blitme(self):

# 在屏幕上绘制图形
self.screen.blit(self.ima,self.rect)

运行结果

![2021-03-19 17-12-42](https://zssnp-1301606049.cos.ap-nanjing.myqcloud.com/img/2021-03-19 17-12-42.png)

设置飞船的飞行速度

game_funcltions.py文件代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import pygame 
class Ship():

# ai_settings传输飞船移动速度screen用于传参数,
def __init__(self,ai_settings,screen):

# 叫screen穿的参数给self.screen
self.screen=screen

# 添加self.ai_settings叫
self.ai_settings=ai_settings
# 去哪个目录加载图像返回值给了self.ima
self.ima=pygame.image.load('/home/zss/笔记/外星人入侵项目/ima/ship.bmp')

# 获得外部矩形
self.rect=self.ima.get_rect()

# 屏幕矩形
self.screen_rect=screen.get_rect()


# centerx这个英文是中间的意思,就是叫图片放到中间,这个就是x轴,他还有一个y轴
self.rect.centerx=self.screen_rect.centerx

# bottom英文是底部的意思,就是叫图片放到底部
self.rect.bottom=self.screen_rect.bottom

# 启动是保存飞船的第一个位置float是转换小数的意思
self.center=float(self.rect.centerx)

# 右移动标志
self.moving_right=False
# 左移动标志
self.moving_left=False


def update(self):

# self.moving_right在game_funcltions文件里面有键盘监听事件按键按下去就会吧这个属性设置成True
# self.rect.right获得外部矩形位置
# self.screen_rect.right记录长度

# 新加的代码
if self.moving_right and self.rect.right < self.screen_rect.right:

# 这个就给x加self.ai_settings.ship_speed_factor,这个文件在PingMuXianShi文件里面
self.rect.centerx+=self.ai_settings.ship_speed_factor

# 新加的代码
if self.moving_left and self.rect.left > 0:

# 这个就给x减self.ai_settings.ship_speed_factor,这个文件在PingMuXianShi文件里面
self.rect.centerx-=self.ai_settings.ship_speed_factor

#self.rect.centerx=self.center

# 创建一个blitme类
def blitme(self):

# 在屏幕上绘制图形
self.screen.blit(self.ima,self.rect)

上面的代码介绍

1
2
3
4
5
6
7
8
9
10
if self.moving_right and self.rect.right < self.screen_rect.right:

# 这个就给x加self.ai_settings.ship_speed_factor,这个文件在PingMuXianShi文件里面
self.rect.centerx+=self.ai_settings.ship_speed_factor


if self.moving_left and self.rect.left > 0:

# 这个就给x减self.ai_settings.ship_speed_factor,这个文件在PingMuXianShi文件里面
self.rect.centerx-=self.ai_settings.ship_speed_factor

代码1

1
if self.moving_right and self.rect.right < self.screen_rect.right:
  1. self.moving_right:self.moving_right在game_funcltions文件里面有键盘监听事件按键按下右键去就会吧这个属性设置成True

  2. self.rect.right:self.rect.right获得外部矩形位置,就是图像的位置

  3. self.screen_rect.right:# self.screen_rect.right记录长度,就是窗口的长度

self.screen_rect.right是1200,self.rect.right如果他向左移动到1200就是到了最右边了

代码2

  1. self.moving_left:self.moving_left在game_funcltions文件里面有键盘监听事件按键按下右键去就会吧这个属性设置成True

  2. self.rect.left:self.rect.left记录右边框还下多少距离,如果是0就错误不执行

运行结果

![2021-03-21 09-10-02](https://zssnp-1301606049.cos.ap-nanjing.myqcloud.com/img/2021-03-21 09-10-02.png)

重构

现在发现代码已经很长了,我们可以给check_events()函数已经很长了

game_funcltions.py文件代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import sys 
import pygame


def check_keydown_events(event,ship):
# K_RIGHT这个就是我们键盘的右建事件如果我们点击和松开了下面就会被执行
if event.key==pygame.K_RIGHT:

# 就会叫这个ship.moving_right属性设置为True
ship.moving_right=True
# K_LEFT这个就是我们键盘的左建事件如果我们点击和松开了下面就会被执行
elif event.key==pygame.K_LEFT:

# 就会叫这个self.moving_left属性设置为True
ship.moving_left=True





def check_keyup_events(event,ship):
# K_RIGHT这个就是我们键盘的右建事件如果我们点击和松开了下面就会被执行
if event.key==pygame.K_RIGHT:

# 就会叫这个ship.moving_right属性设置为False
ship.moving_right=False

## K_LEFT这个就是我们键盘的左建事件如果我们点击和松开了下面就会被执行
elif event.key==pygame.K_LEFT:

# 就会叫这个self.moving_left属性设置为False
ship.moving_left=False


# 监听键盘和鼠标的事件
def check_events(ship):
for event in pygame.event.get():
# 点击窗口的关闭,就会检查到pygame.QUIT然后退出循环
if event.type==pygame.QUIT:
sys.exit()

# 监听建键盘的建,如果你按键盘了他是会被执行
elif event.type==pygame.KEYDOWN:

# 调用check_keydown_events函数穿event和ship参数
check_keydown_events(event,ship)
# 我们按键松开就会检查到KEYUP事件,下面的代码就会执行
elif event.type==pygame.KEYUP:
# 调用check_keyup_events函数穿event和ship参数
check_keyup_events(event,ship)


def update_screen(xian_shi,screen,ship):

# 填充颜色 ,用的是PingMuXianShi文件里面的XianShi类的gb属性
screen.fill(xian_shi.gb)

# 绘制飞船
ship.blitme()

# 绘制屏幕可见
pygame.display.flip()

射击

更新中………………….