pygame 各模块详解笔记

Top

系统变量设置

- os.environ['SDL_VIDEO_CENTERED'] = '1'  # 游戏窗口居中

精灵

- self.mask = pygame.mask.from_surface(self.image1)
- 碰撞检测使用:pygame.sprite.spritecollide(me, enemies, False, pygame.sprite.collide_mask)

pygame 常用模块

pygame.display

- screen =  pygame.display.set_mode((100, 200))  # 创建窗口 元素, 类似 画板, 返回一个Surface对象
	- screen.fill((R, G, B)) # 给此 窗口元素 填充背景 颜色 , 
    - screen.blit(element, (x, y)|element_rect) # 在此 窗口元素上 画 其他 元素
- pygame.display.set_caption('window-size')  # 设置 窗口标题 
- pygame.display.update()  # 重绘, 数据画到前面显示
- pygame.display.flip()    # 更新 显示, 交替显示,实质 为 update()  方法

pygame.image

img_url = "background.png"
background = pygame.image.load(img_url)  #  创建图片 元素
background.convert()            # 默认添加  
background.convert_alpha()      # 可透明
background_rect = background.get_rect()  # 获取此图片的 矩形区域管理对象 (x, y, width , height)
background_width = background.get_width()   # 获取此图片的 宽,== background_rect[2]
background_height = background.get_height() # 获取此图片的 高,== background_rect[3]

screen.blit(background, (x, y)) #  将此图片元素 画到  窗口元素上, 第二个元素为 坐标 元组,
# 也可以写为
background_rect[0] = 100  # 通过此图片元素的矩形区域管理对象  直接  设置 此 元素的  x  坐标 
background_rect[1] - 200  # 通过此图片元素的矩形区域管理对象  直接  设置 此 元素的  y  坐标 
screen.blit(background, background_rect) # 将第二个参数 坐标元组 替换为 此图片的 矩形区域管理对象。

pygame.image.save(name_surface, 'name.png')    # 保存为一个图片文件 , 第一个 参数为 字体元素 

#  此图片的 矩形区域管理对象 的 方法:
background_rect = background_rect.move([x, y ])   # 移动 此图片元素的 位置, 
# 注意: 每次移动 完 矩形, 一定要接收 新的  矩形对象, 很重要, !!!!!!!	 
background_rect.colliderect(other_rect)  # 判断两个 矩形区域对象 是否相撞


pygame.surface 位图

# 俗称 ----  位图, 可以是一个屏幕 对象、图片对象, 字体对象
screen = pygame.display.set_mode((640, 480))
image = pygame.image.load("xxx", (200, 300))
# 创建空的 位图
	#  需指定 尺寸, 如果不指定尺寸,那么就创建一个和屏幕一样大小的。
bland_surface = pygame.Surface((256, 256), flags=SRCALPHA, depth=32) 
	- flags -> HWSURFACE # 类似于前面讲的,更快!不过最好不设定,Pygmae可以自己优化。
	- depth -> SRCALPHA  # 有Alpha通道的surface,如果你需要透明,就要这个选项。这个选项的使用需要第二个参数为32~
# 位图的转换
	- surface.convert()     # 转换 图像的 像素格式
	# 使用透明的方法绘制前景对象, 加载 alpha 通道, 当然普通的图片也是可以使用这个方法的,用了也不会有什么副作用
	- surface.convert_alpha()
# 填充 Surface
	- surface.fill((R, G, B)) # 使用 颜色 填充 Surface
	
# blitting  # blit的的中文翻译给人摸不着头脑的感觉,可以译为位块传送(bit block transfer)
	# 把不同的帧(同一副图的不同位置)画到屏幕上
- screen.blit(ogre, (300, 200), (100 * frame_no, 0, 100, 100))
# 位图 方法
width, height = image.get_size()  #  获取 位图的 尺寸
surface.blit(surface) # 将一个 位图 画到另一个 位图上
surface.get_rect()   # 获取 此 位图的  矩形 区域

子表面 Surface

my_font_image = Pygame.load("font.png")
letters = []
letters["a"] = my_font_image.subsurface((0,0), (80,80))
letters["b"] = my_font_image.subsurface((80,0), (80,80))

设置Surface的像素

screen.set_at(rand_pos, rand_col)
	1. 位置
    2. rgb 颜色

获取 Surface 的像素

rand_col = screen.set_at(rand_pos)
	- 接收一个地址坐标
    - 返回坐标像素值
# get_at在对hardware surface操作的时候很慢,而全屏的时候总是hardware的,所以慎用这个方法!

锁定Surface

# 当Pygame往surface上画东西的时候,首先会把surface锁住,以保证不会有其它的进程来干扰,画完之后再解锁。锁和解锁时自动发生的
# 当你手动加锁的时候,一定不要忘记解锁,否则pygame有可能会失去响应
screen = pygame.display.set_mode((640, 480), 0, 32)
- screen.lock()     # 上锁
- screen.unlock()   # 解锁

pygame.rect 管理矩形区域对象->官网

# 例如: 用例对象
r = background.get_rect() # 获取 此图片元素的 矩形区域管理对象
# 矩形参数:
    r.left    # 左边框的   x  坐标
    r.right   # 右边框的   x  坐标
    r.top     # 上边框的   y  坐标
    r.bottom  #  下边框的  y  坐标  
    r.centerx #  中央 x  坐标的 整数值
    r.centery #  中央 y  坐标的 整数值
    
    r.width   # 宽度
    r.height  # 高度
    r.size    # 元祖 对象 (width, height)
    
    r.topleft     # 左上 顶点坐标    (left,top)
    r.topright    # 右上 顶点坐标 (right,top)
    r.bottomleft  # 左下 顶点坐标 (left,bottom)
    r.bottomright # 右下 顶点坐标  (right,bottom)
    r.midleft     #  (left,centery)
    r.midright    #  (right,centery)
    r.midtop      #  (centerx,top)
    r.midbottom   #  (centerx,bottom)
# 注意:
	- 也可 通过设置 矩形 对象的 某一个顶点坐标 , 来达到 确定 矩形 位置 的 目的, 
r.colliderect(Rect) # return  Bool  测试两个矩形是否重叠

pygame.font

display_text = "ShiWei is a Good Boy!"
font = pygame.font.Sysfont("Arial", 50)        # 使用系统字体创建字体元素, 字体类型和字体大小 
font02 = pygame.font("{字体文件地址}", 50)     # 使用自定义字体文件创建字体元素, 
pygame.font.get_fonts()                        # 获取当前系统所有的可用字体
font = font.render(display_text, -1, (255, 255, 255),(R, G, B)) # 渲染 此 字体 元素 
  	"""
  	  - 第一个参数是写的文字,
      - 第二个参数是个布尔值(代表是否开启抗锯齿),就是说True的话字体会比较平滑,不过相应的速度会有一点点的影响;
      - 第三个是字体颜色;
      - 第四个是背景色,如果你不想有背景色(也就是透明),那么可以不加这第四个参数
      """
pygame.image.save(font, "name.png") # 将此字体保存为字体文件
font_rect = font.get_rect()         #  获取 字体 元素 的 矩形区域管理对象,
  # 参数解析:	  1. 要显示的 文本 
  # 			2. 透明度
  #			    3. 字体的 颜色, R, G, B
  font.set_bold(bool):        # return None 粗体
  font.set_underline(bool):   # return None 添加下划线
  font_height = font.get_linesize() # 获取字体的行高
  font.set_italic (bool):     # return None  斜体
  # 最后, 同理 , 将此 字体元素 画到 窗口 元素 上 
  screen.blit(font, (200, 300)) # 第二个元素 为 位置 元组   
  

pygame.event

events = pygame.event.get() # 获取所有 事件, 
for event in events:
    if event.type == pygame.QUIT:            # 此事件的 类型 
		sys.exit()                          

pygame.time

clock = pygame.time.Clock()  # 获取 时钟 对象
clock.tick(60)               # 设置每秒执行  60 次
pygame.time.delay(500)       # 游戏时间 延迟   

pygame.time.get_ticks()   # 得到以毫秒为间隔的时间
pygame.time.wait()        # 暂停程序一段时间
pygame.time.delay()       # 暂停程序一段时间
pygame.time.set_timer()   # 在事件队列上重复创建事件
pygame.time.Clock()       # 创建一个对象来帮助跟踪时间

pygame.mouse

x, y = pygame.mouse.get_pos() # 获取鼠标的 坐标位置 
pygame.mouse.get_pressed  # 返回按键按下情况,返回的是一元组,分别为(左键, 中键, 右键),如按下则为True
pygame.mouse.get_rel  # 返回相对偏移量,(x方向, y方向)的一元组
pygame.mouse.get_pos  # 返回当前鼠标位置(x, y)
pygame.mouse.set_pos #  显而易见,设置鼠标位置
pygame.mouse.set_visible  #  设置鼠标光标是否可见
pygame.mouse.get_focused  # 如果鼠标在pygame窗口内有效,返回True
pygame.mouse.set_cursor # 设置鼠标的默认光标式样,是不是感觉我们以前做的事情白费了?哦不会,我们使用的方法有着更好的效果。
pyGame.mouse.get_cursor  # 不再解释。

pygame.key

key.get_focused  # 返回当前的pygame窗口是否激活
key.get_pressed  # 刚刚解释过了
key.get_mods    # 按下的组合键(Alt, Ctrl, Shift)
key.set_mods    # 你也可以模拟按下组合键的效果(KMOD_ALT, KMOD_CTRL, KMOD_SHIFT)
key.name         # 接受键值返回键名
key.set_repeat   
# 无参数调用设置pygame不产生重复按键事件,二参数(delay, interval)调用设置重复事件发生的时间

pygame.draw 绘制形状, 线, 点

pygame.draw.rect(Surface, color, Rect, width=0) 	        # 绘制矩形
# 参数
	- Surface,  
    - color, 
    - Rect,     # 坐标
    - width=0   # 线宽 , 0 或 省略, 则填充 
pygame.draw.polygon(Surface, color, pointlist, width=0)      # 绘制多边形(三个及三个以上的边)
	- pointlist #  一系列坐标的列表,代表了各个顶点
pygame.draw.circle(Surface, color, pos, radius, width=0) 	 # 绘制圆
pygame.draw.ellipse(Surface, color, Rect, width=0)           # 绘制椭圆
pygame.draw.arc(Surface, color, Rect, start_angle, stop_angle, width=1) 	# 绘制圆弧
pygame.draw.line(Surface, color, start_pos, end_pos, width=1) 	# 绘制线
pygame.draw.lines(Surface, color, closed, pointlist, width=1) 	# 绘制一系列的线
	- closed    # 是否需要多画一条线来使这些线条闭合(感觉就和polygone一样了)
    - pointlist # 	一系列点坐标的列表
pygame.draw.aaline 	# 绘制一根平滑的线
pygame.draw.aalines # 绘制一系列平滑的线


# 其他形状
  pygame.draw.polygon(surface,color,pointlist,width=0)  #  多边形
  pygame.draw.circle(surface,color,pos,radius,width=0)   #   圆
  pygame.draw.ellipse(surface,color,Rect,width=0)       #  椭圆
  pygame.draw.arc(surface,color,Rect,start_angle,stop_angle,width=1) # 圆弧
  pygame.draw.line(surface,color,start_pos,end_pos,width=1)   # 直线;
  pygame.draw.lines(surface,color,closed,pointlist,width=1)    # closed为一bool值,表示是否封闭;
  pygame.draw.aaline(surface,color,start_pos,end_pos,width=1)   # 根平滑的线;
  pygame.draw.aalines(surface,color,closed,pointlist,width=1)    # 列平滑的线;

pygame.transform

suosuo = pygame.image.load("xxxxx")
w, h = suosuo.get_size()

suosuo = pygame.transform.scale(suosuo, (w * 2, h * 2))        # 实现快速缩放,调整为新分辨率
suosuo = pygame.transform.smoothscale(suosuo, (w*2, h*2))  # 平滑地将表面缩放到任意大小,(块级抗锯齿技术)


pygame.sprite 精灵

碰撞检测

# collide : 碰撞 
spritecollide(sprite,group,dokill,collided = None)-> Sprite_list # 在组中查找与另一个精灵相交的精灵
"""返回值为 : 组中与另一个Sprite相交的所有Sprite的一个 列表
   参数解析 :
        - dokill : 布尔值, 在组中所有碰撞的Sprite是否从组中删除
        - collided : 回调函数, 用于计算两个精灵是否发生碰撞, 以两个精灵为值, 返回两个布尔值, 
"""
collide_rect(left, right) -> bool # 使用 rects 检测两个精灵之间的碰撞。 两个精灵必须要有 “rect” 属性
collide_circle(left, right) -> bool # 使用圆圈,在两个精灵之间进行碰撞检测。
""" 若精灵具有 “radius”属性, 则用于创建圆, 否则将创建一个基于矩形的 外接圆。
	两个精灵图必须具有 “rect” 属性 和 可选的 “radius” 属性
"""
groupcollide(group1, group2, dokill1, dokill2, collided = None) -> Sprite_dict 
""" 查找在两组之间碰撞的所有精灵
    返回值 : 为一个字典, 键为组 1 中的精灵,  值为在 组 2 中与键 发生碰撞的所有精灵 
    参数解析: 
    	- dokill1 : 组 1  中的 碰撞精灵是否删除
    	- dokill2 : 组 2  中的 碰撞精灵是否删除
    	- collided : 回调函数 , 用于计算两个精灵是否发生碰撞, 以两个精灵为形参值, 返回值为布尔值,
    				每个精灵必须有 "rect" 属性
"""
spritecollideany(sprite, group, collided = None) -> Sprite #  测试精灵是否与组中的任何事物相交 
""" 返回值: 组中的 单个小精灵 , 无碰撞时,不返回任何内容 
    参数解析: collided : 回调函数 ,  以两个精灵为形参值, 返回值为布尔值, 每个精灵必须有 "rect" 属性
"""

精灵组的使用 pygame.sprite.Group()

# 源码:
class Group(AbstractGroup):
    def __init__(self, *sprites):
        AbstractGroup.__init__(self)
        self.add(*sprites)
# 方法解析:
- sprites() -> sprite_list        # 返回该组包含的所有Sprite的列表。您也可以从组中获取迭代器
- copy() -> Group                 # 创建一个具有与原始精灵相同的新精灵的新群组
- add(*sprites) -> None           # 将任意数量的精灵添加到该组。这只会添加尚未成为组成员的Sprite。
					                    #每个精灵参数也可以是包含精灵的迭代器
- remove(*sprites) -> None        # 从组中删除任意数量的Sprite。这只会删除已经是组成员的Sprite。
                                          # 每个精灵参数也可以是包含精灵的迭代器
- has(*sprites) -> bool           # 快速检查该组是否包含某个精灵或精灵列表,则返回True 
- update(*args, **kwargs) -> None # 调用组中的所有 Sprite 上调用此方法
- draw(Surface) -> None           # 绘制组中的所有精灵, 
	# 源码如下: 
        def draw(self, surface):
            sprites = self.sprites()
            surface_blit = surface.blit
            for spr in sprites:
                self.spritedict[spr] = surface_blit(spr.image, spr.rect)
            self.lostsprites = []
- empty() -> None                  # 从组中删除所有精灵 
- clear(Surface_dest, background) -> None  # 

事件类型

所有事件类型 均为 pygame 模块的 全局属性, 且 全为大写。 可 from pygame.locals import * 导入 所有

键盘事件

- pygame.KEYUP             # 键盘 被放开 事件  (key  up)
- pygame.KEYDOWN            # 键盘 被按下 事件 (key  down)
	- key # 按下或者放开的键值,是一个数字,估计地球上很少有人可以记住,所以Pygame中你可以使用K_xxx来表示,比如字母a就是K_a,还有K_SPACE和K_RETURN等。
	- mod # 包含了组合键信息,如果mod & KMOD_CTRL是真的话,表示用户同时按下了Ctrl键。类似的还有KMOD_SHIFT,KMOD_ALT。
	- unicode # 代表了按下键的Unicode值,这个有点不好理解,真正说清楚又太麻烦,游戏中也不太常用,说明暂时省略,什么时候需要再讲吧。

鼠标事件

- pygame.MOUSEMOTION       #  鼠标移动 事件 (mouse  motion)
	- buttons #  一个含有三个数字的元组,三个值分别代表左键、中键和右键,1就是按下了。
    - pos     # 就是位置了……
    - rel     # 代表了现在距离上次产生鼠标事件时的距离
- pygame.MOUSEBUTTONDOWN   # 鼠标按下 事件  (mouse  button  down)
- pygame.MOUSEBUTTONUP         #  鼠标 放开事件 (mouse  button  up)
	- button #  看清楚少了个s,这个值代表了哪个按键被操作
	- pos    # 和上面一样

窗口缩放事件

-  pygame.VIDEORESIZE               # pygame  窗口 缩放 事件  (video  resize)
	- size  # 一个二维元组,值为更改后的窗口尺寸,size[0]为宽,size[1]为高
    - w     # 宽
    - h     # 一目了然,高;之所以多出这两个,无非是为了方便

常用常量

- pygame.K_LEFT           # 方向键  左键
- pygame.K_RIGHT          # 方向键  右键
- pygame.K_UP             # 方向键  上键
- pygame.K_DOWN           # 方向键  下键
- pygame.QUIT             # 单击 关闭 窗口 事件  

# 事件过滤
  - pygame.event.set_blocked(事件名) # 参数为事件类型, 也可是一个 列表,
  - pygame.event.set_allowed()       # 表示允许的事件
# 产生事件


pygame的错误处理

try:
    screen = pygame.display.set_mode(SCREEN_SIZE)
except pygame.error, e:
    print "Can't create the display :-("
    print e
    exit()

其实就是Python的标准的错误捕捉方法, 错误捕捉很重要

遍历圆周上的点

import math
math.degrees(弧度)  # 弧度转角度
math.radians(角度)  # 角度转弧度
# 注意: 三角函数 都以  弧度制 为 参数
math.cos() * 半径  # 余弦函数 , 计算 x  坐标
math.sin() * 半径  # 正弦函数 , 计算 y  坐标

绘制钟表时针

# 绘制时针
radian = math.radians(hour * 30 - 90)
x = math.cos(radian) * (radius - 80) + pos_x - 10
y = math.sin(radius) * (radius - 80) + pos_y - 10
pygame.draw.line(screen, color, (pos_x, pos_y), (x, y), 15)

py2exe 打包程序

官方网站

1. 不支持 python 3.7 

参考 博客

小侯军

Pygame写游戏 02 处理事件的使用

Pygame写游戏 03 窗口显示的设置

Pygame写游戏 04 字体的使用

Pygame写游戏 05 色彩 、像素的 使用

Pygame写游戏 06 使用Surface对象

Pygame写游戏 07 画图形的使用

Pygame写游戏 09 向量的使用

Pygame写游戏 10 键盘的使用

Pygame写游戏11 鼠标的使用

覆手为云p

pygame模块参数汇总

马三小伙

pygame 游戏开发

目光博客

写游戏外挂

posted @ 2020-05-22 14:53  梭梭666  阅读(63)  评论(0编辑  收藏  举报
返回顶部