QML高级教程2 - 填充游戏画布
在JavaScript中生成方块
既然我们已经编写了一些类型,让我们开始编写游戏。
第一个任务是生成游戏方块。每次点击“新游戏”按钮时,游戏画布将填充一个全新的随机方块集合。由于我们需要为每次新游戏动态生成新的方块,因此不能使用重复器来定义方块。相反,我们将使用JavaScript来创建方块。
下面是生成方块的JavaScript代码,包含在一个新文件中,samegame.js。以下是代码说明。
var blockSize = 40;
var maxColumn = 10;
var maxRow = 15;
var maxIndex = maxColumn * maxRow;
var board = new Array(maxIndex);
var component;
//Index function used instead of a 2D array
function index(column, row) {
return column + (row * maxColumn);
}
function startNewGame() {
//Delete blocks from previous game
for (var i = 0; i < maxIndex; i++) {
if (board[i] != null)
board[i].destroy();
}
//Calculate board size
maxColumn = Math.floor(background.width / blockSize);
maxRow = Math.floor(background.height / blockSize);
maxIndex = maxRow * maxColumn;
//Initialize Board
board = new Array(maxIndex);
for (var column = 0; column < maxColumn; column++) {
for (var row = 0; row < maxRow; row++) {
board[index(column, row)] = null;
createBlock(column, row);
}
}
}
function createBlock(column, row) {
if (component == null)
component = Qt.createComponent("Block.qml");
// Note that if Block.qml was not a local file, component.status would be
// Loading and we should wait for the component's statusChanged() signal to
// know when the file is downloaded and ready before calling createObject().
if (component.status == Component.Ready) {
var dynamicObject = component.createObject(background);
if (dynamicObject == null) {
console.log("error creating block");
console.log(component.errorString());
return false;
}
dynamicObject.x = column * blockSize;
dynamicObject.y = row * blockSize;
dynamicObject.width = blockSize;
dynamicObject.height = blockSize;
board[index(column, row)] = dynamicObject;
} else {
console.log("error loading block component");
console.log(component.errorString());
return false;
}
return true;
}startNewGame()函数会删除上一轮游戏中创建的方块,并计算新游戏中需要填充游戏窗口的行数和列数。然后,它创建一个数组来存储所有游戏方块,并调用createBlock()来创建足够多的方块以填充游戏窗口。
createBlock()函数从Block.qml文件创建一个方块,并将其移动到游戏画布上的位置。这涉及几个步骤
- 调用 Qt.createComponent() 从
Block.qml生成类型。如果组件已准备好,我们可以调用 createObject() 来创建Block项的实例。 - 如果 createObject() 返回 null(即如果加载对象时出错),则打印错误信息。
- 将方块放置在棋盘上的位置并设置其宽度和高度。此外,将其存储在方块数组中以备将来参考。
- 最后,如果由于某种原因(例如,如果文件丢失)无法加载组件,则将错误信息打印到控制台。
将JavaScript组件连接到QML
现在我们需要从我们的QML文件中调用 samegame.js 中的JavaScript代码。为此,我们在samegame.qml中添加此行,将JavaScript文件作为模块导入
import "samegame.js" as SameGame
这允许我们使用 "SameGame" 作为前缀引用samegame.js中的任何函数:例如,SameGame.startNewGame() 或 SameGame.createBlock()。这意味着我们现在可以将“新游戏”按钮的onClicked处理器连接到startNewGame()函数,如下所示
Button { anchors { left: parent.left; verticalCenter: parent.verticalCenter } text: "New Game" onClicked: SameGame.startNewGame() }
因此,当您点击“新游戏”按钮时,会调用startNewGame()并生成一个方块场,如下所示

现在,我们有一个方块屏幕,我们可以开始添加游戏机制。
© 2024 Qt 公司。此处包含的文档贡献的版权属于其各自所有者。本提供的文档是根据自由软件基金会在其发布的 GNU 自由文档许可协议版本 1.3 的条款进行许可的。Qt 和相应商标是芬兰的 Qt 公司以及/或其他国家的商标。所有其他商标均属于其各自所有者。