一.简介
pygame
-
顶级pygame包
pygame.init - 初始化所有导入的pygame模块 pygame.quit - uninitialize所有pygame模块 pygame.error - 标准的pygame例外 pygame.get_error - 获取当前错误消息 pygame.set_error - 设置当前的错误消息 pygame.get_sdl_version - 获取SDL的版本号 pygame.get_sdl_byteorder - 获取SDL的字节顺序 pygame.register_quit - 注册pygame退出时要调用的函数 pygame.encode_string - 编码Unicode或字节对象 pygame.encode_file_path - 将Unicode或字节对象编码为文件系统路径 pygame包代表其他人使用的顶级包。Pygame本身被分解成许多子模块,但这不会影响使用pygame的程序。
为方便起见,pygame中的大多数顶级变量都放在名为“pygame.locals”的模块中。除了'import pygame'之外,这意味着与'from
pygame.locals
import *' 一起使用 。当你'导入pygame'时,会自动导入所有可用的pygame子模块。请注意,某些pygame模块被视为“可选”,可能无法使用。在这种情况下,pygame将提供占位符对象而不是模块,可用于测试可用性。
pygame.
init
()-
初始化所有导入的pygame模块init() - >(numpass,numfail)
初始化所有导入的pygame模块。如果模块失败,则不会引发异常,但如果成功那么失败的总数将作为元组返回。您始终可以手动初始化单个模块,但
pygame.init()
初始化所有导入的pygame模块是一种方便的方法来启动所有操作。init()
各个模块的功能会在失败时引发异常。您可能希望单独初始化不同的模块以加速您的程序或不使用您的游戏没有的东西。
init()
不止一次调用它是安全的:重复调用将不起作用。即使您拥有pygame.quit()
所有模块也是如此。
pygame.
quit
()-
uninitialize所有pygame模块退出() - >无
取消初始化之前已初始化的所有pygame模块。当Python解释器关闭时,无论如何调用此方法,因此您的程序不应该需要它,除非它想要终止其pygame资源并继续。不止一次调用此函数是安全的:重复调用无效。
注意,
pygame.quit()
取消初始化所有pygame模块不会退出程序。考虑让你的程序以与普通python程序结束相同的方式结束。
- 异常
pygame.
error
-
标准的pygame例外raise pygame.error(message)
pygame或
SDL
操作失败时会引发此异常。您可以捕获任何预期的问题并处理错误。始终会引发有关问题的描述性消息的异常。派生自RuntimeError异常,也可用于捕获这些引发的错误。
pygame.
get_error
()-
获取当前错误消息get_error() - > errorstr
SDL
维护内部错误消息。当引发pygame.error()
标准的pygame异常时,通常会给你这条消息。您很少需要调用此函数。
pygame.
set_error
()-
设置当前的错误消息set_error(error_msg) - >无
SDL
维护内部错误消息。当引发pygame.error()
标准的pygame异常时,通常会给你这条消息。您很少需要调用此函数。
pygame.
get_sdl_version
()-
获取SDL的版本号get_sdl_version() - > major,minor,patch
返回
SDL
库的三个版本号。此版本在编译时构建。它可用于检测pygame可能无法使用哪些功能。get_sdl_version是pygame 1.7.0中的新功能
pygame.
get_sdl_byteorder
()-
获取SDL的字节顺序get_sdl_byteorder() - > int
返回
SDL
库的字节顺序。它返回LIL_ENDIAN
小端字节顺序和BIG_ENDIAN
大端字节顺序。get_sdl_byteorder是pygame 1.8中的新功能
pygame.
register_quit
()-
注册pygame退出时要调用的函数register_quit(callable) - > None
当
pygame.quit()
未初始化所有pygame模块时,将调用所有已注册的退出函数。Pygame模块在初始化时会自动执行此操作。常规pygame用户不需要此功能。
pygame.
encode_string
()-
编码Unicode或字节对象encode_string([obj [,encoding [,errors [,etype]]]]) - > bytes或None
obj:如果是Unicode,则编码; if bytes,返回不变; 如果有的话,返回None; 如果没有给出,则引发SyntaxError。
encoding(string):如果存在,则使用编码。默认为'unicode_escape'。
errors(string):如果给出,如何处理不可编码的字符。默认为'backslashreplace'。
etype(异常类型):如果给定,则为编码错误引发异常类型。默认值为UnicodeEncodeError,由返回
PyUnicode_AsEncodedString()
。对于默认编码和错误值,应该没有编码错误。此函数用于编码文件路径。支持关键字参数。
在pygame 1.9.2中添加(主要用于单元测试)
pygame.
encode_file_path
()-
将Unicode或字节对象编码为文件系统路径encode_file_path([obj [,etype]]) - > bytes或None
obj:如果是Unicode,则编码; if bytes,返回不变; 如果有的话,返回None; 如果没有给出,则引发SyntaxError。
etype(异常类型):如果给定,则为编码错误引发异常类型。默认值为UnicodeEncodeError,由返回
PyUnicode_AsEncodedString()
。此函数用于编码pygame中的文件路径。编码是由返回的编解码器
sys.getfilesystemencoding()
。支持关键字参数。在pygame 1.9.2中添加(主要用于单元测试)
pygame.version
-
包含版本信息的小模块
pygame.version.ver - 版本号作为字符串 pygame.version.vernum - 版本的整数整数 pygame.version.rev - 构建的存储库修订版 这个模块会自动导入到pygame包中,并提供一些变量来检查已经导入的pygame版本。
pygame.version.
ver
-
版本号作为字符串ver ='1.2'
这是表示为字符串的版本。它也可以包含一个微型版本号
e.g.
,'1.5.2'
pygame.version.
vernum
-
版本的整数整数vernum =(1,5,3)
该版本的变量可以很容易地与相同格式的其他版本号进行比较。检查pygame版本号的示例如下所示:
if pygame.version.vernum < (1, 5): print 'Warning, older version of pygame (%s)' % pygame.version.ver disable_advanced_features = True
pygame.version.
rev
-
构建的存储库修订版rev ='a6f89747b551 +'
从中构建此程序包的存储库检出的Mercurial节点标识符。如果标识符以加号'+'结尾,则包中包含未提交的更改。请在错误报告中包含此修订号,特别是对于非发布的pygame构建。
二.代码实现
1 # -*- coding: utf-8 -*- 2 """ 3 Created on Sat Jan 30 12:21:29 2019 4 5 @author: zhen 6 """ 7 8 import pygame 9 import time 10 import random 11 from pygame.locals import * 12 """ 13 1.搭建界面,主要是完成窗口和背景图片 14 """ 15 16 17 def main(): 18 # 1.创建一个窗口,用来显示内容 19 screen = pygame.display.set_mode((480, 620), 0, 32) 20 # 设置名称 21 pygame.display.set_caption('飞机大战') 22 # 2.创建一个和窗口大小一样的图片用来充当背景 23 background = pygame.image.load("D:图片stars2.jpg") 24 # 3.创建飞机 25 plane = pygame.image.load("D:图片hero3.png") 26 # 4.创建敌机 27 dj = pygame.image.load("D:图片dj1.png") 28 # 创建飞机坐标变量 29 x = 220 30 y = 570 31 # 创建敌机初始坐标 32 djx = 0 33 djy = 0 34 # 设置敌机移动方向 35 dj_move_direct = "right" 36 # 创建友军飞机子弹 37 fires = [] 38 x_loc = [] 39 y_loc = [] 40 # 创建友军子弹的初始位置 41 fx = x + 20 42 fy = 540 43 # 友军子弹,默认不显示 44 fire_show = "false" 45 # 创建敌机子弹 46 djzds = [] 47 djx_loc = [] 48 djy_loc = [] 49 # 敌机子弹初始位置 50 djzdx = 0 51 djzdy = 0 52 while True: 53 # 设定需要显示的背景图片,把背景图片覆盖窗口 54 screen.blit(background, (0, 0)) 55 # 显示飞机 56 screen.blit(plane, (x, y)) 57 # 显示友军子弹 58 if fire_show == "true": 59 for i in range(len(fires)): 60 if fire_show == "true": 61 y_loc[i] = y_loc[i]-5 62 screen.blit(fires[i], (x_loc[i], y_loc[i])) 63 64 # 显示敌机 65 screen.blit(dj, (djx, djy)) 66 # 敌机自动移动 67 if djx > 400: 68 dj_move_direct = "left" 69 elif djx < 0: 70 dj_move_direct = "right" 71 72 if dj_move_direct == "right": 73 djx += 1 74 else: 75 djx -= 1 76 77 # 添加敌机子弹 78 rand = random.randint(1, 100) 79 if rand == 6 or rand == 8: 80 djzd = pygame.image.load("D://图片/zd3.png") 81 djzds.append(djzd) 82 djx_loc.append(djx + 30) 83 djy_loc.append(djy + 40) 84 # 显示敌机子弹 85 for i in range(len(djzds)): 86 djy_loc[i] = djy_loc[i] + 5 87 screen.blit(djzds[i], (djx_loc[i], djy_loc[i])) 88 # 更新需要显示的内容 89 pygame.display.update() 90 # 获取事件 91 for event in pygame.event.get(): 92 # 判断是否点击了退出按钮 93 if event.type == QUIT: 94 print("exit") 95 exit() 96 elif event.type == KEYDOWN: 97 # 检测是否是按键A或左方向键 98 if event.key == K_a or event.key == K_LEFT: 99 print("event.key == K_a or event.key == K_LEFT") 100 if x > 0: 101 x -= 10 102 # 检测是否是按键D或右方向键 103 elif event.key == K_d or event.key == K_RIGHT: 104 print("event.key == K_d or event.key == K_RIGHT") 105 if x < 420: 106 x += 10 107 elif event.key == K_SPACE: 108 fire_show = "true" 109 # 创建新的友军子弹,面向过程编程已经出现麻烦的情况了,坐标要分开放置 110 fire = pygame.image.load("D://图片/fire5.png") 111 fires.append(fire) 112 x_loc.append(x + 20) 113 y_loc.append(fy) 114 print("fire") 115 # 休眠 116 time.sleep(0.01) 117 118 119 if __name__ == "__main__": 120 main()
三.结果
敌机开火&同时开火
四.分析
使用pygame编写一些小型游戏简洁易上手,在使用面向过程的编码方式编写时,随着逻辑复杂提高,代码的不断增加的情况下,编码越卖越复杂且难以修改,建议使用面向对象的编码方式!
五.素材
敌机:https://www.cnblogs.com/images/cnblogs_com/yszd/1394555/t_dj1.png
敌机子弹:https://www.cnblogs.com/images/cnblogs_com/yszd/1394555/t_zd3.png
友军:https://www.cnblogs.com/images/cnblogs_com/yszd/1394555/t_hero3.png
友军子弹:https://www.cnblogs.com/images/cnblogs_com/yszd/1394555/t_fire5.png