Package: cpgzh
cpgzh介绍本作品基于pgzero，主要用于少儿编程教学方面。增加了一些功能并加了一些中文介绍，方便国内用户使用，更新日志可以拖到底部查看，用法基本和pgzero一致，增加的功能用法请查看example.py文件，特别感谢：pgzhelper：一个新加坡机构做的模块，本作品参考了挺多内容，官网地址：https://www.aposteriori.com.sg/pygame-zero-helper/。黄复雄老师：黄老师对pgzhelper进行了翻译，感兴趣的同学可以查看：https://zhuanlan.zhihu.com/p/347855713。Muspi Merol老师：Muspi Merol老师为本项目贡献了一些建设性意见并协助维护代码。当前功能列表创建延时任务和切换动画输入框等杂项功能，增加游戏界面的交互功能、数据存储功能整合绘图命令，接口更加统一便捷的字体造型，写字不再繁琐，使用微软雅黑字体默认支持中文导入了pgzero常见的功能，编写游戏时候从cpgzh中导入相关东西即可软件架构基于pgzero、pgzhelper和guizero。安装教程使用pip安装即可：pip3 install cpgzh使用说明使用方法和pgzero基本相同，多了几个方法而已，下面对我增加的功能进行介绍，其他的移步官网或者黄复雄老师的文档即可。一、Actor类的增强这些功能都是封装在Actor类当中的。1、延时任务首先在创建角色的时候创建master对象monv=Actor("恶魔女_人偶-待机-000.png",center=(800,400))monv.images=[f"恶魔女_人偶-待机-{i:0>3}.png"foriinrange(30)]master=Master()然后在合适位置创建延迟任务defon_key_down(key):# 等待1s后隐藏ifkey==keys.X:master.create_delay_tasks(monv.hide,1)然后在update()函数中调用master的run_tasks方法defupdate():"更新数据"master.run_tasks()create_delay_tasks方法总共有四个参数：task：要执行的任务，一般为某个函数或者方法。seconds：延迟的时间是多少秒。times：这个任务执行多少次。args：这个任务要用到的参数，请传入一个可迭代对象，比如列表或者元组。只写第一个参数就是等待1秒执行1次task。2、自动切换造型fromcpgzhimport*jisi=Actor('大祭司_人偶-待机-000.png',center=(400,400))jisi.images=[f'大祭司_人偶-待机-{i:0>3}.png'foriinrange(30)]# 绑定造型列表，根据你的素材来吧defdraw():jisi.draw()go()使用jisi.images = [f'大祭司_人偶-待机-{i:0>3}.png' for i in range(30)]给jisi角色绑定要切换的造型；设置jisi.animate_fps可以获取或设置切换造型的速度，默认为每秒钟切换10次，如果要切换100次就设置100即可：jisi.animate_fps=100；如果要停止造型的切换只需要将jisi.animate_fps设置为0即可：jisi.animate_fps=0;还提供一个方法：jisi.toggle_animate()，如果角色在切换造型，这个方法就会停止切换，反之将会开始切换（切换回来animate_fps=10）。3、隐藏和显示Actor类封装了hide和show两个方法，我们可以很方便的使用他来显示和隐藏角色，示例代码：fromcpgzhimport*monv=Actor('魔女_人偶-待机-000.png',center=(400,400))monv.images=[f'魔女_人偶-待机-{i:0>3}.png'foriinrange(30)]# 绑定造型列表，根据你的素材来吧defupdate():monv.animate()# 根据设定的频率切换造型defdraw():monv.draw()defon_key_down(key):'当键盘按下时'# 停止切换造型elifkey==keys.U:monv.animate_fps=0# 隐藏角色elifkey==keys.V:monv.hide()# 显示角色elifkey==keys.W:monv.show()# 等待1s后隐藏elifkey==keys.X:master.create_delay_tasks(monv.hide,1)# 等待1s后显示elifkey==keys.Y:master.create_delay_tasks(monv.show,1)go()还有其他一系列功能，详见example.py文件中的示例。二、输入框等杂项功能增加了一系列功能，包括输入、切换全屏、加载和保存数据等等，他们封装在master、mouse或者keyboard当中，以键盘按下执行一些功能示例如下：#实例化管家fromcpgzhimportMastermaster=Master()#实例化的时候可以直接传递存档位置作为参数defon_key_down(key):# 设置全屏化ifkey==keys.A:master.set_fullscreen()# 设置窗口化elifkey==keys.B:master.set_windowed()# 切换全屏和窗口化elifkey==keys.C:master.toggle_fullscreen()# 隐藏鼠标elifkey==keys.D:mouse.hide()# 显示鼠标elifkey==keys.E:mouse.show()# 输入文本elifkey==keys.F:text=master.input("请输入一个名字:")print(text)# 选择文件elifkey==keys.G:text=master.select_file("请选择一个文件：")print(text)# 保存文件elifkey==keys.H:text=master.select_file_save("请选择存档保存位置：")print(text)# 选择文件夹elifkey==keys.I:text=master.select_dir("请选择一个文件夹:")print(text)# 是否选择框elifkey==keys.J:text=master.yes_no("是否选择女装？")print(text)# 保存master的数据elifkey==keys.K:master.save_data()# 手动加载存储的数据elifkey==keys.L:# master.data.text = 'test'master.data_path="测试.dat"master.load_data()# 删除保存的数据elifkey==keys.M:master.del_data()# 设置动画的帧率elifkey==keys.N:fps=master.input("请输入动画切换的速度(每s切换多少次)：")jisi.animate_fps=int(fps)# 切换造型是否切换elifkey==keys.O:jisi.toggle_animate()# 提示信息elifkey==keys.P:master.msg("提示：\n你已经换好女装了")# 警告信息elifkey==keys.Q:master.warning("警告:\n今天的女装不太完美")# 错误信息elifkey==keys.R:master.error("错误：\n你还没换好女装")# 游戏开始elifkey==keys.S:print(master.data.start())# 获取游戏运行时常elifkey==keys.T:print(master.data.get_time())# 停止切换造型elifkey==keys.U:monv.animate_fps=0# 隐藏角色elifkey==keys.V:monv.hide()# 显示角色elifkey==keys.W:monv.show()# 等待1s后隐藏elifkey==keys.X:master.create_delay_tasks(monv.hide,1)# 等待1s后显示elifkey==keys.Y:master.create_delay_tasks(monv.show,1)# 按下空格键elifkey==keys.SPACE:print(key)# 增加透明特效elifkey==keys.Z:jisi.transparency+=10# 增加颜色特效elifkey==keys.K_1:monv.color_effect+=10需要特殊说明的是，master会自带一个数据保存的功能，绑定在master的data对象上，这个对象可以把绑定在他身上的数据保存到当前的目录，如果不指定master.dataPath属性会自动保存在data.dat文件中。默认情况下，master.data会有几个默认属性，包括游戏状态、时间、得分，你也可以自行绑定其他属性：classData:'数据存储类'def__init__(self,data_path)->None:'数据类'self.status=0# 游戏状态\self.time=0# 游戏持续时间self.score=0# 得分注意：在master类实例化的时候就会自动加载一次存档，所以这里要小心一些，容易出现奇怪的事情。为了数据的传递方便，master.data对象有个temp属性，这个属性会自动存放一些数据，比如选择的文件夹，或者输入的数据，也就是说获取输入的内容还可以这样写：master.input('请输入一个名字:')print(master.data.temp)存档相关功能如下：# 设置存档位置：master.data_path="测试.dat"# 保存master的数据master.save_data()# 手动加载存储的数据master.data.text='test'master.load_data()# 删除保存的数据master.del_data()# 打印得分print(master.data.score)三、整合绘图命令这些功能都是封装在Pen类当中的。对绘图命令进行了整合，可以更方便快速绘制各种图形。使用方法如下：1、导入并实例化Pen类fromcpgzhimport*pen=Pen()2、在draw函数中绘制想要的图形defdraw():# 绘制一个点pen.dot((300,50),50,'#ffff00')# 绘制一条线pen.line((250,50),(350,50),'#00ffff',20)# 绘制圆或者圆环pen.circle((100,200),100,'#ff0000',20)# 绘制椭圆或者椭圆环pen.ellipse((300,200),200,100,'#00ff00',20)# 绘制方块或者方块环pen.rect((500,200),200,200,'#0000ff',10,30)# 清屏pen.clear()四、便捷的写字和设置字体样式这些功能都是封装在Pen类和Font类当中的。pgzero字体设置比较繁琐，很多时候小伙伴们也不太知道那些个参数都是干啥的，每次写字都要写很多行，太难受了。所以对字体样式进行了封装，帮大家方便快速写字。建议做游戏时候将不同的字体先实例化成不同的对象，到时候用就可以了。使用方法如下：1、导入和实例化样式fromcpgzhimportFont# 导入字体样式类fromcpgzhimportpen# 导入画笔font1=FontStyle()# 实例化字体样式font1font1.color='red'# 修改颜色font2=FontStyle()# 实例化字体样式font2font2.color='blue'# 修改颜色font2.bold=True# 加粗font2.angle=180# 旋转180度2、写字下面的写字代码一定要放在draw函数中。# 默认样式写字pen.text('haha',topleft=(200,400))# font1样式写字pen.text('haha',font=font1,center=(200,450))# font2样式写字pen.text('haha',font=font2,center=(200,500))pen的text方法和textbox方法功能与pgzero的类似，唯一多了的是多了字体功能，大家如果哪里不明白可以参考pgzero的相关文档。3、修改样式我们可以修改font对象的参数，从而改变字体的样子，可以改的字体样式如下（可根据默认值修改）:font.bold=None#加粗font.italic=None# 斜体font.underline=None# 下划线font.color='black'# 字体颜色font.gcolor=None# 渐变色font.ocolor=None# 边框颜色font.scolor=None# 阴影颜色font.align='left'# 左对齐font.alpha=1.0# 不透明度font.angle=0# 旋转角度font.owidth=None# 边框宽度font.shadow=(0.0,0.0)# 阴影，x方向和y方向font.fontsize=30# 字体大小font.fontname='宋体'# 字体名字五、最简框架fromcpgzhimport*################################# 设置参数WIDTH=800# 设置宽度HEIGHT=600# 设置高度TITLE='游戏标题'################################# 创建角色################################# 自定义函数################################# 自动执行脚本defupdate():'更新数据，每帧执行'defdraw():'绘制角色'go()功能截图：(详见软件仓库，pypi不会显示)用法详情可以参考example.py文件更新日志2022-10-04master管家新增一个status成员，方便游戏状态控制删除actor的延迟任务接口，改用master控制2022-09-23新增功能修复颜色特效刷新不成功的bug。有多个造型变换的角色也能加颜色特效了。已知bug和不足增加颜色特效会超级卡顿，角色造型多的时候慎用。2022-09-15新增功能新增设置角色透明特效功能，特效范围0～100，透明特效增加10：actor.transparency += 10新增设置角色颜色特效功能，特效范围0~100，颜色特效增加10：actor.color_effect += 10已知bug和不足颜色特效目前只能针对当前角色的当前造型，如果角色造型在变化，每变一个造型都要单独设置一次，这块暂时未解决。增加颜色特效时候非常的卡，慎用。2022-05-13修复角色造型数字编号获取bug2022-04-15优化部分文字介绍优化加载角色造型图片文件夹功能修复加载字体的bug2022-03-07由于大部分情况是需要绘制的角色才需要切换造型，所以将actor的切换造型写在了draw()函数里面，不用大家再在update()里面手动切换造型了，如果想暂停切换造型直接将actor的animate_fps设置0就可以了。将延迟任务功能放到了master模块里面，统一由master来控制所有角色的延迟任务，不用每个角色再去都调用执行延时任务方法，更高效简洁。首先在创建角色的时候创建master对象master=Master()然后在合适位置创建延迟任务# 等待1s后隐藏ifkey==keys.X:master.create_delay_tasks(monv.hide,1)最后在update()函数中调用master的run_tasks方法defupdate():"更新数据"master.run_tasks()2022-03-03新增游戏窗口居中功能，只需要将窗口宽度和高度参数写在导入本库之前(不写的话会距离左边缘、上边缘各100像素)，居中的代码如下：WIDTH=800HEIGHT=500fromcpgzhimport*2022-03-02修复设置角色动画速度不正常bug，现在你可以使用actor.animate_fps=5，来设置jisi这个角色1秒钟切换五次造型。增加按键提示功能，在vscode中，使用keys的时候会有提示。注意：如果某个按键按下没效果，请大家定位到本库安装目录中，执行一下get_keys.py文件，就可以生成新的按键枚举。优化文档2021-12-29新增填充功能fromcpgzhimport*pen=Pen()defdraw():pen.fill("yellow")go()新增角色面向功能actor.face_to()defface_to(self,pos=None):'''面向一个对象pos参数不传递则面向鼠标pos传入一个坐标则面向这个坐标pos传入一个Actor则面向这个演员'''将鼠标控制功能单独绑定到mouse对象，包括get_pos、set_pos、hide、show功能，分别是获取和设置鼠标坐标，隐藏和显示鼠标指针。mouse.key包含了鼠标的各个键。mouse.get_pos()#获取坐标mouse.set_pos()#设置坐标mouse.hide()#隐藏mouse.show()#显示mouse.keys.LEFT#左键mouse.keys.RIGHT#右键mouse.keys.MIDDLE#中键2021-12-22增加输入框区分数据类型的功能definput(self,msg="请输入数据：",dtype=0)->str:"""简单输入框\ndtype控制输入的数据类型\ndtype=0或其他输入字符串\ndtype=1输入整数\ndtype=2输入浮点数\n"""修复使用文件夹作为角色造型时，造型顺序不正常的bug2021-12-14增加gif动画支持功能，现在你可以直接用gif动画作为角色造型了，代码十分简单：fromcpgzhimport*#创建角色rc=Actor('r-c.gif',center=(700,700))# r-c.gif是放在images中的图片，也可以使用绝对地址，即使不在游戏目录下也可以的：# rc=Actor('/home/fslong/文档/cpgzh/images/r-c.gif',center=(700,700))pen=Pen()defupdate():'更新数据'rc.animate()#按帧率切换造型defdraw():'绘制角色'pen.clear()#清理屏幕绘图rc.draw()# 绘制角色go()#启动游戏引擎增加加载一个文件夹中图片功能，直接将上一条代码中'r-c.gif'改成'r-c'即可，同样支持绝对目录也支持相对目录。已知问题：加载整个文件夹所有图片的时候，文件名排序有点问题，11.png会排在1.png和2.png中间，如果图片较多还是建议手动设置actor.images属性，后续我会修复这个bug。增加自由缩放功能：actor.scale=0.5是原比例缩放到0.5倍,actor.scale=(0.5,0.6)是x方向缩放到0.5倍，y方向缩放到0.6倍。2021-12-13修复写字颜色不正常的bug修复textbox的bug更新注释2021-11-20修复角色切换造型fps失效的bug2021-11-14：自动切换造型与延时任务分离隐藏和显示功能优化延时任务，增加任务执行完毕之后做的事优化画笔功能，将屏幕清理功能绑定在画笔上优化Actor类各个方法的介绍优化README.md文档内容