qml自学笔记------自己写相似于劲舞团的按键小游戏(中)
接上篇《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等等级。经过一番折腾,诶... 毕竟是做工控的。没做过游戏,有点难度(这又让我想起了那丑陋的界面。诶... 感觉自己全然没有艺术细胞呀)。
于是我换了一种思路。当按键按下时。判决处于某坐标的项目的图片是否和按键事件是一样的。这样会简单非常多,于是就有了例如以下代码。
import QtQuick 1.1
Rectangle {
id: m_displayPart
property bool timerRunning: false
function startGame(){
var rand = Math.floor(5*Math.random()+1);
switch(rand){
case 1:
var componetImageUP = Qt.createComponent("ImageUp.qml");
componetImageUP.createObject(rowDisplay);
break;
case 2:
var componetImageDown = Qt.createComponent("ImageDown.qml");
componetImageDown.createObject(rowDisplay);
break;
case 3:
var componetImageLeft = Qt.createComponent("ImageLeft.qml");
componetImageLeft.createObject(rowDisplay);
break;
case 4:
var componetImageRight = Qt.createComponent("ImageRight.qml");
componetImageRight.createObject(rowDisplay);
break;
case 5:
var componetImageSpace = Qt.createComponent("ImageSpace.qml");
componetImageSpace.createObject(rowDisplay);
break;
default:
break;
}
//imageLoader.source = "ImageUp.qml"
if(++mainWindow.currentNum > 99) {
displayPart.timerRunning = false;
pauseButton.pauseText = "又一次開始";
pauseButton.stat = false;
}
}
function score(){
m_displayPart.color = "lightgreen";
mainWindow.currentScore++;
//console.log("score!");
}
function unScore(){
m_displayPart.color = "red";
//console.log("un score!");
}
width: 500
height: 200
color: "lightblue"
Rectangle {
id: rowDisplay
z: 1; width: 500;
anchors.verticalCenter: parent.verticalCenter
focus: true
Keys.onPressed: {
if(childAt(250,0)===null) {
unScore();
}
else if( (event.key===Qt.Key_Up)&&(childAt(250,0).getValue()===1) ) {
score();
}
else if( (event.key === Qt.Key_Down)&&(childAt(250,0).getValue()===2) ) {
score();
}
else if( (event.key === Qt.Key_Left)&&(childAt(250,0).getValue()===3) ) {
score();
}
else if( (event.key === Qt.Key_Right)&&(childAt(250,0).getValue()===4) )
score();
else if( (event.key === Qt.Key_Space)&&(childAt(250,0).getValue()===5) )
score();
else
unScore();
//event.accepted = true;
}
Keys.onReleased: {m_displayPart.color = "lightblue"}
}
Rectangle {
id: pjLine
width: 10; height: parent.height
z: 0
color: "pink"
anchors.horizontalCenter: parent.horizontalCenter
}
Timer {
id: timerDisplay
interval: 600
running: timerRunning
repeat: true
onTriggered: startGame();
}
}
动态创建的项目有五个。分别相应着五个按键:ImageUp.qml ImageDown.qml ImageLeft.qml ImageRight.qml ImageSpace.qml
五个文件非常类似,以ImageUp为例。使用source属性载入图片;使用states属性设置状态;使用transitions属性设置切换效果。
这个效果大概就是先创建。等创建完毕后从x=0的位置滑动到x=500的位置。历时duration:3000毫秒。滑动效果用easing.type: Easing.InOutQuad来设置。
import QtQuick 1.1
Image {
id: upimage
function getValue(){
return 1;
}
width: 60
height: 60
anchors.verticalCenter: parent.verticalCenter
source: "../img/up.png"
states: State {
name: "loaded"; when: upimage.status === Image.Ready
PropertyChanges { target: upimage; x: 500}
}
transitions: Transition {
NumberAnimation {
to: 500; from: 0
duration: 3000
properties: "x"; easing.type: Easing.InOutQuad
}
}
}
qml自学笔记------自己写相似于劲舞团的按键小游戏(中)的更多相关文章
- 用原生JS写一个网页版的2048小游戏(兼容移动端)
这个游戏JS部分全都是用原生JS代码写的,加有少量的CSS3动画,并简单的兼容了一下移动端. 先看一下在线的demo:https://yuan-yiming.github.io/2048-online ...
- 我用数据结构花了一夜给女朋友写了个h5走迷宫小游戏
目录 起因 分析 画线(棋盘) 画迷宫 方块移动 结语 @(文章目录) 先看效果图(在线电脑尝试地址http://biggsai.com/maze.html): 起因 又到深夜了,我按照以往在公众号写 ...
- 零基础自学Python十天,写了一款猜数字小游戏,附源码和软件下载链接!
自学一门语言最重要的是要及时给自己反馈,那么经常写一些小程序培养语感很重要,写完可以总结一下程序中运用到了哪些零散的知识点. 本程序中运用到的知识点有: 1.输入输出函数 (input.print) ...
- 零基础自学Python十天的时候,写的一款猜数字小游戏,附源码和软件下载链接!
自学一门语言最重要的是要及时给自己反馈,那么经常写一些小程序培养语感很重要,写完可以总结一下程序中运用到了哪些零散的知识点. 本程序中运用到的知识点有: 1.输入输出函数 (input.print) ...
- 用Python写个开心消消乐小游戏
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 提到开心消消乐这款小游戏,相信大家都不陌生,其曾在 2015 年获得过玩家最喜爱的移动单机游戏奖,受 ...
- 自学笔记系列:《Python学习手册 第五版》 -写在开始之前
今年双十一,在当当网上买了这本书,很厚很厚的一本书,大概有将近1700页左右,的确是一个“大工程”, 关于这本书的学习,我想采用一种博客的方式进行,既是写给自己,也想分享给每一个对Python学习感兴 ...
- JAVA自学笔记20
JAVA自学笔记20 1.递归: 1)方法定义中定义中调用方法本身的现象 2)要有出口,否则就是死递归 次数不能太多.否则内存将溢出 构造方法不能递归使用 //斐波那契数列:1,1,2,3,5,8,1 ...
- JS写小游戏(一):游戏框架
前言 前一阵发现一个不错的网站,都是一些用html5+css+js写的小游戏,于是打算学习一番,写下这个系列博客主要是为了加深理解,当然也有一些个人感悟,如果英文好可以直接Click Here. 概述 ...
- 《Linux内核设计与实现》课本第三章自学笔记——20135203齐岳
<Linux内核设计与实现>课本第三章自学笔记 进程管理 By20135203齐岳 进程 进程:处于执行期的程序.包括代码段和打开的文件.挂起的信号.内核内部数据.处理器状态一个或多个具有 ...
随机推荐
- Linux环境下通过ODBC访问MSSql Server
为了解决Linux系统连接MSSql Server的问题,微软为Linux系统提供了连接MSSql Server的ODBC官方驱动.通过官方驱动,Linux程序可以方便地对MSSql Server进行 ...
- PL/SQL 04 游标 cursor
--游标 declare cursor 游标名字 is 查询语句;begin 其他语句;end; --游标的属性%FOUND%NOTFOUND%ISOPEN%ROWCOUNT(当前游标的指针位 ...
- V-Hyper安装ubuntu-13.10-server-amd64
1.在windws8上的V_Hyper虚拟机上安装Ubuntu虚拟机服务器版.遇到的问题和解决方案 2.正确的在V-Hyper配置方法参考文章:在Hyper-V中安装和配置Ubuntu Server ...
- 无界面运行Jmeter压测脚本
今天在针对单一接口压测时出现了从未遇到的问题,设好并发量后用调度器控制脚本的开始和结束,但在脚本应该自动结束时间,脚本却停不下来,手动stop报告就会有error率,卡了我很久很久不能解决,网络上也基 ...
- 【SQL】全关系操作
1.消除重复 - DISTINCT SQL语句中默认的是,重复的元祖可以多次的显示.如果希望消除重复,需要DISTINCT关键字. 注:消除重复需要排序,所以代价高.在需要高效率时要谨慎. SELEC ...
- 错误: 在类 Main 中找不到 main 方法, 请将 main 方法定义为: public static void main(String[] args) 否则 JavaFX 应用程序类必须扩展javafx.application.Application
错误: 在类 Main 中找不到 main 方法, 请将 main 方法定义为: public static void main(String[] args)否则 JavaFX 应用程序类必须扩展ja ...
- TCP,UDP,IP包头格式及说明(zz)
一.MAC帧头定义 /数据帧定义,头14个字节,尾4个字节/ typedef struct _MAC_FRAME_HEADER { ]; //目的mac地址 ]; //源mac地址 short m_c ...
- foreach 与 Linq的 Select 效率问题
Resharper 是一个非常强大的C#编程辅助工具,有着非常强的提示功能,代码纠正,代码简化等等 在编码过程中注意到这么一件事,可能是大家经常会遇到的: 遍历某个集合,然后经过处理生成另外一个集合, ...
- HTTP.SYS
严格地说,HTTP.SYS已经不属于IIS 的范畴了,所以HTTP.SYS的配置信息也没有保存在IIS 的元数据库(Metabase) 中,而是定义在注册表中.HTTP.SYS 的注册表项的路径为HK ...
- 0103 最短Hamilton路径【状压DP】
0103 最短Hamilton路径 0x00「基本算法」例题 描述 给定一张 n(n≤20) 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 的最短Hamilton路径. Ham ...