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论坛)
妈妈捏的
不小心发粗来了{:10_282:} 哇,作者要开发 pygame 了{:10_257:} tommyyu 发表于 2023-8-22 13:57
哇,作者要开发 pygame 了
没有没有,只是要写一个给pygame开发者用的生成ui的工具而已,一会大家会方便一点{:10_282:} cjjJasonchen 发表于 2023-8-22 13:55
妈妈捏的
不小心发粗来了
{:10_306:} Ewan-Ahiouy 发表于 2023-8-22 14:04
{:10_297:} cjjJasonchen 发表于 2023-8-22 14:06
最好在开发一个颜色选择框{:10_256:} Ewan-Ahiouy 发表于 2023-8-22 14:26
最好在开发一个颜色选择框
颜色选择感觉怎么说呢
enmmm其实这个2.0版本完结之后,你应该可以很轻松的自己拼一个,因为像按钮啊窗口啊之类的都会有了,你处理一下逻辑就可以啦,我这里没有太大必要自己写一个{:10_254:} cjjJasonchen 发表于 2023-8-22 14:30
颜色选择感觉怎么说呢
enmmm其实这个2.0版本完结之后,你应该可以很轻松的自己拼一个,因为像按钮啊窗 ...
{:10_254:} 接下来准备让他可以支持换行符{:10_298:} 更新啦,上去 nb liuhongrun2022 发表于 2023-9-3 20:13
nb
{:10_256:}
这几天应该可把窗口,滑条,多选单选的按钮以及菜单、ui干 这些肝出来,前置科技都差不多了 我想重写 歌者文明清理员 发表于 2023-9-15 19:07
我想重写
额,怎么说呢,给你看一张图罢
(这个图片是我现在写的2.0版本的文件夹)
里面每一个都代表了一次更新,如:加入了。。。组件,重构了哪个部分的代码
这个程序从1.0开始到现在已经重构过4、5次了
我不知道接下来还需要重构几次,但我感肯定的是,每一次重构,我的程序都有极大的提升
可能是效率翻倍,可能是与某些功能兼容。。。
但是自从做了这个已经快1000行的“大”项目以来,我学会了很多
有的时候,重构代码是在所难免的,虽然这很痛苦,但这会带来各种意义上的巨大提升
从1.0版本的18kb,到现在35kb。。。。以后还会更多
所以说,不要害怕从头开始,这不是死亡,而是新生{:10_257:}
代码是这样,一个好的帖子也是这样,继续加油,我看好你!!! cjjJasonchen 发表于 2023-9-15 19:29
额,怎么说呢,给你看一张图罢
git:啊? 歌者文明清理员 发表于 2023-9-15 19:34
git:啊?
{:10_256:} 歌者文明清理员 发表于 2023-9-15 19:34
git:啊?
GitHub是好用的 已更新
页:
[1]