QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9717|回复: 6

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

[复制链接]
发表于 2006-1-9 16:00:53 | 显示全部楼层 |阅读模式
欢迎各个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拼在一起画上去。
这样,牌局图,和连线图就分开了,互不影响。
不过这样对内存的占用是否会增加得比较客观呢?

不知道大家有什么想法,欢迎指教。
发表于 2006-1-9 17:26:09 | 显示全部楼层
使用 canvas 才是王道。 无论你要用 libgnomecanvas (libart_gpl), 还是自己实现一个 gtk/cairo 的 canvas.

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

回复

使用道具 举报

发表于 2006-4-6 12:31:29 | 显示全部楼层
这个游戏效果真是不错.
回复

使用道具 举报

发表于 2006-5-31 19:45:27 | 显示全部楼层
好像QQ里的连连看,两个牌消的过程中,用户是不能进行其他操作的,只有等消完了,才能再消其他的
回复

使用道具 举报

发表于 2006-8-21 12:35:44 | 显示全部楼层
长时间的绘图用线程来做,就像CAD,在移动10000个元素时,它边移边画,不一定能画完,因为鼠标会继续移动,每次新的移动都会删除老的再重新画新的,看起来效果不错。

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

线程这么来:

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

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

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

使用道具 举报

发表于 2006-8-24 23:43:07 | 显示全部楼层
采用线程来作是没有问题拉,不过建议不要取消上一次正在进行的操作啦。这样采够绚丽阿。每次都生成一个新的线程。虽然会耗费点资源,考虑到现在的CPU越来越好,不在乎了。
回复

使用道具 举报

发表于 2007-1-12 10:19:58 | 显示全部楼层
该去参考一下蓝迪游戏的连连看,我觉得它的连线效果就不错(虽然谈不上漂亮)
但既有延时能保证让人看清楚,又不影响玩家继续操作(线未消失时玩家也能继续点)。

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

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-21 17:53 , Processed in 0.042401 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表