局域网内双升游戏的设计(一)--界面

news/2024/10/22 7:45:09/

概述

       本软件使用VS2010为框架,采用MFC框架,以及DirectDraw作为画图的工具。网络库与消息调度使用live555底层的模块实现。关于DirectDraw和live555的细节,可以自行上网查阅资料。

界面元素


图 1.             界面

        如上图所示,是整个游戏客户端的界面。其中的每一个元素都是一个对象,使用组合模式来管理。界面每一秒种刷新30次(可以根据需要调整),每次刷新时每个元素根据需要重绘。这样达到动画效果。


图 2.             界面元素类图

        如上图所示,界面中每一个元素都是一个CGraph的子类,不同的元素根据自身需要,重载onDraw函数,完成不同的绘图。CContainer是一个容器,本身不显示图像,只是保存有其他多个CGraph的对象,同时负责这些对象的位置管理,每次重绘的时候所做的事情就是调用他们的onDraw函数。

        例如,最大的一个画布其实就是一个CContainer对象,其中包含有界面中的文本框、人物头像等元素,也包含有一些类似牌堆的CContainer(CCardContainer)对象,画布并不直接管理牌元素,而是CContainer来对其进行管理。可以参考四人帮设计模式中的组合模式。

        每次定时器时间到后,会触发画布的onDraw消息,由顶层的CContainer传递给下层的CGraph,层层递进。

消息传递

        软件采用MFC为框架,主画布是MFC中静态框(CStatic)的子类

class CSurface : publicCStatic, public CContainer
{
DECLARE_DYNAMIC(CSurface)
/* 省略无关代码 */
private:
afx_msg void OnTimer(UINT_PTR nIDEvent);
afx_msg void OnMouseMove(UINT nFlags,CPoint point);
afx_msg void OnLButtonDown(UINT nFlags,CPoint point);
afx_msg void OnRButtonDown(UINT nFlags,CPoint point);
afx_msg void OnLButtonUp(UINT nFlags,CPoint point);
afx_msg void OnRButtonUp(UINT nFlags, CPointpoint);
afx_msg void OnLButtonDblClk(UINT nFlags,CPoint point);
};

        那么,CSurface就可以通过MFC中静态框的机制来截获定时器消息和鼠标消息。一个CSurface的对象,就可以作最底层画布,同时也是鼠标消息的入口。

按照上面所说的,整个画面是个层次结构,container中可以包含其他的container,每个container重载鼠标消息时,不对具体的消息做处理,而是根据坐标位置,将消息传递给下一级的元素。从而实现消息的传递。

        在onTimer函数中,调用draw函数,即从surface的draw开始,一级一级往下调用,每个元素如果是可见的,都会将自己画在画布的相应位置上。

一些元素

        在界面中,要根据界面的消息来响应的话,主要响应重绘和鼠标两个消息,下面以两种控件来分别说明这两种消息的响应方法:

CAnimationCtrl

        CAnimationCtrl是动画控件,所有的动画是由不同的连续图片组成的,每当定时器时间到的时候,就需要显示下一幅图片。下图是组成某个动画的六张连续图片。将它们连续循环播放,就会是一个动画效果。

        所要做的工作,就是在初始化的时候指定图片文件,并且指明动态图帧的个数。这样,底层会将图片切为六份,每次时间到后,在刷新时就显示下一帧图片。


图 3.             动画的静态图片

CButtonCtrl

        CButtonCtrl是按键,在显示方面,如果鼠标移动到按键上,就要换Foucus的图片,如果鼠标按下,就要换Press的图片,所以,需要响应鼠标移动、按下,松开的消息,并照此更改显示的图片。

        除了要显示图片外,button还有一个功能,要给外界提供一个注册回调的接口,在鼠标单击时,就能够调用该回调函数,以完成功能。一般的回调函数是静态函数,如果是某个类对象需要注册的话,需要另外写一个静态函数,然后将自己的指针传入,以便在回调函数中使用。

        而如果使用类函数指针的话,就可以不要方便些。


图 4.             消息机制类关系图


        如上图所示,首先要有一个基类CMsgHandle,如果要用到按键的机制,则必须继承于它,并新建一个CButtonCtrl的对象,然后将回调函数和自己的指针注册到对象中。

voidCButtonCtrl::registerRButtonDownHandler( MSGCALLBK fun, void* usr )
{
m_pLButtonClickHandler = fun;
m_pLButtonClickUsr = usr;
}

        这样,当鼠标点击了以后,就可以直接回调到类的成员函数中。

voidCButtonCtrl::onLButtonClicked( int xPos, int yPos )
{
if ( m_pLButtonClickHandler &&m_pLButtonClickUsr)
{
CMsgHandler* pHandler = (CMsgHandler*)m_pLButtonClickUsr;
( pHandler->*m_pLButtonClickHandler)();
}
return;
}

元素的移动

        这个框架特别流出了一个可以支持元素在界面上移动的接口。例如,出牌时,牌是渐进地移动到界面中间,而不是直接瞬间移动。


图 5.             实现元素移动的类图

        如上图所示,在CGraph中,有一个CMovement对象的指针,每次在重绘之前,会先让CMovement对象来调整当前元素的位置:

void CGraph::draw(LPDIRECTDRAWSURFACE7 surface )
{
if ( m_pMovement )
{
if ( !m_pMovement->moveStep( m_rc ))
{
delete m_pMovement;
m_pMovement = NULL;
}
}
if ( m_visible )
{
onDraw( surface );
}
}

        在本程序中用到了CLinearMovement(即线性移动,设置了起点、终点和运动时间),每次重绘前,调用其moveStep函数,就会根据当前时间来计算下一步要将位置设置到哪里。于是,牌就有了线性移动的效果。

        如果需要其他效果,将CGraph中的m_pMovement设置为其他的类型即可,比如,要让一个物体自由落体下降,那么就可以新建一个CMovement的子类,每次重绘时,根据当前的速度来计算下一个时刻将下落到哪个位置,以及更新当前的速度。

        参考代码+编译后的程序:http://download.csdn.net/detail/hustxyj/7024091


http://www.ppmy.cn/news/856544.html

相关文章

局域网内双升游戏的设计(三)--算法

发牌算法 当每个玩家都准备完毕后,那么第一步就是要发牌。需要做到一个完全随机的发牌,就要保证每张牌发到每个玩家手里的概率都是一样的,而且牌的顺序是等概率随机打乱的。程序中采用的是如下的发牌算法(感谢Dr.Light提供&#x…

局域网内双升游戏的设计

本科毕业前,就有意向开始写一个双升的游戏,那时候用QT写了个界面,不过由于架构太混乱,导致后面不想去维护。研究生第二年下学期,实验室活不多,就乘机写了一个 新的牌的框架,正好实践了很多设计模…

手机自动化脚本-- 模拟器模拟真机环境过检测

文章目录 安装包目录结构一、安装雷电模拟器9二、新建模拟器并且初始化1. 性能设置2. 其他设置3. 当前配置三、面具1. 安装2. 面具初始化四、修改机型1. 将机型模块安装到模拟器2. 安装机型模块五、修改su问题1. 安装RE管理器2. 删除自带su文件,避免文件冲突六、下载地址额外安…

论文(1)——大家说SCI的一区二区和CCF中A类B类是什么意思?

文章目录 引言问题描述问题解决CCF 和A、B、C类CCF注意事项 SCI和一区、二区如何判定你找的论文所属的会议或期刊是几区或者几类?使用特定的网站查询使用浏览器插件 一年之内的应该投什么刊物? 总结参考 引言 已经研一暑假了,周围很多人已经…

三星依靠折叠手机技术优势在中国市场强力复兴,中国手机该担心了

据某电商公布的热销安卓旗舰手机排行榜,三星8月底上市的两款高端手机Galaxy Z flip3和Galaxy Z fold3均进入了热销榜top10,分别位居第六名、第七名,显示出这家手机企业在被中国消费者冷落数年后似乎开始重获中国消费者的认可。 某电商公布的这…

华为、小米已成老年手机市场主力—1.5万条老年手机电商数据解读

过去几年,大部分中老年人接触互联网都是从使用智能手机开始的,正是由于智能手机在中老年人群中的快速普及推动了互联网在中老年人群中渗透率的大幅增长,随着智能手机越用越熟练,他们开始广泛体验语音、视频、K歌、支付、追剧、看小…

安卓开发者:如何成为Kotlin大师?附送18款kotlin开源项目(纯资源分享)

在开发界,新的语言不断出现,包括go、Rust、Nim、Julia、Scala、Swift…这个名单可以拉很长,但从来没有一款语言像Kotlin一样引起这样广泛的讨论。 在StackOverflow网站统计的,最受开发者欢迎的编程语言排行榜,Kotlin得到了 72.6% 的高比例支持,位列第四名。据 JetBrains…

线上手机市场彻底变天,小米气势如虹,有望跻身全球前三强

某电商公布的8月份热销手机排行榜显示,小米最多手机款式上榜,显示出小米手机在国内手机市场似乎见到了反弹的希望,苹果则以iPhone11高居第一名。 国内线上手机市场则有数年以小米为首,它在2011年推出手机后就一直以互联网营销之王…