提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
翻译|使用教程|编辑:鲍佳佳|2021-03-24 11:04:48.113|阅读 207 次
概述:现在我们已经拥有了所有游戏组件,可以添加游戏逻辑了,该逻辑规定玩家如何与积木互动以及如何玩游戏,直到赢或输。
# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>
相关链接:
Qt是一个跨平台框架,通常用作图形工具包,它不仅创建CLI应用程序中非常有用。而且它也可以在三种主要的台式机操作系统以及移动操作系统(如Symbian,Nokia Belle,Meego Harmattan,MeeGo或BB10)以及嵌入式设备,Android(Necessitas)和iOS的端口上运行。现在我们为你提供了免费的试用版。
Qt组件推荐:
通过前两章的讲解(创建游戏画布和块,填充游戏画布),现在我们已经拥有了所有游戏组件,可以添加游戏逻辑了,该逻辑规定玩家如何与积木互动以及如何玩游戏,直到赢或输。
为此,我们将以下功能添加到samegame.js:
由于这是关于QML的教程,而不是游戏设计的教程,因此我们将仅在下面进行讨论handleClick(),victoryCheck()因为它们直接与QML类型交互。请注意,尽管此处的游戏逻辑是用JavaScript编写的。
启用鼠标单击交互
为了更方便的JavaScript代码接口与QML类型,我们增加了叫做项目gameCanvas来samegame.qml。它将背景替换为包含块的项目。它还接受来自用户的鼠标输入。这是商品代码:
Item { id: gameCanvas property int score: 0 property int blockSize: 40 width: parent.width - (parent.width % blockSize) height: parent.height - (parent.height % blockSize) anchors.centerIn: parent MouseArea { anchors.fill: parent onClicked: SameGame.handleClick(mouse.x, mouse.y) } }
gameCanvas项是棋盘的精确尺寸,并有一个分数属性和一个MouseArea来处理鼠标点击。块现在被创建为它的子项目,它的尺寸被用来确定棋盘的大小,这样应用程序就可以根据可用的屏幕尺寸进行缩放。由于它的尺寸被绑定到blockSize的倍数上,blockSize被移出了samegame.js,作为一个QML属性移到了samegame.qml中。注意,它仍然可以从脚本中访问。
当点击时,MouseArea会调用samegame.js中的handleClick(),它决定玩家的点击是否会导致任何块被移除,如果需要的话,还会用当前的分数更新gameCanvas.score。这里是handleClick()函数。
function handleClick(xPos, yPos) { var column = Math.floor(xPos / gameCanvas.blockSize); var row = Math.floor(yPos / gameCanvas.blockSize); if (column >= maxColumn || column < 0 || row >= maxRow || row < 0) return; if (board[index(column, row)] == null) return; //If it's a valid block, remove it and all connected (does nothing if it's not connected) floodFill(column, row, -1); if (fillFound <= 0) return; gameCanvas.score += (fillFound - 1) * (fillFound - 1); shuffleDown(); victoryCheck(); }
请注意,如果score是samegame.js文件中的全局变量,则将无法绑定到该文件。您只能绑定到QML属性。
更新分数
当玩家单击一个块并触发时handleClick(),handleClick()还会调用victoryCheck()来更新比分并检查玩家是否已完成游戏。这是victoryCheck()代码:
function victoryCheck() { //Award bonus points if no blocks left var deservesBonus = true; for (var column = maxColumn - 1; column >= 0; column--) if (board[index(column, maxRow - 1)] != null) deservesBonus = false; if (deservesBonus) gameCanvas.score += 500; //Check whether game has finished if (deservesBonus || !(floodMoveCheck(0, maxRow - 1, -1))) dialog.show("Game Over. Your score is " + gameCanvas.score); }
gameCanvas.score如果游戏结束,则更新值并显示“ Game Over”对话框。
“游戏结束”对话框是使用Dialog中定义的类型创建的Dialog.qml。这是Dialog.qml代码。注意如何通过功能和信号从脚本文件中强制使用它:
import QtQuick 2.0 Rectangle { id: container function show(text) { dialogText.text = text; container.opacity = 1; } function hide() { container.opacity = 0; } width: dialogText.width + 20 height: dialogText.height + 20 opacity: 0 Text { id: dialogText anchors.centerIn: parent text: "" } MouseArea { anchors.fill: parent onClicked: hide(); } }
这就是它在主samegame.qml文件中的用法:
Dialog { id: dialog anchors.centerIn: parent z: 100 }
我们为对话框指定z值100,以确保将其显示在其他组件的顶部。项目的默认z值为0。
色彩冲刺
如果所有块都具有相同的颜色,玩“同一个游戏”并没有什么乐趣,因此我们修改了createBlock()函数,samegame.js以便每次调用时随机创建不同类型的块(用于红色,绿色或蓝色)。Block.qml还进行了更改,以便每个块包含一个不同的图像,具体取决于其类型:
import QtQuick 2.0 Item { id: block property int type: 0 Image { id: img anchors.fill: parent source: { if (type == 0) return "../shared/pics/redStone.png"; else if (type == 1) return "../shared/pics/blueStone.png"; else return "../shared/pics/greenStone.png"; } } }
工作游戏
现在我们有了一款可以正常运行的游戏!可以单击块,玩家可以得分,游戏可以结束(然后您可以开始一个新的)。这是到目前为止已完成的屏幕截图:
这是现在的samegame.qml样子:
import QtQuick 2.0 import "samegame.js" as SameGame Rectangle { id: screen width: 490; height: 720 SystemPalette { id: activePalette } Item { width: parent.width anchors { top: parent.top; bottom: toolBar.top } Image { id: background anchors.fill: parent source: "../shared/pics/background.jpg" fillMode: Image.PreserveAspectCrop } Item { id: gameCanvas property int score: 0 property int blockSize: 40 width: parent.width - (parent.width % blockSize) height: parent.height - (parent.height % blockSize) anchors.centerIn: parent MouseArea { anchors.fill: parent onClicked: SameGame.handleClick(mouse.x, mouse.y) } } } Dialog { id: dialog anchors.centerIn: parent z: 100 } Rectangle { id: toolBar width: parent.width; height: 30 color: activePalette.window anchors.bottom: screen.bottom Button { anchors { left: parent.left; verticalCenter: parent.verticalCenter } text: "New Game" onClicked: SameGame.startNewGame() } Text { id: score anchors { right: parent.right; verticalCenter: parent.verticalCenter } text: "Score: Who knows?" } } }
游戏有效,但现在有点无聊。平滑的动画过渡在哪里?高分在哪里?如果您是QML专家,则可以在第一次迭代中编写这些内容,但是在本教程中,我们将在下一章节中进行讲解----您的应用程序将在此活跃起来!
====================================================
想要了解或购买Qt正版授权的朋友,欢迎
Qt技术交流群现已开通,QQ搜索群号“765444821”或者扫描下方二维码即可加入
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@cahobeh.cn
文章转载自:本文探讨 SQL Server 中 NULL 和空值之间的区别,并讨论如何有效地处理它们。
Unity 是一款功能极其丰富的游戏引擎,允许开发人员将各种媒体集成到他们的项目中。但是,它缺少最令人兴奋的功能之一 - 将 Web 内容(例如 HTML、CSS 和 JavaScript)直接渲染到 3D 场景中的纹理上的能力。在本文中,我们将介绍如何使用 DotNetBrowser 在 Unity3D 中将 Web 内容渲染为纹理。
DevExpress v24.2帮助文档正式发布上线了,请按版本按需下载~
本教程将向您展示如何用MyEclipse构建一个Web项目,欢迎下载最新版IDE体验!
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@cahobeh.cn
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢