# cpgzh

## 介绍
本作品是基于一个新加坡老师的[pgzhelper](https://www.aposteriori.com.sg/pygame-zero-helper/)的一个助手工具，增加了一些功能方便国内用户使用，可以参考下面的链接：  

**pgzhelper**官网地址：[https://www.aposteriori.com.sg/pygame-zero-helper/](https://www.aposteriori.com.sg/pygame-zero-helper/)  
**黄复雄**老师翻译文档地址：[https://zhuanlan.zhihu.com/p/347855713](https://zhuanlan.zhihu.com/p/347855713)  
## 当前功能列表


1. 创建延时任务和切换动画
2. 输入框等杂项功能，增加游戏界面的交互功能、数据存储功能
3. 整合绘图命令，接口更加统一
4. 便捷的字体造型，写字不再繁琐
5. 导入了pgzero常见的功能，编写游戏时候从cpgzh中导入相关东西即可

## 软件架构
基于pgzero、pgzhelper和guizero。


## 安装教程

1.  使用pip安装即可：`pip3 install cpgzh`

## 使用说明
使用方法和pgzero基本相同，多了几个方法而已，下面对我增加的功能进行介绍，其他的移步[官网](https://www.aposteriori.com.sg/pygame-zero-helper/)或者[黄复雄老师的文档](https://zhuanlan.zhihu.com/p/347855713)即可。


### 一、创建延迟任务和切换动画  
这些功能都是封装在`Actor`类当中的。
#### 一）、延时任务
```python
import pgzrun
from cpgzh import Actor
jisi = Actor('大祭司_人偶-待机-000.png', center=(400, 400))
jisi.images = [f'大祭司_人偶-待机-{i:0>3}.png' for i in range(30)]# 绑定造型列表，根据你的素材来吧
jisi.is_animate=0# 关闭自动动画
jisi.create_delay_tasks(jisi.next_image, seconds=1, times=10)# 延迟1秒下一个造型，重复10次
def update():
    jisi.run_tasks()# 运行计划任务
def draw():
    jisi.draw()
pgzrun.go()
```
1.  使用`from cpgzh import Actor`代替`from pgzero.actor impoty Actor`来导入演员类；
2.  创建演员`jisi = Actor('大祭司_人偶-待机-000.png', center=(400, 400))`;
3.  `jisi.create_delay_tasks(task, seconds=1, times=1)`方法能够创建一个延迟执行的任务，task为要做的事。seconds为延迟的时间，默认为1s。times是这个任务要执行的次数，默认为1次；
4.  在`update`函数中调用`jisi.run_tasks()`方法；
#### 二）、自动切换造型
```python
from cpgzh import Actor
jisi = Actor('大祭司_人偶-待机-000.png', center=(400, 400))
jisi.images = [f'大祭司_人偶-待机-{i:0>3}.png' for i in range(30)]# 绑定造型列表，根据你的素材来吧
def update():
    jisi.run_tasks()# 运行计划任务
def draw():
    jisi.draw()
```
1. 使用`jisi.images = [f'大祭司_人偶-待机-{i:0>3}.png' for i in range(30)]`给`jisi`角色绑定要切换的造型；
2. 在`update`函数中调用`jisi.run_tasks()`方法。默认会将`jisi.animate()`方法在`jisi.run_tasks()`方法中调用，也就是默认是角色切换造型的姿态。当然你也可以在`update`函数中手动调用`jisi.animate()`方法即可自动切换造型；
3. 设置`jisi.animate_fps`可以获取或设置切换造型的速度，默认为每秒钟切换10次，如果要切换100次就设置100即可：`jisi.animate_fps=100`；  
4. 如果要停止造型的切换有两种方法：
   a. 只需要将`jisi.animate_fps`设置为0即可：`jisi.animate_fps=0`;
   b. 使用`jisi.is_animate`设置为0即可：`jisi.is_animate=0`，这种方法不影响设置好的角色切换造型的fps。
5.  还提供一个方法：`jisi.toggle_animate()`，如果角色在切换造型，这个方法就会停止切换，反之将会开始切换。


### 二、输入框等杂项功能
增加了一系列功能，包括输入、切换全屏、加载和保存数据等等，他们都封装在`Master`类当中，以键盘按下执行一些功能示例如下： 
![](img/1.png) 
```python
#实例化管家
from cpgzh import Master
master=Master()#实例化的时候可以直接传递存档位置作为参数
def on_key_down(key):
    '当键盘按下'
    # 设置全屏化
    if key == keys.A:
        master.set_fullscreen()
    # 设置窗口化
    elif key == keys.B:
        master.set_windowed()
    # 切换全屏和窗口化
    elif key == keys.C:
        master.toggle_fullscreen()
    # 隐藏鼠标
    elif key == keys.D:
        master.hide_mouse()
    # 显示鼠标
    elif key == keys.E:
        master.show_mouse()
    # 输入文本
    elif key == keys.F:
        text = master.input('请输入一个名字:')
        print(text)
    # 选择文件
    elif key == keys.G:
        text = master.select_file('请选择一个文件：')
        print(text)
    # 保存文件
    elif key == keys.H:
        text = master.select_file_save('请选择存档保存位置：')
        print(text)
    # 选择文件夹
    elif key == keys.I:
        text = master.select_dir('请选择一个文件夹:')
        print(text)
    # 是否选择框
    elif key == keys.J:
        text = master.yes_no('是否选择女装？')
        print(text)
    # 保存master的数据
    elif key == keys.K:
        master.save_data()
    # 手动加载存储的数据
    elif key == keys.L:
        #master.data.text = 'test'
        master.data_path = '测试.dat'
        master.load_data()
    # 删除保存的数据
    elif key == keys.M:
        master.del_data()
    # 设置动画的帧率
    elif key == keys.N:
        fps = master.input('请输入动画切换的速度(每s切换多少次)：')
        jisi.animate_fps = int(fps)
    # 切换造型是否切换
    elif key == keys.O:
        jisi.toggle_animate()
    # 提示信息
    elif key == keys.P:
        master.msg('提示：\n你已经换好女装了')
    # 警告信息
    elif key == keys.Q:
        master.warning('警告:\n今天的女装不太完美')
    # 错误信息
    elif key == keys.R:
        master.error('错误：\n你还没换好女装')
    # 游戏开始
    elif key == keys.S:
        master.data.start()
    # 获取游戏运行时常
    elif key == keys.T:
        print(master.data.get_time())   
```  
需要特殊说明的是，`master`会自带一个数据保存的功能，绑定在`master`的`data`对象上，这个对象可以把绑定在他身上的数据保存到当前的目录，如果不指定`master.dataPath`属性会自动保存在`data.dat`文件中。  
默认情况下，`master.data`会有几个默认属性，包括游戏状态、时间、得分，你也可以自行绑定其他属性：  
```python
class Data:
    '数据存储类'
    def __init__(self, data_path) -> None:
        '数据类'
        self.status = 0  # 游戏状态\
        self.time = 0  # 游戏持续时间
        self.score = 0  # 得分
```   
   

**注意：** 在master类实例化的时候就会自动加载一次存档，所以这里要小心一些，容易出现奇怪的事情。  
为了数据的传递方便，`master.data`对象有个`temp`属性，这个属性会自动存放一些数据，比如选择的文件夹，或者输入的数据，也就是说获取输入的内容还可以这样写：  
```python
master.input('请输入一个名字:')
print(master.data.temp)
```  
### 三、整合绘图命令  
这些功能都是封装在`Pen`类当中的。   
对绘图命令进行了整合，可以更方便快速绘制各种图形。  
![](img/9.png)
使用方法如下：  
1、导入并实例化`Pen`类
```python
from cpgzh import Pen
pen = Pen()
```
2、在`draw`函数中绘制想要的图形
```python
def draw():
    # 绘制一个点
    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`类和`Font`类当中的。  
pgzero字体设置比较繁琐，很多时候小伙伴们也不太知道那些个参数都是干啥的，每次写字都要写很多行，太难受了。  
所以对字体样式进行了封装，帮大家方便快速写字。   
![](img/10.png)  
建议做游戏时候将不同的字体先实例化成不同的对象，到时候用就可以了。  

使用方法如下：  
#### 1、导入和实例化样式
```python
from cpgzh import Font # 导入字体样式类
from cpgzh import pen # 导入画笔
font1 = FontStyle()# 实例化字体样式font1
font1.color='red'# 修改颜色
font2 = FontStyle()# 实例化字体样式font2
font2.color='blue'# 修改颜色
font2.bold=True# 加粗
font2.angle=180# 旋转180度
```  
#### 2、写字  
下面的写字代码一定要放在draw函数中。
```python
# 默认样式写字
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对象的参数，从而改变字体的样子，可以改的字体样式如下（可根据默认值修改）:  
```python
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 = '宋体'# 字体名字
```

### 五、pgzero常用功能从cpgzh中导入即可
如果有些东西从pgzero中导入，有些东西又从cpgzh导入太割裂了，所以进行了修改，下面是一个空白的游戏框架，大家可以参考(会自动加载pgzrun)。

#### 1、最简框架
```python
from cpgzh import *


go()
```
这样就能绘制出一个黑屏。  
#### 2、增加绘制角色和更新数据
```python
from cpgzh import *

xiaoming=Actor('小明.png')  

def update():
    '更新角色数据'
    xiaoming.x+=1
def draw():
    '把小明绘制在屏幕上'
    xiaoming.draw()
go()  
```    
这样我们就能将一个小明绘制在屏幕上。




#### 功能截图：   
(详见软件仓库，pypi不会显示)
![](img/1.png)
![](img/2.png)
![](img/3.png)
![](img/4.png)
![](img/5.png)
![](img/6.png)
![](img/7.png)
![](img/8.png)
![](img/9.png)
![](img/10.png)

**用法详情可以参考`example.py`文件**
