Qt浅谈之四十九俄罗斯方块(代码来自网络)

时间:2024-06-24 12:37:26

一、简介

从网上下载了一个Qt实现的俄罗斯方块单机版的源码,觉得非常有意思,故以博客形式记录下来,以便慢慢来研究。在centos6.6下编译运行(注意程序运行需要读取pro目录的配置文件,若把编译目录选择在pro外的话运行会报错):
Qt浅谈之四十九俄罗斯方块(代码来自网络)

Qt浅谈之四十九俄罗斯方块(代码来自网络)

二、详解

1、部分代码

(1)main.cpp

  1. #include <QApplication>
  2. #include <QTextCodec>
  3. #include <QCursor>
  4. #include "TetrixWidget.h"
  5. int main( int argc, char **argv )
  6. {
  7. QApplication a( argc, argv );
  8. QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
  9. QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
  10. QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
  11. //则更换图标
  12. QCursor myCursor( QPixmap( GLOBAL_CURSOR_IMAGE ) ) ;
  13. QApplication::setOverrideCursor( myCursor ) ;
  14. //这个是因为要使用Phonon这里要设置一个名字,可能是考虑到版权相关的问题吧,不然会有一个警告
  15. //并无其他实际意义
  16. a.setApplicationName("MyTetrix Game");
  17. TetrixWidget widget ;
  18. widget.show();
  19. return a.exec();
  20. }

(2)TetrixWidget.h

  1. #ifndef TETRIXWIDGET_H
  2. #define TETRIXWIDGET_H
  3. #include <QDesktopWidget>
  4. #include <QApplication>
  5. #include <QWidget>
  6. #include <QGraphicsView>
  7. #include <QSettings>
  8. #include <QStringList>
  9. #include <QImage>
  10. #include <QPoint>
  11. #include <QKeyEvent>
  12. #include "GameGraphicsScene.h"
  13. #include "GameBackGroundItem.h"
  14. #include "GameLogoImageItem.h"
  15. #include "GameButtonItem.h"
  16. #include "GameArrowItem.h"
  17. #include "GameMovBackGrouItem.h"
  18. #include "GameIntroductionItem.h"
  19. #include "GameOptionItem.h"
  20. #include "GameHighWinItem.h"
  21. #include "GameGameSound.h"
  22. #include "globaldefines.h"
  23. /**************************************************************************
  24. *                        常量                                            *
  25. **************************************************************************/
  26. /**************************************************************************
  27. *                          宏定义                                         *
  28. **************************************************************************/
  29. /**************************************************************************
  30. *                            数据类型                                     *
  31. **************************************************************************/
  32. /**************************************************************************
  33. *                             类声明                                      *
  34. **************************************************************************/
  35. class TetrixWidget : public QWidget
  36. {
  37. Q_OBJECT
  38. signals:
  39. //发送信号给ArrowItem,改变其坐标到坐标索引的index
  40. void moveArrowat( int index ) ;
  41. //这个是遮蔽箭头item上面的箭头的信号
  42. //这个信号放在这个类里是因为,按钮弹出的Item会通过按Esc来返回,这样就不能再发信号还原
  43. //其状态
  44. void coverOnArowItemSignal( bool state ) ;
  45. /**********************这个是当游戏被停用时的发送的信号********************/
  46. //这个是当游戏被停用时的发送的信号
  47. //就是当鼠标点击电脑桌面其他位置时,就是我们平常所说的整个游戏软件失去焦点时。发送这个信号
  48. void gameDeactivateSignal() ;
  49. public:
  50. TetrixWidget(QWidget *parent=0) ;
  51. ~TetrixWidget() ;
  52. private:
  53. QGraphicsView *gameView ;
  54. GameGraphicsScene *gameScene ;
  55. void setTetrixWigAttribute() ;          //设置TetrixWidget类的属性
  56. void initGameSceneAndView() ;           //初始化游戏的场景与视图
  57. QSettings *configIni ;        //这个是用于读取配置文件指针
  58. //这是定义的一个表,用来存储图片名字与图片的指针
  59. //这个作为一个大的容器,所以图片都放在里面。便于之后用
  60. NameAndImageHash  nameImageHash ;
  61. //根据组名及每组对应的图片数目的A值来读取配置文件,并且加载图片文件。
  62. void initAndLoadImage( QString groupname, QString A_valueString ) ;
  63. void loadAllImageFile() ;      //加载所有的图片
  64. //这个坐标ponit用于取图片上某个坐标点的色素作为透明色,默认为QPoint( 0,0 )
  65. QImage *getTransImage( QImage *image , QPoint ponit = QPoint( 0,0 ) ) ;
  66. /*
  67. 这个是处理所有的粉红色背景的图片,使只编程透明色背景
  68. */
  69. void dealPinkBackGroundImage( QString groupname, QString A_valueString ) ;
  70. /*
  71. 这个是因为当第三层出现时,用户按下Esc键,要回到第二层游戏首页,
  72. 所以在这里用这个hash表来记录
  73. */
  74. NumAndPointerHash numPointer ;
  75. /*
  76. 这个是用来记录当前在第二层上面的Item,通过这个序号在NumAndPointerHash
  77. 中查找Item对应的指针,默认为-1
  78. */
  79. int nowIndex ;
  80. /*
  81. 这里是因为,这个设置的图片太小,要把下面的开始与退出按钮给隐藏掉,
  82. 不然用户移动鼠标会误点到
  83. */
  84. void setSomeItemVisible( bool visible ) ;
  85. //从配置文件中读出所要的音量的值
  86. inline int getVolumeValueFromFile( QString groupname ,QString A_valueString ) ;
  87. //从配置文件中读取是否要设置全屏
  88. inline bool getFullScreenValueFromFile( QString groupname ,QString A_valueString ) ;
  89. /****************************最底层的Item******************************/
  90. GameLogoImageItem *logoImageItem ;
  91. void addGameLogoImageItem( ) ;           //添加GameLogoImageItem到场景去
  92. GameBackGroundItem *backGroundItem ;
  93. //这是定义的一个表,用来存储图片名字与图片的坐标
  94. //部分图片的坐标不需要写在配置文件,因为其默认坐标一直都是(0,0)
  95. NameAndPointHash namePointHash ;
  96. //根据组名及每组对应的图片数目的A值来读取配置文件,并且记录到namePointHash中去。
  97. void initNameAndPointHash( QString groupname ,QString A_valueString ) ;
  98. /****************************第二层的Item******************************/
  99. GameButtonItem *dianwoButton ;            //点我的广告按钮
  100. GameButtonItem *moregameButton ;          //更多的游戏按钮
  101. GameButtonItem *startgameButton ;         //开始游戏按钮
  102. GameButtonItem *instrgameButton ;         //游戏介绍按钮
  103. GameButtonItem *gameoptionButton ;        //游戏选项按钮
  104. GameButtonItem *gamehihgscButton ;        //游戏排行榜按钮
  105. GameButtonItem *exitgameButton ;          //退出游戏按钮
  106. GameArrowItem  *arrowItem ;               //箭头Item
  107. /*
  108. 添加所有的第二层的Item,通过一个接口把所有的第二层的Item全部放进来,方便管理
  109. */
  110. void addAllSecondLayerItem() ;
  111. //分开进行添加这样不至于让一个函数变的很长
  112. void addDianWoButton() ;       //添加点我按钮
  113. void addMoreGameButton() ;     //添加更多的游戏按钮
  114. void addStartGameButton() ;    //添加开始游戏按钮
  115. void addInstrGameButton() ;    //添加游戏介绍按钮
  116. void addGameOptionButton() ;   //添加游戏选项按钮
  117. void addGameHihgscButton() ;   //添加游戏排行榜按钮
  118. void addExitGameButton() ;     //添加退出游戏按钮
  119. void addArrowItem() ;          //添加箭头Item
  120. /****************************第三层的Item******************************/
  121. GameMovBackGrouItem *movBacGrouItem ;    //动态背景图片
  122. GameIntroductionItem *introduItem ;      //游戏介绍Item
  123. GameOptionItem *optionItem ;             //游戏选项Item
  124. GameHighWinItem *highWinItem ;           //游戏排行榜Item
  125. /**************************游戏的背景音乐与音效的处理*************************/
  126. GameGameSound *gameSound ;      //游戏的背景音乐与音效
  127. void initGameGameSound() ;      //初始化游戏的背景音乐与音效
  128. private slots:
  129. void addGameBackGroundItem( ) ;         //添加GameBackGroundItem到场景去
  130. void mouseOnStartgameButton( ) ;        //光标在开始游戏按钮
  131. void mouseOnInstrgameButton( ) ;        //光标在游戏介绍按钮
  132. void mouseOnGameOptionButton( ) ;       //光标在游戏选项按钮
  133. void mouseOnGameHihgscButton( ) ;       //光标在游戏排行榜按钮
  134. void mouseOnExitgameButton( ) ;         //光标在退出游戏按钮
  135. void clickOnStartgameButton( ) ;        //单击开始游戏按钮
  136. void clickOnInstrgameButton( ) ;        //单击游戏介绍按钮
  137. void clickOnGameOptionButton( ) ;       //单击游戏选项按钮
  138. void clickOnGameHihgscButton( ) ;       //单击游戏排行榜按钮
  139. void clickOnExitgameButton( ) ;         //单击退出游戏按钮
  140. /*
  141. 这个是根据当前箭头序号来确定进入到哪个Item的槽函数
  142. */
  143. void clickOnButton( int index ) ;
  144. /*
  145. 用户按Esc键返回到第二层,返回游戏首页的信号的槽函数
  146. */
  147. void backToSecondLaySlot( int index ) ;
  148. //这个是前景Item的退回到游戏首页的按钮的槽函数
  149. void backToGameHomeSlot() ;
  150. protected:
  151. //事件过滤器
  152. bool eventFilter ( QObject * watched, QEvent * event ) ;
  153. void    resizeEvent ( QResizeEvent * event );
  154. };
  155. #endif // TETRIXWIDGET_H

(3)TetrixWidget.cpp

  1. /************************************************************************
  2. * 版权所有 (C)2011, 上海欣诺有限公司。
  3. *
  4. * 文件名称:  TetrixWidget.cpp
  5. * 文件标识:
  6. * 内容摘要:  TetrixWidget类的实现
  7. * 其它说明:
  8. * 当前版本: 1.0
  9. * 作    者:
  10. * 完成日期:
  11. *
  12. * 修改记录1:
  13. *    修改日期:
  14. *    版 本 号:
  15. *    修 改 人:
  16. *    修改内容:
  17. * 修改记录2:…
  18. ************************************************************************/
  19. #include "TetrixWidget.h"
  20. #include <QDebug>
  21. /**************************************************************************
  22. *                            常量                                        *
  23. **************************************************************************/
  24. /**************************************************************************
  25. *                            宏                                          *
  26. **************************************************************************/
  27. /**************************************************************************
  28. *                          数据类型                                       *
  29. **************************************************************************/
  30. /**************************************************************************
  31. *                           全局变量                                      *
  32. **************************************************************************/
  33. /**************************************************************************
  34. *                           局部函数原型                                  *
  35. **************************************************************************/
  36. /**************************************************************************
  37. *                  类TetrixWidget实现--公有部分                          *
  38. **************************************************************************/
  39. /**************************************************************************
  40. * 函数名称: TetrixWidget
  41. * 功能描述: 构造函数
  42. * 访问的表:
  43. * 修改的表:
  44. * 输入参数:
  45. * 输出参数:
  46. * 返 回 值:
  47. * 其它说明:
  48. * 修改日期    版本号     修改人        修改内容
  49. * -----------------------------------------------
  50. *
  51. **************************************************************************/
  52. TetrixWidget::TetrixWidget(QWidget *parent)
  53. :QWidget(parent),nowIndex( -1 )
  54. {
  55. //初始化,设置其读取ini为后缀的配置文件
  56. configIni = new QSettings( CONFIGUREPATH,QSettings::IniFormat ) ;
  57. //首先加载是两个logo文件
  58. initAndLoadImage( GROUPNAME_LOGO,LOGO_COUNT ) ;
  59. /*
  60. 设置控件显示的参数,因为其大小是根据logo图片的大小还算的,所以要放在读取配置文件之后
  61. */
  62. setTetrixWigAttribute() ;
  63. //初始化视图的大小也是根据两个logo图片的大小来确定的,所以要放在读取配置文件之后
  64. initGameSceneAndView() ;
  65. addGameLogoImageItem() ;      //添加GameLogoImageItem到场景去
  66. /*
  67. 只所以把GameLogoImageItem添加到场景去再加载所有的图片,
  68. 是因为logo图片有个渐显的效果,可以利用这个间隙把所有的图片
  69. 全部加载进来,该处理的出来掉。这样可以有效的利用时间,让用户感觉不到
  70. 加载图片过程
  71. */
  72. loadAllImageFile() ;     //加载所有的图片
  73. /*
  74. 根据组名及每组对应的图片数目的A值来读取配置文件,并且记录到namePointHash中去。
  75. */
  76. initNameAndPointHash( GROUPNAME_COORDINATE ,COORDINATE_COUNT) ;
  77. }
  78. /***********************************************************************
  79. * 函数名称: ~TetrixWidget()
  80. * 功能描述: 析构函数
  81. * 访问的表:
  82. * 修改的表:
  83. * 输入参数:
  84. * 输出参数:
  85. * 返 回 值:
  86. * 其它说明:
  87. * 修改日期    版本号     修改人        修改内容
  88. * -----------------------------------------------
  89. *
  90. *************************************************************************/
  91. TetrixWidget::~TetrixWidget()
  92. {
  93. //这个显示delete,qt都可以通过qt来进行delete的
  94. delete gameSound ;
  95. }
  96. /**************************************************************************
  97. * 函数名称: setTetrixWigAttribute
  98. * 功能描述: 设置TetrixWidget类的属性
  99. * 访问的表:
  100. * 修改的表:
  101. * 输入参数:
  102. * 输出参数:
  103. * 返 回 值:
  104. * 其它说明:
  105. * 修改日期    版本号     修改人        修改内容
  106. * -----------------------------------------------
  107. *
  108. **************************************************************************/
  109. void TetrixWidget::setTetrixWigAttribute()
  110. {
  111. /*
  112. 这里是设置屏蔽窗口最大化的按钮的属性,在linux下没有效果,在windows有效果不知道为啥
  113. */
  114. this->setWindowFlags( Qt::Window
  115. | Qt::WindowMinimizeButtonHint
  116. | Qt::WindowCloseButtonHint );
  117. //设置居中屏幕显示
  118. QDesktopWidget* desktop = QApplication::desktop(); // =qApp->desktop();也可以
  119. /*
  120. 这个是根据logo的大小来确定的,由于控件比图片多一个宽口管理其,所以height加40进行调整
  121. ,以达到初始显示在屏幕中间的效果
  122. */
  123. if( nameImageHash.contains( LOGO_1 ) )
  124. {
  125. int width = nameImageHash.value(LOGO_1)->size().width() ;
  126. int height = nameImageHash.value(LOGO_1)->size().height() + 40 ;
  127. move((desktop->width() - width)/2, (desktop->height() - height)/2);
  128. }
  129. //安装事件过滤器
  130. this->installEventFilter( this );
  131. setWindowTitle("俄罗斯方块单机版 V1.0");
  132. }
  133. /**************************************************************************
  134. * 函数名称: initAndLoadImage
  135. * 功能描述: 根据组名及每组对应的图片数目的A值来读取配置文件,并且加载图片文件。
  136. * 访问的表:
  137. * 修改的表:
  138. * 输入参数:
  139. * 输出参数:
  140. * 返 回 值:
  141. * 其它说明:
  142. * 修改日期    版本号     修改人        修改内容
  143. * -----------------------------------------------
  144. *
  145. **************************************************************************/
  146. void TetrixWidget::initAndLoadImage(QString groupname, QString A_valueString)
  147. {
  148. if( !groupname.isEmpty() )
  149. {
  150. configIni->beginGroup( groupname );
  151. configIni->setIniCodec( "UTF-8" );
  152. int count = configIni->value( A_valueString).toInt() ;
  153. QStringList keyslist = configIni->allKeys() ;
  154. //configIni->allKeys()因为这个里面有包含啦求数目的那条A值
  155. if( keyslist.count() == (count + 1) )
  156. {
  157. foreach( QString value,keyslist )
  158. {
  159. //如果为数目的A值,则不做处理
  160. if( QString::compare( value , A_valueString ) )
  161. {
  162. QString imagePath = configIni->value( value ).toString() ;
  163. QImage *iamge = new QImage( imagePath ) ;
  164. //如果不能加载图片文件,则退出
  165. if( iamge->isNull() )
  166. {
  167. QString errorString = QString("File :%1 is not exit !" ).arg(imagePath) ;
  168. DEBUGP(  errorString ) ;
  169. configIni->endGroup();
  170. return ;
  171. }
  172. //把图片名字与图片加入到hash表中
  173. nameImageHash.insert( value,iamge ) ;
  174. }
  175. }
  176. }
  177. else
  178. {
  179. DEBUGP( "Configure File Num Error !" ) ;
  180. configIni->endGroup();
  181. return ;
  182. }
  183. configIni->endGroup();
  184. }
  185. }
  186. /*************************************************************************
  187. * 函数名称: initNameAndPointHash
  188. * 功能描述: 根据组名及每组对应的图片数目的A值来读取配置文件,并且记录到namePointHash中去
  189. * 访问的表:
  190. * 修改的表:
  191. * 输入参数:
  192. * 输出参数:
  193. * 返 回 值:
  194. * 其它说明:
  195. * 修改日期    版本号     修改人        修改内容
  196. * -----------------------------------------------
  197. *
  198. **************************************************************************/
  199. void TetrixWidget::initNameAndPointHash(QString groupname, QString A_valueString)
  200. {
  201. if( !groupname.isEmpty() )
  202. {
  203. configIni->beginGroup( groupname );
  204. configIni->setIniCodec( "UTF-8" );
  205. int count = configIni->value( A_valueString ).toInt() ;
  206. QStringList keyslist = configIni->allKeys() ;
  207. //configIni->allKeys()因为这个里面有包含啦求数目的那条A值
  208. if( keyslist.count() == (count + 1) )
  209. {
  210. foreach( QString key,keyslist )
  211. {   //如果为数目的A值,则不做处理
  212. if( QString::compare( key , A_valueString ) )
  213. {
  214. QPoint pos = configIni->value(key).toPoint() ;
  215. //DEBUGP( pos ) ;
  216. namePointHash.insert( key,pos ) ;
  217. }
  218. }
  219. }
  220. configIni->endGroup();
  221. }
  222. }
  223. /*************************************************************************
  224. * 函数名称: getTransImage
  225. * 功能描述: 这个坐标ponit用于取图片上某个坐标点的色素作为透明色,默认为QPoint( 0,0 )
  226. * 访问的表:
  227. * 修改的表:
  228. * 输入参数:
  229. * 输出参数:
  230. * 返 回 值:
  231. * 其它说明:
  232. * 修改日期    版本号     修改人        修改内容
  233. * -----------------------------------------------
  234. *
  235. **************************************************************************/
  236. QImage *TetrixWidget::getTransImage(QImage *image, QPoint ponit)
  237. {
  238. //判断所取的点是否在图片内部
  239. if( image->valid( ponit ) )
  240. {
  241. QRgb  rgb = image->pixel( ponit );
  242. QVector<QRgb> rgbVector = image->colorTable () ;
  243. for (int i = 0; i < rgbVector.size(); ++i)
  244. {
  245. if( rgbVector.at(i) == rgb )
  246. {
  247. /*
  248. 注意这里如果要变成黑色背景的话就是QRgb rgb2 = QColor(0, 0, 0, 0).rgb() ;
  249. 留意 rgb()与rgba()的区别
  250. */
  251. QRgb rgb2 = QColor(0, 0, 0, 0).rgba() ;
  252. image->setColor( i,rgb2 );
  253. return image ;
  254. }
  255. }
  256. }
  257. return image ;
  258. }
  259. /*************************************************************************
  260. * 函数名称: initGameSceneAndView
  261. * 功能描述: 初始化游戏的场景与视图
  262. * 访问的表:
  263. * 修改的表:
  264. * 输入参数:
  265. * 输出参数:
  266. * 返 回 值:
  267. * 其它说明:
  268. * 修改日期    版本号     修改人        修改内容
  269. * -----------------------------------------------
  270. *
  271. **************************************************************************/
  272. void TetrixWidget::initGameSceneAndView()
  273. {
  274. gameScene = new GameGraphicsScene() ;
  275. gameScene->setBackgroundBrush(Qt::black);
  276. //这里要是不限制场景的大小的话,之后小鱼游动时,其场景会增大,之后显示就会移动
  277. //因为小鱼要被完全隐藏掉之后,才掉头重新开始游这样就可能增大场景,故再这里给写死
  278. gameScene->setSceneRect(0, 0, SCENEWIDTH, SCENEHEIGHT);
  279. gameView = new QGraphicsView(this) ;
  280. gameView->setScene(gameScene);
  281. //设置文字去锯齿显示
  282. gameView->setRenderHints(QPainter::Antialiasing
  283. | QPainter::TextAntialiasing);
  284. //设置大小,跟logo图片的大小一样大,不能写死,这样灵活些
  285. if( nameImageHash.contains( LOGO_1 ) )
  286. {
  287. /*
  288. 在这里把长宽进行微调,不然会出现在场景中滚动鼠标是,场景上下移动的问题
  289. */
  290. int width = nameImageHash.value(LOGO_1)->size().width()+ 2 ;
  291. int height = nameImageHash.value(LOGO_1)->size().height() + 2 ;
  292. gameView->resize( width,height );
  293. }
  294. //关闭水平滚动条与垂直滚动条
  295. gameView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
  296. gameView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
  297. }
  298. /*************************************************************************
  299. * 函数名称: loadAllImageFile
  300. * 功能描述: 加载所有的图片
  301. * 访问的表:
  302. * 修改的表:
  303. * 输入参数:
  304. * 输出参数:
  305. * 返 回 值:
  306. * 其它说明:
  307. * 修改日期    版本号     修改人        修改内容
  308. * -----------------------------------------------
  309. *
  310. **************************************************************************/
  311. void TetrixWidget::loadAllImageFile()
  312. {
  313. //加载ModeWin组的文件
  314. initAndLoadImage( GROUPNAME_MODEWIN,MODEWIN_COUNT ) ;
  315. //加载DianWoWin组的文件
  316. initAndLoadImage( GROUPNAME_DIANWOWIN,DIANWOWIN_COUNT ) ;
  317. //加载OptionWin组的文件
  318. initAndLoadImage( GROUPNAME_OPTIONWID,OPTIONWID_COUNT ) ;
  319. //加载Box组的文件
  320. initAndLoadImage( GROUPNAME_BOX,BOX_COUNT ) ;
  321. //加载BackWin组的文件
  322. initAndLoadImage( GROUPNAME_BACKWIN,BACKWIN_COUNT ) ;
  323. //加载BombWin组的文件
  324. initAndLoadImage( GROUPNAME_BOMBWIN,BOMBWIN_COUNT ) ;
  325. //加载MainWin组的文件
  326. initAndLoadImage( GROUPNAME_MAINWIN,MAINWIN_COUNT ) ;
  327. //修改MustModify组A值所对应的图片,去掉其背景粉红色,变为透明背景
  328. dealPinkBackGroundImage( GROUPNAME_MUSTMODIFY,MUSTMODIFY_COUNT ) ;
  329. }
  330. /*************************************************************************
  331. * 函数名称: dealPinkBackGroundImage
  332. * 功能描述: 添加dealPinkBackGroundImage到场景去
  333. * 访问的表:
  334. * 修改的表:
  335. * 输入参数:
  336. * 输出参数:
  337. * 返 回 值:
  338. * 其它说明:
  339. * 修改日期    版本号     修改人        修改内容
  340. * -----------------------------------------------
  341. *
  342. **************************************************************************/
  343. void TetrixWidget::dealPinkBackGroundImage(QString groupname, QString A_valueString )
  344. {
  345. if( !groupname.isEmpty() )
  346. {
  347. configIni->beginGroup( groupname );
  348. configIni->setIniCodec( "UTF-8" );
  349. int count = configIni->value( A_valueString).toInt() ;
  350. QStringList keyslist = configIni->allKeys() ;
  351. //configIni->allKeys()因为这个里面有包含啦求数目的那条A值
  352. if( keyslist.count() == (count + 1) )
  353. {
  354. foreach( QString key,keyslist )
  355. {
  356. //如果为数目的A值,则不做处理
  357. if( QString::compare( key , A_valueString ) )
  358. {
  359. //DEBUGP( key ) ;
  360. //对图片进行处理,去掉粉红的背景
  361. QImage *image = getTransImage( nameImageHash.value( key ) );
  362. //重新发修改后的值加入到hash表中
  363. nameImageHash.insert( key,image ) ;
  364. }
  365. }
  366. }
  367. //注意读完这个组一定要关闭,否则会影响到下面的读取
  368. configIni->endGroup();
  369. }
  370. }
  371. /*************************************************************************
  372. * 函数名称: addGameLogoImageItem
  373. * 功能描述: 添加GameLogoImageItem到场景去
  374. * 访问的表:
  375. * 修改的表:
  376. * 输入参数:
  377. * 输出参数:
  378. * 返 回 值:
  379. * 其它说明:
  380. * 修改日期    版本号     修改人        修改内容
  381. * -----------------------------------------------
  382. *
  383. **************************************************************************/
  384. void TetrixWidget::addGameLogoImageItem()
  385. {
  386. logoImageItem = new GameLogoImageItem() ;
  387. //
  388. connect(logoImageItem,SIGNAL(addGameBackGroundItem())
  389. ,this,SLOT(addGameBackGroundItem())) ;
  390. logoImageItem->setGameScene( gameScene,nameImageHash);
  391. }
  392. /*************************************************************************
  393. * 函数名称: addAllSecondLayerItem
  394. * 功能描述: 添加所有的第二层的Item,通过一个接口把所有的第二层的Item全部放进来,方便管理
  395. * 访问的表:
  396. * 修改的表:
  397. * 输入参数:
  398. * 输出参数:
  399. * 返 回 值:
  400. * 其它说明:
  401. * 修改日期    版本号     修改人        修改内容
  402. * -----------------------------------------------
  403. *
  404. **************************************************************************/
  405. void TetrixWidget::addAllSecondLayerItem()
  406. {
  407. //DEBUGP( "addAllSecondLayerItem" ) ;
  408. //点我广告的按钮
  409. addDianWoButton() ;
  410. //更多的游戏按钮
  411. addMoreGameButton() ;
  412. //开始游戏按钮
  413. addStartGameButton() ;
  414. //游戏介绍按钮
  415. addInstrGameButton() ;
  416. //游戏选项按钮
  417. addGameOptionButton() ;
  418. //游戏排行榜按钮
  419. addGameHihgscButton() ;
  420. //退出游戏按钮
  421. addExitGameButton() ;
  422. //箭头Item
  423. addArrowItem() ;
  424. }
  425. /*************************************************************************
  426. * 函数名称: addArrowItem
  427. * 功能描述: 添加箭头Item
  428. * 访问的表:
  429. * 修改的表:
  430. * 输入参数:
  431. * 输出参数:
  432. * 返 回 值:
  433. * 其它说明:
  434. * 修改日期    版本号     修改人        修改内容
  435. * -----------------------------------------------
  436. *
  437. **************************************************************************/
  438. void TetrixWidget::addArrowItem()
  439. {
  440. //箭头Item
  441. arrowItem = new GameArrowItem( MODEWIN_ARROW ) ;
  442. //在这里连接改变坐标的信号与槽
  443. connect(this,SIGNAL(moveArrowat(int)),arrowItem,SLOT(setPointListIndex(int))) ;
  444. //这个是根据当前箭头序号来确定进入到哪个Item的槽函数
  445. connect(arrowItem,SIGNAL(enterIntoButton(int)),this,SLOT(clickOnButton(int)));
  446. //通过这个信号返回到第二层----游戏首页
  447. connect(arrowItem,SIGNAL(backToSecondLay(int)),this,SLOT(backToSecondLaySlot(int)));
  448. arrowItem->setGameScene(gameScene,nameImageHash,namePointHash);
  449. /*
  450. 这里为啦保持跟上面的一直,所以把设置Z轴的放在这里,其实不必要放在这里,
  451. 因为箭头类是一个单独的类,只有一个对象在用
  452. */
  453. arrowItem->setZValue(1.0);
  454. }
  455. /*************************************************************************
  456. * 函数名称: addExitGameButton
  457. * 功能描述: 添加退出游戏按钮
  458. * 访问的表:
  459. * 修改的表:
  460. * 输入参数:
  461. * 输出参数:
  462. * 返 回 值:
  463. * 其它说明:
  464. * 修改日期    版本号     修改人        修改内容
  465. * -----------------------------------------------
  466. *
  467. **************************************************************************/
  468. void TetrixWidget::addExitGameButton()
  469. {
  470. //退出游戏按钮
  471. exitgameButton = new GameButtonItem( MODEWIN_EXIT ) ;
  472. connect(exitgameButton,SIGNAL(mouseOnMe()),
  473. this,SLOT(mouseOnExitgameButton())) ;
  474. connect(exitgameButton,SIGNAL(buttonClick()),this,SLOT(close())) ;
  475. exitgameButton->setGameScene(gameScene,nameImageHash,namePointHash);
  476. exitgameButton->setZValue(1.0);    //因为不是全部都在同一层,所有得分开来设置其Z轴的值
  477. }
  478. /*************************************************************************
  479. * 函数名称: addGameHihgscButton
  480. * 功能描述: 添加游戏排行榜按钮
  481. * 访问的表:
  482. * 修改的表:
  483. * 输入参数:
  484. * 输出参数:
  485. * 返 回 值:
  486. * 其它说明:
  487. * 修改日期    版本号     修改人        修改内容
  488. * -----------------------------------------------
  489. *
  490. **************************************************************************/
  491. void TetrixWidget::addGameHihgscButton()
  492. {
  493. //游戏排行榜按钮
  494. gamehihgscButton = new GameButtonItem( MODEWIN_HIGHSCORE ) ;
  495. connect(gamehihgscButton,SIGNAL(mouseOnMe()),
  496. this,SLOT(mouseOnGameHihgscButton())) ;
  497. connect(gamehihgscButton,SIGNAL(buttonClick()),this,SLOT(clickOnGameHihgscButton()));
  498. gamehihgscButton->setGameScene(gameScene,nameImageHash,namePointHash);
  499. gamehihgscButton->setZValue(1.0);    //因为不是全部都在同一层,所有得分开来设置其Z轴的值
  500. }
  501. /*************************************************************************
  502. * 函数名称: addGameOptionButton
  503. * 功能描述: 添加游戏选项按钮
  504. * 访问的表:
  505. * 修改的表:
  506. * 输入参数:
  507. * 输出参数:
  508. * 返 回 值:
  509. * 其它说明:
  510. * 修改日期    版本号     修改人        修改内容
  511. * -----------------------------------------------
  512. *
  513. **************************************************************************/
  514. void TetrixWidget::addGameOptionButton()
  515. {
  516. //游戏选项按钮
  517. gameoptionButton = new GameButtonItem( MODEWIN_OPTION ) ;
  518. connect(gameoptionButton,SIGNAL(mouseOnMe()),
  519. this,SLOT(mouseOnGameOptionButton())) ;
  520. connect(gameoptionButton,SIGNAL(buttonClick()),
  521. this,SLOT(clickOnGameOptionButton())) ;
  522. gameoptionButton->setGameScene(gameScene,nameImageHash,namePointHash);
  523. gameoptionButton->setZValue(1.0);    //因为不是全部都在同一层,所有得分开来设置其Z轴的值
  524. }
  525. /*************************************************************************
  526. * 函数名称: addInstrGameButton
  527. * 功能描述: 添加游戏介绍按钮
  528. * 访问的表:
  529. * 修改的表:
  530. * 输入参数:
  531. * 输出参数:
  532. * 返 回 值:
  533. * 其它说明:
  534. * 修改日期    版本号     修改人        修改内容
  535. * -----------------------------------------------
  536. *
  537. **************************************************************************/
  538. void TetrixWidget::addInstrGameButton()
  539. {
  540. //游戏介绍按钮
  541. instrgameButton = new GameButtonItem( MODEWIN_INSTRUCTION ) ;
  542. connect(instrgameButton,SIGNAL(mouseOnMe()),
  543. this,SLOT(mouseOnInstrgameButton())) ;
  544. connect(instrgameButton,SIGNAL(buttonClick())
  545. ,this,SLOT(clickOnInstrgameButton())) ;
  546. instrgameButton->setGameScene(gameScene,nameImageHash,namePointHash);
  547. instrgameButton->setZValue(1.0);    //因为不是全部都在同一层,所有得分开来设置其Z轴的值
  548. }
  549. /*************************************************************************
  550. * 函数名称: addDianWoButton
  551. * 功能描述: 添加点我按钮
  552. * 访问的表:
  553. * 修改的表:
  554. * 输入参数:
  555. * 输出参数:
  556. * 返 回 值:
  557. * 其它说明:
  558. * 修改日期    版本号     修改人        修改内容
  559. * -----------------------------------------------
  560. *
  561. **************************************************************************/
  562. void TetrixWidget::addDianWoButton()
  563. {
  564. //点我广告的按钮
  565. dianwoButton = new GameButtonItem( DIANWOWIN_BUTTON ) ;
  566. dianwoButton->setGameScene(gameScene,nameImageHash,namePointHash);
  567. dianwoButton->setZValue(1.0);    //因为不是全部都在同一层,所有得分开来设置其Z轴的值
  568. }
  569. /*************************************************************************
  570. * 函数名称: addMoreGameButton
  571. * 功能描述: 添加更多的游戏按钮
  572. * 访问的表:
  573. * 修改的表:
  574. * 输入参数:
  575. * 输出参数:
  576. * 返 回 值:
  577. * 其它说明:
  578. * 修改日期    版本号     修改人        修改内容
  579. * -----------------------------------------------
  580. *
  581. **************************************************************************/
  582. void TetrixWidget::addMoreGameButton()
  583. {
  584. //更多的游戏按钮
  585. moregameButton = new GameButtonItem( MODEWIN_MOREGAME ) ;
  586. moregameButton->setGameScene(gameScene,nameImageHash,namePointHash);
  587. moregameButton->setZValue(1.0);    //因为不是全部都在同一层,所有得分开来设置其Z轴的值
  588. }
  589. /*************************************************************************
  590. * 函数名称: addStartGameButton
  591. * 功能描述: 添加开始游戏按钮
  592. * 访问的表:
  593. * 修改的表:
  594. * 输入参数:
  595. * 输出参数:
  596. * 返 回 值:
  597. * 其它说明:
  598. * 修改日期    版本号     修改人        修改内容
  599. * -----------------------------------------------
  600. *
  601. **************************************************************************/
  602. void TetrixWidget::addStartGameButton()
  603. {
  604. startgameButton = new GameButtonItem( MODEWIN_START ) ;
  605. connect(startgameButton,SIGNAL(mouseOnMe()),
  606. this,SLOT(mouseOnStartgameButton())) ;
  607. connect(startgameButton,SIGNAL(buttonClick()),
  608. this,SLOT(clickOnStartgameButton())) ;
  609. startgameButton->setGameScene(gameScene,nameImageHash,namePointHash);
  610. startgameButton->setZValue(1.0);    //因为不是全部都在同一层,所有得分开来设置其Z轴的值
  611. }
  612. /*************************************************************************
  613. * 函数名称: setSomeItemVisible
  614. * 功能描述: 这里是因为,这个设置的图片太小,要把下面的开始与退出按钮给隐藏掉,
  615. *           不然用户移动鼠标会误点到
  616. * 访问的表:
  617. * 修改的表:
  618. * 输入参数:
  619. * 输出参数:
  620. * 返 回 值:
  621. * 其它说明:控制这四个按钮的显示与隐藏
  622. * 修改日期    版本号     修改人        修改内容
  623. * -----------------------------------------------
  624. *
  625. **************************************************************************/
  626. void TetrixWidget::setSomeItemVisible(bool visible)
  627. {
  628. startgameButton->setVisible( visible );
  629. exitgameButton->setVisible( visible );
  630. dianwoButton->setVisible( visible );
  631. moregameButton->setVisible( visible );
  632. }
  633. /*************************************************************************
  634. * 函数名称: getVolumeValueFromFile
  635. * 功能描述: 从配置文件中读出所要的音量的值
  636. * 访问的表:
  637. * 修改的表:
  638. * 输入参数:
  639. * 输出参数:
  640. * 返 回 值:
  641. * 其它说明:控制这四个按钮的显示与隐藏
  642. * 修改日期    版本号     修改人        修改内容
  643. * -----------------------------------------------
  644. *
  645. **************************************************************************/
  646. inline int TetrixWidget::getVolumeValueFromFile(QString groupname, QString A_valueString)
  647. {
  648. configIni->beginGroup( groupname );
  649. configIni->setIniCodec( "UTF-8" );
  650. int volume = configIni->value( A_valueString ).toInt() ;
  651. configIni->endGroup();
  652. return volume ;
  653. }
  654. /*************************************************************************
  655. * 函数名称: getFullScreenValueFromFile
  656. * 功能描述: 从配置文件中读取是否要设置全屏
  657. * 访问的表:
  658. * 修改的表:
  659. * 输入参数:
  660. * 输出参数:
  661. * 返 回 值:
  662. * 其它说明:控制这四个按钮的显示与隐藏
  663. * 修改日期    版本号     修改人        修改内容
  664. * -----------------------------------------------
  665. *
  666. **************************************************************************/
  667. inline bool TetrixWidget::getFullScreenValueFromFile(QString groupname, QString A_valueString)
  668. {
  669. configIni->beginGroup( groupname );
  670. configIni->setIniCodec( "UTF-8" );
  671. bool fullscreen = configIni->value( A_valueString ).toBool() ;
  672. configIni->endGroup();
  673. return fullscreen ;
  674. }
  675. /*************************************************************************
  676. * 函数名称: initGameGameSound
  677. * 功能描述: 初始化游戏的背景音乐与音效
  678. * 访问的表:
  679. * 修改的表:
  680. * 输入参数:
  681. * 输出参数:
  682. * 返 回 值:
  683. * 其它说明:
  684. * 修改日期    版本号     修改人        修改内容
  685. * -----------------------------------------------
  686. *
  687. **************************************************************************/
  688. void TetrixWidget::initGameGameSound()
  689. {
  690. int musicVolume = getVolumeValueFromFile( GROUPNAME_SETTINGS,SETTINGS_MUSIC ) ;
  691. int audioVolume = getVolumeValueFromFile( GROUPNAME_SETTINGS,SETTINGS_AUDIO ) ;
  692. gameSound = new GameGameSound( musicVolume,audioVolume ) ;
  693. gameSound->setGameSceneAndConfigF(gameScene,configIni);
  694. }
  695. /*************************************************************************
  696. * 函数名称: addGameBackGroundItem
  697. * 功能描述: 添加addGameBackGroundItem到场景去
  698. * 访问的表:
  699. * 修改的表:
  700. * 输入参数:
  701. * 输出参数:
  702. * 返 回 值:
  703. * 其它说明:
  704. * 修改日期    版本号     修改人        修改内容
  705. * -----------------------------------------------
  706. *
  707. **************************************************************************/
  708. void TetrixWidget::addGameBackGroundItem()
  709. {
  710. //在添加背景图片前先移除两个logo图片
  711. gameScene->removeItem( logoImageItem );
  712. backGroundItem = new GameBackGroundItem() ;
  713. backGroundItem->setGameScene( gameScene,nameImageHash );
  714. //添加所有的第二层的Item
  715. addAllSecondLayerItem() ;
  716. //初始化游戏的背景音乐与音效
  717. initGameGameSound();
  718. }
  719. /*************************************************************************
  720. * 函数名称: mouseOnStartgameButton
  721. * 功能描述: 光标在开始游戏按钮
  722. * 访问的表:
  723. * 修改的表:
  724. * 输入参数:
  725. * 输出参数:
  726. * 返 回 值:
  727. * 其它说明: 5个Button发送过来的信号分别对应不同的槽函数,在槽函数中又分别发送同一信号
  728. *          不同参数,这样觉得有点麻烦,一下子用啦5个槽函数,目前没有想到更好的办法。
  729. * 修改日期    版本号     修改人        修改内容
  730. * -----------------------------------------------
  731. *
  732. **************************************************************************/
  733. void TetrixWidget::mouseOnStartgameButton()
  734. {
  735. //DEBUGP( 0 ) ;
  736. emit moveArrowat( 0) ;
  737. }
  738. /*************************************************************************
  739. * 函数名称: mouseOnInstrgameButton
  740. * 功能描述: 光标在游戏介绍按钮
  741. * 访问的表:
  742. * 修改的表:
  743. * 输入参数:
  744. * 输出参数:
  745. * 返 回 值:
  746. * 其它说明:
  747. * 修改日期    版本号     修改人        修改内容
  748. * -----------------------------------------------
  749. *
  750. **************************************************************************/
  751. void TetrixWidget::mouseOnInstrgameButton()
  752. {
  753. //DEBUGP( 1 ) ;
  754. emit moveArrowat( 1 ) ;
  755. }
  756. /*************************************************************************
  757. * 函数名称: mouseOnGameOptionButton
  758. * 功能描述: 光标在游戏选项按钮
  759. * 访问的表:
  760. * 修改的表:
  761. * 输入参数:
  762. * 输出参数:
  763. * 返 回 值:
  764. * 其它说明:
  765. * 修改日期    版本号     修改人        修改内容
  766. * -----------------------------------------------
  767. *
  768. **************************************************************************/
  769. void TetrixWidget::mouseOnGameOptionButton()
  770. {
  771. //DEBUGP( 2 ) ;
  772. emit moveArrowat( 2 ) ;
  773. }
  774. /*************************************************************************
  775. * 函数名称: mouseOnGameHihgscButton
  776. * 功能描述: 光标在游戏排行榜按钮
  777. * 访问的表:
  778. * 修改的表:
  779. * 输入参数:
  780. * 输出参数:
  781. * 返 回 值:
  782. * 其它说明:
  783. * 修改日期    版本号     修改人        修改内容
  784. * -----------------------------------------------
  785. *
  786. **************************************************************************/
  787. void TetrixWidget::mouseOnGameHihgscButton()
  788. {
  789. //DEBUGP( 3 ) ;
  790. emit moveArrowat( 3 ) ;
  791. }
  792. /*************************************************************************
  793. * 函数名称: mouseOnExitgameButton
  794. * 功能描述: 光标在退出游戏按钮
  795. * 访问的表:
  796. * 修改的表:
  797. * 输入参数:
  798. * 输出参数:
  799. * 返 回 值:
  800. * 其它说明:
  801. * 修改日期    版本号     修改人        修改内容
  802. * -----------------------------------------------
  803. *
  804. **************************************************************************/
  805. void TetrixWidget::mouseOnExitgameButton()
  806. {
  807. //DEBUGP( 4 ) ;
  808. emit moveArrowat( 4 ) ;
  809. }
  810. /*************************************************************************
  811. * 函数名称: clickOnStartgameButton
  812. * 功能描述: 单击开始游戏按钮
  813. * 访问的表:
  814. * 修改的表:
  815. * 输入参数:
  816. * 输出参数:
  817. * 返 回 值:
  818. * 其它说明:
  819. * 修改日期    版本号     修改人        修改内容
  820. * -----------------------------------------------
  821. *
  822. **************************************************************************/
  823. void TetrixWidget::clickOnStartgameButton()
  824. {
  825. movBacGrouItem =new GameMovBackGrouItem( MAINWIN_BACKGROUND ) ;
  826. //这个作为序号0记录到hash表中
  827. nowIndex = 0 ;
  828. numPointer.insert( nowIndex,(void *)movBacGrouItem ) ;
  829. connect( this,SIGNAL(coverOnArowItemSignal(bool)),
  830. gameScene,SIGNAL(changeCoveredStateSignal(bool))) ;
  831. //转发游戏窗口停用信号到场景中的游戏暂停信号
  832. connect(this,SIGNAL(gameDeactivateSignal()),gameScene,SIGNAL(gameDeactivateSignal())) ;
  833. //连接从场景中转发出来的回到游戏首页的信号与槽函数
  834. connect(gameScene,SIGNAL(backToGameHomeSignal()),
  835. this,SLOT(backToGameHomeSlot())) ;
  836. movBacGrouItem->setGameScene( gameScene,nameImageHash,namePointHash );
  837. movBacGrouItem->setZValue( 3.0 ) ;   //这个是作为第三层显示的
  838. //发送信号来还原之前改变的箭头Item的遮蔽状态
  839. emit coverOnArowItemSignal( true );
  840. }
  841. /*************************************************************************
  842. * 函数名称: clickOnInstrgameButton
  843. * 功能描述: 单击游戏介绍按钮
  844. * 访问的表:
  845. * 修改的表:
  846. * 输入参数:
  847. * 输出参数:
  848. * 返 回 值:
  849. * 其它说明:
  850. * 修改日期    版本号     修改人        修改内容
  851. * -----------------------------------------------
  852. *
  853. **************************************************************************/
  854. void TetrixWidget::clickOnInstrgameButton()
  855. {
  856. introduItem = new GameIntroductionItem( MODEWIN_HELP ) ;
  857. //这个作为序号1记录到hash表中
  858. nowIndex = 1 ;
  859. numPointer.insert( nowIndex,(void *)introduItem ) ;
  860. //返回游戏首页的信号的槽函数
  861. connect(introduItem,SIGNAL(backToSecondLay(int)),this,SLOT(backToSecondLaySlot(int))) ;
  862. connect( this,SIGNAL(coverOnArowItemSignal(bool)),
  863. gameScene,SIGNAL(changeCoveredStateSignal(bool))) ;
  864. introduItem->setGameScene( gameScene,nameImageHash );
  865. introduItem->setZValue( 3.0 ) ;   //这个是作为第三层显示的
  866. //发送信号来还原之前改变的箭头Item的遮蔽状态
  867. emit coverOnArowItemSignal( true );
  868. }
  869. /*************************************************************************
  870. * 函数名称: clickOnGameOptionButton
  871. * 功能描述: 单击游戏选项按钮
  872. * 访问的表:
  873. * 修改的表:
  874. * 输入参数:
  875. * 输出参数:
  876. * 返 回 值:
  877. * 其它说明:
  878. * 修改日期    版本号     修改人        修改内容
  879. * -----------------------------------------------
  880. *
  881. **************************************************************************/
  882. void TetrixWidget::clickOnGameOptionButton()
  883. {
  884. int musicVolume = getVolumeValueFromFile( GROUPNAME_SETTINGS,SETTINGS_MUSIC ) ;
  885. int audioVolume = getVolumeValueFromFile( GROUPNAME_SETTINGS,SETTINGS_AUDIO ) ;
  886. bool fullScreen = getFullScreenValueFromFile( GROUPNAME_SETTINGS,SETTINGS_FULLSCREEN) ;
  887. //DEBUGP( audioVolume ) ;
  888. optionItem = new GameOptionItem( OPTIONWIN_SETTING,musicVolume,audioVolume,fullScreen ) ;
  889. connect(optionItem,SIGNAL(backToSecondLay(int)),this,SLOT(backToSecondLaySlot(int))) ;
  890. connect( this,SIGNAL(coverOnArowItemSignal(bool)),
  891. gameScene,SIGNAL(changeCoveredStateSignal(bool))) ;
  892. //这个作为序号1记录到hash表中
  893. nowIndex = 2 ;
  894. numPointer.insert( nowIndex,(void *)optionItem ) ;
  895. optionItem->setGameScene( gameScene,nameImageHash,namePointHash );
  896. optionItem->setConfigureFile( configIni );
  897. optionItem->setZValue( 3.0 ) ;   //这个是作为第三层显示的
  898. /*
  899. 这里是因为,这个设置的图片太小,要把下面的开始与退出按钮给隐藏掉,
  900. 不然用户移动鼠标会误点到
  901. */
  902. setSomeItemVisible( false ) ;
  903. //发送信号来还原之前改变的箭头Item的遮蔽状态
  904. emit coverOnArowItemSignal( true );
  905. }
  906. /*************************************************************************
  907. * 函数名称: clickOnGameHihgscButton
  908. * 功能描述: 单击游戏排行榜按钮
  909. * 访问的表:
  910. * 修改的表:
  911. * 输入参数:
  912. * 输出参数:
  913. * 返 回 值:
  914. * 其它说明:
  915. * 修改日期    版本号     修改人        修改内容
  916. * -----------------------------------------------
  917. *
  918. **************************************************************************/
  919. void TetrixWidget::clickOnGameHihgscButton()
  920. {
  921. highWinItem = new GameHighWinItem( MODEWIN_HIGHWIN );
  922. connect(highWinItem,SIGNAL(backToSecondLay(int)),this,SLOT(backToSecondLaySlot(int))) ;
  923. connect( this,SIGNAL(coverOnArowItemSignal(bool)),
  924. gameScene,SIGNAL(changeCoveredStateSignal(bool))) ;
  925. //这个作为序号1记录到hash表中
  926. nowIndex = 3 ;
  927. numPointer.insert( nowIndex,(void *)highWinItem ) ;
  928. highWinItem->setGameScene( gameScene,nameImageHash,namePointHash );
  929. highWinItem->setZValue( 3.0 ) ;   //这个是作为第三层显示的
  930. //发送信号来还原之前改变的箭头Item的遮蔽状态
  931. emit coverOnArowItemSignal( true );
  932. }
  933. /*************************************************************************
  934. * 函数名称: clickOnExitgameButton
  935. * 功能描述: 单击退出游戏按钮
  936. * 访问的表:
  937. * 修改的表:
  938. * 输入参数:
  939. * 输出参数:
  940. * 返 回 值:
  941. * 其它说明:
  942. * 修改日期    版本号     修改人        修改内容
  943. * -----------------------------------------------
  944. *
  945. **************************************************************************/
  946. void TetrixWidget::clickOnExitgameButton()
  947. {
  948. //退出程序
  949. this->close() ;
  950. }
  951. /*************************************************************************
  952. * 函数名称: clickOnButton
  953. * 功能描述: 这个是根据当前箭头序号来确定进入到哪个Item的槽函数
  954. * 访问的表:
  955. * 修改的表:
  956. * 输入参数:
  957. * 输出参数:
  958. * 返 回 值:
  959. * 其它说明:
  960. * 修改日期    版本号     修改人        修改内容
  961. * -----------------------------------------------
  962. *
  963. **************************************************************************/
  964. void TetrixWidget::clickOnButton(int index)
  965. {
  966. switch( index )
  967. {
  968. case 0:
  969. clickOnStartgameButton() ;
  970. break ;
  971. case 1:
  972. clickOnInstrgameButton() ;
  973. break ;
  974. case 2:
  975. clickOnGameOptionButton() ;
  976. break ;
  977. case 3:
  978. clickOnGameHihgscButton() ;
  979. break ;
  980. case 4:
  981. clickOnExitgameButton() ;
  982. break ;
  983. default:
  984. break ;
  985. }
  986. }
  987. /*************************************************************************
  988. * 函数名称: backToSecondLaySlot
  989. * 功能描述: 用户按Esc键返回到第二层,返回游戏首页的信号的槽函数
  990. * 访问的表:
  991. * 修改的表:
  992. * 输入参数:
  993. * 输出参数:
  994. * 返 回 值:
  995. * 其它说明: 通过这个当前箭头所对应的序号的值
  996. *       比如说
  997. *       0---->开始游戏
  998. *       1---->游戏介绍
  999. *       。。。。。。
  1000. *       在NumAndPointerHash表中查找相应的Item的指针的值
  1001. * 修改日期    版本号     修改人        修改内容
  1002. * -----------------------------------------------
  1003. *
  1004. **************************************************************************/
  1005. void TetrixWidget::backToSecondLaySlot( int index )
  1006. {
  1007. void * item ;
  1008. /*
  1009. 如果当用户本来就在第二层游戏首页时,这个时候却按下Esc键,这个时候这个item为空。
  1010. 首先得判断hash表中有没这个key值
  1011. */
  1012. if( numPointer.contains( index ) )
  1013. {
  1014. item = numPointer.value( index ) ;
  1015. if( item )
  1016. {
  1017. //因为每个类型的指针的类型是不同的,所以这里得这样分开来写
  1018. switch( index )
  1019. {
  1020. case 0:
  1021. //在这里发送信号,先去删除动态珊瑚背景层之上的东西,也就是第四层与第五层的东西
  1022. //因为第四层与第五层都是作为动态珊瑚背景(第三层)的成员变量,所以在这里得在删除第三层前
  1023. //删掉第四层与第五层的东西
  1024. ((GameMovBackGrouItem *)item)->removeFourthAndFifthItemFun();
  1025. gameScene->removeItem( (GameMovBackGrouItem *)item );
  1026. delete ((GameMovBackGrouItem *)item);
  1027. //再次发送信号来还原之前改变的箭头Item的遮蔽状态
  1028. emit coverOnArowItemSignal( false );
  1029. break ;
  1030. case 1:
  1031. gameScene->removeItem( (GameIntroductionItem *)item );
  1032. delete (GameIntroductionItem *)item ;
  1033. //再次发送信号来还原之前改变的箭头Item的遮蔽状态
  1034. emit coverOnArowItemSignal( false );
  1035. break ;
  1036. case 2:
  1037. //使得四个按钮恢复显示
  1038. setSomeItemVisible( true ) ;
  1039. gameScene->removeItem( (GameOptionItem *)item );
  1040. delete (GameOptionItem *)item ;
  1041. //再次发送信号来还原之前改变的箭头Item的遮蔽状态
  1042. emit coverOnArowItemSignal( false );
  1043. break ;
  1044. case 3:
  1045. gameScene->removeItem( (GameHighWinItem *)item );
  1046. delete (GameHighWinItem *)item ;
  1047. //再次发送信号来还原之前改变的箭头Item的遮蔽状态
  1048. emit coverOnArowItemSignal( false );
  1049. break ;
  1050. case 4:
  1051. break ;
  1052. default:
  1053. DEBUGP( "index error !" ) ;
  1054. break ;
  1055. }
  1056. //清空现在的记录,以便下次再进行切换
  1057. nowIndex = -1 ;
  1058. numPointer.remove( index ) ;
  1059. }
  1060. }
  1061. }
  1062. /*************************************************************************
  1063. * 函数名称: backToGameHomeSlot
  1064. * 功能描述: 这个是前景Item的退回到游戏首页的按钮的槽函数
  1065. * 访问的表:
  1066. * 修改的表:
  1067. * 输入参数:
  1068. * 输出参数:
  1069. * 返 回 值:
  1070. * 其它说明:
  1071. * 修改日期    版本号     修改人        修改内容
  1072. * -----------------------------------------------
  1073. *
  1074. **************************************************************************/
  1075. void TetrixWidget::backToGameHomeSlot()
  1076. {
  1077. //因为这个时候是进入游戏之后才可以看到游戏的前景
  1078. backToSecondLaySlot( 0 ) ;
  1079. }
  1080. /*************************************************************************
  1081. * 函数名称: eventFilter
  1082. * 功能描述: 事件过滤器
  1083. * 访问的表:
  1084. * 修改的表:
  1085. * 输入参数:
  1086. * 输出参数:
  1087. * 返 回 值:
  1088. * 其它说明:这个是重载事件过滤器函数,通过这个函数判断,当鼠标移动到其他的软件的窗口时,
  1089. *         这个时候整个游戏软件被停用。在这个时候发送暂停游戏的消息
  1090. * 修改日期    版本号     修改人        修改内容
  1091. * -----------------------------------------------
  1092. *
  1093. **************************************************************************/
  1094. bool TetrixWidget::eventFilter(QObject *watched, QEvent *event)
  1095. {
  1096. if( watched == this )
  1097. {
  1098. //窗口停用,及一般人认为的失去焦点
  1099. if(QEvent::WindowDeactivate == event->type())
  1100. {
  1101. //
  1102. //DEBUGP( "eventFilter" ) ;
  1103. emit gameDeactivateSignal() ;
  1104. return true ;
  1105. }
  1106. else
  1107. {
  1108. return false ;
  1109. }
  1110. }
  1111. return false ;
  1112. }
  1113. void TetrixWidget::resizeEvent(QResizeEvent *event)
  1114. {
  1115. gameScene->setSceneRect(0, 0, gameView->width(), gameView->height());
  1116. }

三、总结

(1)上述代码是一个非常不错的项目例子,自己也在拜读代码(也有很多不懂的地方),并在实际工作中加以应用。
(2)上述代码已上传到****:http://download.****.net/detail/taiyang1987912/9480721
(3)若有问题或建议,请留言,在此感谢!

http://blog.****.net/taiyang1987912/article/details/51055817