QML上級者向けチュートリアル1 - ゲームキャンバスとブロックの作成
アプリケーション画面の作成
最初のステップは、アプリケーションの基本的なQML項目を作成することです。
まずは、このようなメイン画面を持つSame Gameアプリケーションを作成します:
これはメインアプリケーションのファイル、samegame.qml
で定義されます:
import QtQuick 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: "pics/background.jpg" fillMode: Image.PreserveAspectCrop } } 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: console.log("This doesn't do anything yet...") } Text { id: score anchors { right: parent.right; verticalCenter: parent.verticalCenter } text: "Score: Who knows?" } } }
これで、ブロックのメインキャンバス、「New Game」ボタン、得点表示を含む基本的なゲームウィンドウができました。
ここで見慣れないかもしれませんが、SystemPalette という項目があります。これは Qt のシステムパレットにアクセスするためのもので、ボタンをよりネイティブなルック&フィールにするために使用されます。
Item
,Button
,Text
タイプのアンカーは、見やすくするためにグループ(ドット)表記を使っています。
Button
とBlock
コンポーネントの追加
上のコードのButton
アイテムは、Button.qml
という別のコンポーネント・ファイルで定義されています。機能的なボタンを作成するために、Rectangle の中にText とMouseArea という QML タイプを使います。以下はButton.qml
のコードです:
import QtQuick Rectangle { id: container property string text: "Button" signal clicked width: buttonLabel.width + 20; height: buttonLabel.height + 5 border { width: 1; color: Qt.darker(activePalette.button) } antialiasing: true radius: 8 // color the button with a gradient gradient: Gradient { GradientStop { position: 0.0 color: { if (mouseArea.pressed) return activePalette.dark else return activePalette.light } } GradientStop { position: 1.0; color: activePalette.button } } MouseArea { id: mouseArea anchors.fill: parent onClicked: container.clicked(); } Text { id: buttonLabel anchors.centerIn: container color: activePalette.buttonText text: container.text } }
これは基本的に、テキストを含み、クリックできる矩形を定義します。MouseArea にはonClicked()
ハンドラがあり、クリックされたときにcontainer
のclicked()
シグナルを出すように実装されています。
Same Gameでは、ゲームが始まると画面は小さなブロックで埋め尽くされる。各ブロックは画像を含む単なるアイテムである。ブロックのコードは別のBlock.qml
:
import QtQuick Item { id: block Image { id: img anchors.fill: parent source: "pics/redStone.png" } }
現時点では、ブロックは何もせず、ただの画像です。チュートリアルが進むにつれて、ブロックにアニメーションをつけたり、ビヘイビアを与えたりしていきます。ブロックを作成するコードはまだ追加していません。
anchors.fill: parent
を使って、画像を親Itemのサイズに設定しています。これは、チュートリアルの後半でブロックアイテムを動的に作成してサイズを変更するときに、画像が自動的に正しいサイズに拡大縮小されることを意味します。
Image タイプのsource
プロパティの相対パスに注目してください。このパスは、Image タイプを含むファイルの場所からの相対パスです。別の方法として、Imageソースに絶対ファイルパスまたは画像を含むURLを設定することもできます。
ここまでのコードには慣れているはずです。まずは、基本的な型をいくつか作成しました。次に、ゲームキャンバスにブロックを配置します。
©2024 The Qt Company Ltd. 本書に含まれる文書の著作権は、それぞれの所有者に帰属します。 ここで提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。