|
欢迎各个gtk专家来讨论,我介绍一下连连看目前版本的绘图机制,
然后说一下现在遇到的困难,最后请大家多多回帖,讨论一下如何让连连看更炫
1。连连看的绘图机制
连连看的各个牌是放在一个数组中的data[][],数组元素一个结构体,下标x,y表示牌所处的位置,对应的数组中的值,表示这个位置是否有牌。
游戏开始,根据data数组,在对应位置画上一个牌底图,再画上牌面图案,从左边开始,一行一行的画。这些画图操作都是针对一个内存中的pixmap进行的,在所有的绘图操作完成之后,再将pixmap一次绘制到drawingarea中,这也就是所谓的double buffer。
这里,我们主要讲连线操作的绘图过程。
当玩家点了两个牌之后,而且这两个牌是可以连接的,那么此时
先根据这两个选中点,得到绘图的路径,也就是一个单向链表,表中元素是一个结构体,x,y,direction,分别表示这个点相对于(这里说相对于,是因为这个点可以在数组之外)数组data中的位置、连线的方向。
得到连线路径之后,在这个路径上绘制图案,绘制操作时针对pixmap的,绘玩之后重绘drawingarea
然后再从data数组中删除这两个被选择的点
最后再根据data重新绘制pixmap并显示在drawingarea上。
由于上面过程很快,所以大家就看到,连线图案基本是一闪而过。
2. 现在遇到的困难
毫无疑问,要实现类似阿达连连看那种连线效果,连线操作占用的时间相当长,必须单独用一个线程去处理。
但是这里就有一个问题了,在连线过程这么长的时间中,玩家的其他操作,比如消除其他一对牌,对pixmap的操作必然会与第一次的连线线程中对pixmap的操作冲突,导致界面图案混乱。
3. 我的想法
我写着写着,忽然想起来刚才看到libgnome里面所谓层的改变。
我就想,是不是我再申请一个pixmap,比如叫pixmap2,然后所有的连线绘图操作都针对pixmap2,而在每次需要重绘drawingarea的时候,就把pixmap1和pixmap2拼在一起画上去。
这样,牌局图,和连线图就分开了,互不影响。
不过这样对内存的占用是否会增加得比较客观呢?
不知道大家有什么想法,欢迎指教。 |
|