接上篇《qml自学笔记------自己写类似于劲舞团的按键小游戏(上)

第三部分DisplayPart.qml

代码的其它部分都是渣,就这里花了点时间,整个小游戏就靠这个文件。

首先,屏幕上要随机的滑过空格或者箭头,每个图片就是一个项目,那么就要动态的创建项目。

动态创建项目方法有三种(我所知道的),第一种是通过JavaScript调用Qt.createComponent(),Qt.createQmlObject()来创建对象,这里要注意的是创建时必须传父对象,由于图形项目没有父对象是无法显示在场景上的;另外一种是使用反复器Repeater,可是Repeater元素是用来创建大量相似项目的;第三种是使用Loader元素载入组件创建对象,Loader元素能够使用source属性载入一个QML文件或者使用sourceComponent属性创建一个对象,可是假设source或者sourceComponent更改了,不论什么先前实例化的项目都会被销毁;在本游戏中source肯定要随机切换,所以不能选第三种,各个对象之间也是不一样的,所以我选了第一种方法使用JS调用来动态创建对象。

而且,使用JS来产生随机数也很easy。使用Math.random()调用就好。要是使用QML来产生随机数我还真不会

随机问题攻克了就使用Timer定时器,定时的动态创建项目。

interval属性设置时间间隔,单位毫秒;repeat属性设置是否反复触发;running属性设置定时器的开启关闭;onTriggered属性设置处理函数,等等。。。

然后就是最头疼的判决是否得分的问题了,一開始我想的实现方法是当项目到达某个坐标时開始计时,到走出计时结束,在计时的这段时间里看是否有跟项目图片一致的按键事件,并且依据时间距离中心时间的长短来判决得分是perfect、good或者OK等等级。经过一番折腾,诶... 毕竟是做工控的。没做过游戏,有点难度(这又让我想起了那丑陋的界面。诶...  感觉自己全然没有艺术细胞呀)。

于是我换了一种思路。当按键按下时。判决处于某坐标的项目的图片是否和按键事件是一样的。这样会简单非常多,于是就有了例如以下代码。

  1. import QtQuick 1.1
  2.  
  3. Rectangle {
  4. id: m_displayPart
  5.  
  6. property bool timerRunning: false
  7.  
  8. function startGame(){
  9. var rand = Math.floor(5*Math.random()+1);
  10. switch(rand){
  11. case 1:
  12. var componetImageUP = Qt.createComponent("ImageUp.qml");
  13. componetImageUP.createObject(rowDisplay);
  14. break;
  15. case 2:
  16. var componetImageDown = Qt.createComponent("ImageDown.qml");
  17. componetImageDown.createObject(rowDisplay);
  18. break;
  19. case 3:
  20. var componetImageLeft = Qt.createComponent("ImageLeft.qml");
  21. componetImageLeft.createObject(rowDisplay);
  22. break;
  23. case 4:
  24. var componetImageRight = Qt.createComponent("ImageRight.qml");
  25. componetImageRight.createObject(rowDisplay);
  26. break;
  27. case 5:
  28. var componetImageSpace = Qt.createComponent("ImageSpace.qml");
  29. componetImageSpace.createObject(rowDisplay);
  30. break;
  31. default:
  32. break;
  33. }
  34.  
  35. //imageLoader.source = "ImageUp.qml"
  36. if(++mainWindow.currentNum > 99) {
  37. displayPart.timerRunning = false;
  38. pauseButton.pauseText = "又一次開始";
  39. pauseButton.stat = false;
  40. }
  41. }
  42.  
  43. function score(){
  44. m_displayPart.color = "lightgreen";
  45. mainWindow.currentScore++;
  46. //console.log("score!");
  47. }
  48.  
  49. function unScore(){
  50. m_displayPart.color = "red";
  51. //console.log("un score!");
  52. }
  53.  
  54. width: 500
  55. height: 200
  56. color: "lightblue"
  57.  
  58. Rectangle {
  59. id: rowDisplay
  60.  
  61. z: 1; width: 500;
  62. anchors.verticalCenter: parent.verticalCenter
  63. focus: true
  64.  
  65. Keys.onPressed: {
  66. if(childAt(250,0)===null) {
  67. unScore();
  68. }
  69. else if( (event.key===Qt.Key_Up)&&(childAt(250,0).getValue()===1) ) {
  70. score();
  71. }
  72. else if( (event.key === Qt.Key_Down)&&(childAt(250,0).getValue()===2) ) {
  73. score();
  74. }
  75. else if( (event.key === Qt.Key_Left)&&(childAt(250,0).getValue()===3) ) {
  76. score();
  77. }
  78. else if( (event.key === Qt.Key_Right)&&(childAt(250,0).getValue()===4) )
  79. score();
  80. else if( (event.key === Qt.Key_Space)&&(childAt(250,0).getValue()===5) )
  81. score();
  82. else
  83. unScore();
  84.  
  85. //event.accepted = true;
  86. }
  87.  
  88. Keys.onReleased: {m_displayPart.color = "lightblue"}
  89.  
  90. }
  91.  
  92. Rectangle {
  93. id: pjLine
  94.  
  95. width: 10; height: parent.height
  96. z: 0
  97. color: "pink"
  98. anchors.horizontalCenter: parent.horizontalCenter
  99.  
  100. }
  101.  
  102. Timer {
  103. id: timerDisplay
  104.  
  105. interval: 600
  106. running: timerRunning
  107. repeat: true
  108. onTriggered: startGame();
  109.  
  110. }
  111.  
  112. }

动态创建的项目有五个。分别相应着五个按键:ImageUp.qml   ImageDown.qml  ImageLeft.qml  ImageRight.qml  ImageSpace.qml

五个文件非常类似,以ImageUp为例。使用source属性载入图片;使用states属性设置状态;使用transitions属性设置切换效果。

这个效果大概就是先创建。等创建完毕后从x=0的位置滑动到x=500的位置。历时duration:3000毫秒。滑动效果用easing.type: Easing.InOutQuad来设置。

  1. import QtQuick 1.1
  2.  
  3. Image {
  4. id: upimage
  5.  
  6. function getValue(){
  7. return 1;
  8. }
  9.  
  10. width: 60
  11. height: 60
  12. anchors.verticalCenter: parent.verticalCenter
  13.  
  14. source: "../img/up.png"
  15.  
  16. states: State {
  17. name: "loaded"; when: upimage.status === Image.Ready
  18. PropertyChanges { target: upimage; x: 500}
  19. }
  20.  
  21. transitions: Transition {
  22. NumberAnimation {
  23. to: 500; from: 0
  24. duration: 3000
  25. properties: "x"; easing.type: Easing.InOutQuad
  26. }
  27. }
  28.  
  29. }

qml自学笔记------自己写相似于劲舞团的按键小游戏(中)的更多相关文章

  1. 用原生JS写一个网页版的2048小游戏(兼容移动端)

    这个游戏JS部分全都是用原生JS代码写的,加有少量的CSS3动画,并简单的兼容了一下移动端. 先看一下在线的demo:https://yuan-yiming.github.io/2048-online ...

  2. 我用数据结构花了一夜给女朋友写了个h5走迷宫小游戏

    目录 起因 分析 画线(棋盘) 画迷宫 方块移动 结语 @(文章目录) 先看效果图(在线电脑尝试地址http://biggsai.com/maze.html): 起因 又到深夜了,我按照以往在公众号写 ...

  3. 零基础自学Python十天,写了一款猜数字小游戏,附源码和软件下载链接!

    自学一门语言最重要的是要及时给自己反馈,那么经常写一些小程序培养语感很重要,写完可以总结一下程序中运用到了哪些零散的知识点. 本程序中运用到的知识点有: 1.输入输出函数 (input.print) ...

  4. 零基础自学Python十天的时候,写的一款猜数字小游戏,附源码和软件下载链接!

    自学一门语言最重要的是要及时给自己反馈,那么经常写一些小程序培养语感很重要,写完可以总结一下程序中运用到了哪些零散的知识点. 本程序中运用到的知识点有: 1.输入输出函数 (input.print) ...

  5. 用Python写个开心消消乐小游戏

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 提到开心消消乐这款小游戏,相信大家都不陌生,其曾在 2015 年获得过玩家最喜爱的移动单机游戏奖,受 ...

  6. 自学笔记系列:《Python学习手册 第五版》 -写在开始之前

    今年双十一,在当当网上买了这本书,很厚很厚的一本书,大概有将近1700页左右,的确是一个“大工程”, 关于这本书的学习,我想采用一种博客的方式进行,既是写给自己,也想分享给每一个对Python学习感兴 ...

  7. JAVA自学笔记20

    JAVA自学笔记20 1.递归: 1)方法定义中定义中调用方法本身的现象 2)要有出口,否则就是死递归 次数不能太多.否则内存将溢出 构造方法不能递归使用 //斐波那契数列:1,1,2,3,5,8,1 ...

  8. JS写小游戏(一):游戏框架

    前言 前一阵发现一个不错的网站,都是一些用html5+css+js写的小游戏,于是打算学习一番,写下这个系列博客主要是为了加深理解,当然也有一些个人感悟,如果英文好可以直接Click Here. 概述 ...

  9. 《Linux内核设计与实现》课本第三章自学笔记——20135203齐岳

    <Linux内核设计与实现>课本第三章自学笔记 进程管理 By20135203齐岳 进程 进程:处于执行期的程序.包括代码段和打开的文件.挂起的信号.内核内部数据.处理器状态一个或多个具有 ...

随机推荐

  1. 使用Github官方提供的gitignore过滤Git提交的文件

    https://github.com/github/gitignore 在Gitignore项目主页找到VisualStudio.gitignore 下载后放到自己项目根目录的.vs文件夹提交就可以在 ...

  2. 全面理解面向对象的 JavaScript(转载)

    http://www.ibm.com/developerworks/cn/web/1304_zengyz_jsoo/#resources 前言 当今 JavaScript 大行其道,各种应用对其依赖日 ...

  3. [NOIP 2015] 斗地主 landlord

    想起几个月之前的 noip2015-只会瞎搞-这道题骗了 30 分.T T 题目 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的 A 到 K 加上大小王的共 54 张牌 ...

  4. Delphi字符串、PChar与字符数组之间的转换

    来自:http://my.oschina.net/kavensu/blog/193719 ------------------------------------------------------- ...

  5. eclipse怎么关闭spring dashboard

    进入help-install new software-what is already installed?-卸载spring board

  6. CURL命令的使用

    原文地址:http://blog.sina.com.cn/s/blog_4b9eab320100slyw.html 可以看作命令行浏览器 1.开启gzip请求curl -I http://www.si ...

  7. CSU 1337 搞笑版费马大定理【优化枚举】

    费马大定理:当n>2时,不定方程an+bn=cn没有正整数解.比如a3+b3=c3没有正整数解.为了活跃气氛,我们不妨来个搞笑版:把方程改成a3+b3=c3,这样就有解了,比如a=4, b=9, ...

  8. Diamond Collector (动态规划)

    问题 I: Diamond Collector 时间限制: 1 Sec  内存限制: 64 MB提交: 22  解决: 7[提交][状态][讨论版] 题目描述 Bessie the cow, alwa ...

  9. Don't Be a Subsequence

    问题 F: Don't Be a Subsequence 时间限制: 1 Sec  内存限制: 128 MB提交: 33  解决: 2[提交] [状态] [讨论版] [命题人:] 题目描述 A sub ...

  10. Scrum 实施中遇到的典型问题

    Scrum实施过程中遇到的典型问题,答案综合了网络中的借鉴和自己实践中的体会. Q1:技术负债在敏捷团队中会快速的膨胀. A1:由于敏捷开发过程没有充足的事前(up-front)设计,技术负债是不可避 ...