cjjJasonchen 发表于 2023-8-22 13:54:25

pygameGUI 2.0 开发日志 9/16 更新

本帖最后由 cjjJasonchen 于 2023-9-26 16:46 编辑

pygameGUI 2.0 开发日志







前言:
      亲爱的各位鱼油们,大家好,
从今天开始,我开始就要着手准备pygame2.0版本的开发了,
1.0版本传送门:pygameGUI 1.0
这个库可以帮助各位想要用pygame写游戏的开发者提供方便的。
从此以后,妈妈再也不用担心我不会用UI啦!

有了1.0版本的实验之后,我可以向大家保证:下次一定
这个库一定会时你在pygame中创建UI如同tkinter一样简单,同时,我会给大家极大的操作空间。

在这个帖子中,我会向各位实时的展示我的开发进度,大家可以看到我开发这个项目的思路
(由于是实时展示,所以可能有一些错误啊,重构啊之类的在所难免。其他的帖子中没有的部分也都会展示出来,所以可能会有很多废话)

总之,欢迎大家催更和监督我!

所有更新前我都会附上日期,为了不影响阅读体验,我把它放在帖子最右边



美好的开始~

今天是8/22,开始。。。。

首先呢,我们来整理一下这个项目的整体思路,

我希望把各个组件封装成 继承pygame.sprite.Sprite的GUI类 ,
写一个继承 pygame.sprite.Group的GUI组,通过这样的方法,我们就可以轻松的写一个适合pygame的GUI了

当然啦,这其中有很多问题,比如有的组件是由多个部分组装而成的,如:
滑条(两个按钮,一个轨道,一个滑块)、输入框(一个框,一个光标,还有字体)等等。。。。

我的想法是把他们做成多个UI,分别加入组中,不知道各位看到这里有没有什么更好的想法,发到评论区,说不定我会采用哦!


GUI基类

我们写几个准备使用的方法,以后有需要再加上其他功能

class UI(pygame.sprite.Sprite):
    def __init__(self):
      super().__init__()

    def press(self,pos):
      pass
   
    def release(self,pos):
      pass

    def move(self,rel):
      pass


GUI组

重写一下 update 方法,每次先调用组中 move 方法,再 update (否则会导致组件移动不更手)

然后写一个decide方法,把事件输入进去,他负责1.0版本中按下事件和抬起事件的处理(输入文字事件下次再写)
这样就不用想1.0版本那样按下,抬起都调用方法了,一次搞定

class Group(pygame.sprite.Group):
    "用来控制UI的组"
    def __init__(self):
      super().__init__()
      self.pos = 0
      self.rel = 0
      
            
    def update(self,pos=None,rel=None):
      self.pos = pos
      self.rel = rel
      for sprite in self.sprites():
            #每帧调用,被拖动的组件判断是否需要移动
            sprite.move(self.rel)
            
      super().update(pos,rel)
      
    def decide(self, event):
      if event.type == MOUSEBUTTONDOWN:
            if event.button == 1:
                "鼠标按下时调用"
                for sprite in self.sprites():
                  sprite.press(self.pos)
                  
      if event.type == MOUSEBUTTONUP:
            if event.button == 1:
                "鼠标松开时调用"
                for sprite in self.sprites():
                  sprite.release(self.pos)




按钮

还是一样的,先整理一下思路:

在1.0中,我们通过在按下和抬起时得到鼠标位置,从而判断是否点击的是该按钮,

但是如果两个按钮重叠,这样会导致bug,或许我们应该尝试一种新的方式:把这段判断写道GUI组中,判断是点击的哪个按钮

时间过得真快啊!现在已经是8/23啦,我们继续


根据以上思路呢,我们可以试试,在ui组中添加一个字典,里面放着各种部件,需要的时候通过索引就可以了

static/image/hrline/line7.pngstatic/image/hrline/line7.pngstatic/image/hrline/line7.pngstatic/image/hrline/line7.pngstatic/image/hrline/line7.pnghttps://fishc.com.cn/static/image/hrline/line7.pnghttps://fishc.com.cn/static/image/hrline/line7.pnghttps://fishc.com.cn/static/image/hrline/line7.pnghttps://fishc.com.cn/static/image/hrline/line7.pngstatic/image/hrline/line7.png



ok~啦家人们,经过一个上午的努力终于,完成了(基本)这个按钮组件:

同时呢,还修复1.0版本的一些bug:



(如上!按钮可以重叠使用啦!)

同时,我们可以像tkinter一样使用lambda表达式给command中的函数传参啦!

8/24

今天在尝试优化一下点击按钮的算法,我希望以此来提高速度:

理一理思路先,

组件状态分为“选择(等待点击)”、“按下(点击未松开)”、“默认(初始状态)”


今天是8/25

今天我给button增加了一个长按多次触发command的功能,
接下来我准备着手制作label,这次的目标是希望有可以跨多行的文本,然后回来做小测试。。。


这里展示一下长按效果图:



(这里打印的是帧数,我设定了每隔开10帧打印一次,可以看到,没有bug)

小测试:多选单选与开关





单项选择,今天就到这了,下次一定{:10_298:}

8/26

多项选择:


同样是很简单的。

代码也给到你们吧~



label与多行文本


8/26
okok
忙活了这么长时间,现在Label已经支持使用系统字体了


看图:


哈哈哈{:10_298:}


okok 多行字体搞定,用的方法是通过迭代检测文本长度,超过就换行,然后把所有文本对象贴到一个image上

左对齐:




居中:




右对齐:





如上,黑纸白字{:10_297:} 大伙都看着呢!



呼~   手动换行也完成啦!








滑块

9/1
这几天写了个滑块组件,用来充当window的标题,滑条中被拖动的部分,ui干。。。


还在制作中,某种意义上讲这是2.0版中第一个全新的组件

frame组件也更新了,删除了原本多于的window功能。

看图吧~







以上是两种不同的模式(溢出,非溢出)



9/15
之所以这么多天没有更新,是因为我趣重构代码了,

因为slider组件和其他东西拼成滑条的时候会出现兼容性问题,正好我也想到了一个更好的迭代组件的方法,可以提高效率

于是,就重构了亿段时间。。。。毕竟重构代码没什么观赏性,所以就没有发上来

现在重构之后很多地方都进行了升级,例如,按钮留下了位置用来改变鼠标光标,label组件(单行)和message组件(多行)文本分开了。。。。。

不过这部分更新的示例还没有做好,过几天示例做好了之后会发在这一页贴子里面——————

还有一件事,值得一提的是,重构之后,所有的组件必须要放在frame上面了(请万万注意)

{:10_297:}


9/18

okok我来继续更新啦~

来看看鼠标光标的变化效果:



窗口

窗口组件:Window

是继承frame组件(主体部分)的,带有一个slider组件(可拖动的标题),一个button组件(关闭按钮组成的)

是一个简单的预设(即使没有这个组件,使用者们也可以轻易的自己制作出window,但有了这个组件,会更方便)

如图所示:



(这是window组件的默认效果,后续可以改变关闭按钮,主题,标题的材质,还可以在其上方添加其他组件)






9/26

如题,在重构了滑条组件后,我做了一个简单的demo

传送门:

【pygame游戏开发】pygameGUI 2.0demo展示
https://fishc.com.cn/thread-234082-1-1.html
(出处: 鱼C论坛)









cjjJasonchen 发表于 2023-8-22 13:55:22

妈妈捏的

不小心发粗来了{:10_282:}

tommyyu 发表于 2023-8-22 13:57:29

哇,作者要开发 pygame 了{:10_257:}

cjjJasonchen 发表于 2023-8-22 14:02:14

tommyyu 发表于 2023-8-22 13:57
哇,作者要开发 pygame 了

没有没有,只是要写一个给pygame开发者用的生成ui的工具而已,一会大家会方便一点{:10_282:}

Ewan-Ahiouy 发表于 2023-8-22 14:04:58

cjjJasonchen 发表于 2023-8-22 13:55
妈妈捏的

不小心发粗来了

{:10_306:}

cjjJasonchen 发表于 2023-8-22 14:06:26

Ewan-Ahiouy 发表于 2023-8-22 14:04


{:10_297:}

Ewan-Ahiouy 发表于 2023-8-22 14:26:11

cjjJasonchen 发表于 2023-8-22 14:06


最好在开发一个颜色选择框{:10_256:}

cjjJasonchen 发表于 2023-8-22 14:30:38

Ewan-Ahiouy 发表于 2023-8-22 14:26
最好在开发一个颜色选择框

颜色选择感觉怎么说呢

enmmm其实这个2.0版本完结之后,你应该可以很轻松的自己拼一个,因为像按钮啊窗口啊之类的都会有了,你处理一下逻辑就可以啦,我这里没有太大必要自己写一个{:10_254:}

Ewan-Ahiouy 发表于 2023-8-22 14:33:41

cjjJasonchen 发表于 2023-8-22 14:30
颜色选择感觉怎么说呢

enmmm其实这个2.0版本完结之后,你应该可以很轻松的自己拼一个,因为像按钮啊窗 ...

{:10_254:}

cjjJasonchen 发表于 2023-8-25 16:22:00

接下来准备让他可以支持换行符{:10_298:}

cjjJasonchen 发表于 2023-9-1 15:40:08

更新啦,上去

liuhongrun2022 发表于 2023-9-3 20:13:51

nb

cjjJasonchen 发表于 2023-9-4 07:44:27

liuhongrun2022 发表于 2023-9-3 20:13
nb

{:10_256:}
这几天应该可把窗口,滑条,多选单选的按钮以及菜单、ui干 这些肝出来,前置科技都差不多了

歌者文明清理员 发表于 2023-9-15 19:07:57

我想重写

cjjJasonchen 发表于 2023-9-15 19:29:01

歌者文明清理员 发表于 2023-9-15 19:07
我想重写

额,怎么说呢,给你看一张图罢



(这个图片是我现在写的2.0版本的文件夹)

里面每一个都代表了一次更新,如:加入了。。。组件,重构了哪个部分的代码

这个程序从1.0开始到现在已经重构过4、5次了

我不知道接下来还需要重构几次,但我感肯定的是,每一次重构,我的程序都有极大的提升

可能是效率翻倍,可能是与某些功能兼容。。。

但是自从做了这个已经快1000行的“大”项目以来,我学会了很多

有的时候,重构代码是在所难免的,虽然这很痛苦,但这会带来各种意义上的巨大提升

从1.0版本的18kb,到现在35kb。。。。以后还会更多

所以说,不要害怕从头开始,这不是死亡,而是新生{:10_257:}

代码是这样,一个好的帖子也是这样,继续加油,我看好你!!!

歌者文明清理员 发表于 2023-9-15 19:34:17

cjjJasonchen 发表于 2023-9-15 19:29
额,怎么说呢,给你看一张图罢




git:啊?

cjjJasonchen 发表于 2023-9-15 19:35:38

歌者文明清理员 发表于 2023-9-15 19:34
git:啊?

{:10_256:}

cjjJasonchen 发表于 2023-9-15 19:40:03

歌者文明清理员 发表于 2023-9-15 19:34
git:啊?

GitHub是好用的

cjjJasonchen 发表于 2023-9-16 23:05:46

已更新
页: [1]
查看完整版本: pygameGUI 2.0 开发日志 9/16 更新