打印

熟悉gtk画动画的朋友请进,讨论一下连连看的连线效果撒

熟悉gtk画动画的朋友请进,讨论一下连连看的连线效果撒

欢迎各个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拼在一起画上去。
这样,牌局图,和连线图就分开了,互不影响。
不过这样对内存的占用是否会增加得比较客观呢?

不知道大家有什么想法,欢迎指教。
开发计划:   llk_linux-2.2版 已经发布,欢迎主页:http://llk-linux.sourceforge.net

TOP

使用 canvas 才是王道。 无论你要用 libgnomecanvas (libart_gpl), 还是自己实现一个 gtk/cairo 的 canvas.

有兴趣可以看一下这个基于 libgnomecanvas 的叫做 atomix 的游戏: http://jens.triq.net/atomix.php

TOP

这个游戏效果真是不错.

TOP

好像QQ里的连连看,两个牌消的过程中,用户是不能进行其他操作的,只有等消完了,才能再消其他的
C2.4G/128M/Intel 845G/AC97/Reltek 8139 Windows2000+Magiclinux 1.2 Not Just For Fun !

TOP

长时间的绘图用线程来做,就像CAD,在移动10000个元素时,它边移边画,不一定能画完,因为鼠标会继续移动,每次新的移动都会删除老的再重新画新的,看起来效果不错。

你的问题也类似,其实很简单,

线程这么来:

while(1)
{
    draw(1);
    if(stop) clean();
    draw(2);
    if(stop) clean();
    ....
    draw(n);
}

每个draw都要把draw的内容记录在自己的memdc中,同时刷到屏幕。下一个draw要用保存的上一次绘图操作把屏幕刷到原始态,再刷这次的内容上去。

如果要中途停止操作,要把最后的一次写屏取消来恢复原屏幕,也就是说,如果下一个连接发生在上一个连接的动画完成之前,上一个动画要中途取消,恢复原始屏幕,然后再画当前这个连接的动画。

TOP

采用线程来作是没有问题拉,不过建议不要取消上一次正在进行的操作啦。这样采够绚丽阿。每次都生成一个新的线程。虽然会耗费点资源,考虑到现在的CPU越来越好,不在乎了。

TOP

该去参考一下蓝迪游戏的连连看,我觉得它的连线效果就不错(虽然谈不上漂亮)
但既有延时能保证让人看清楚,又不影响玩家继续操作(线未消失时玩家也能继续点)。

感觉蓝迪的开发能力也是很强的,为什么不去参考一下呢?

TOP