C
Qt Quick Ultralite sprite_animations の例
スプライトアニメーションの作成方法を示します。
概要
sprite_animations のサンプルでは、画像ファイル内のフレームシーケンスからスプライトアニメーションを作成する方法を示しています。
![]()
この例の画像ソースは16フレームで構成されており、各フレームのサイズは180x160です。

対象プラットフォーム
- MCIMX93-EVK
- MIMXRT1050
- MIMXRT1060
- MIMXRT1064
- MIMXRT1170
- STM32F769I
- STM32H750B
- RH850 D1M1A
- Infineon TRAVEO T2G
画像フォーマット
Qt Quick Ultralite を使用すると、デフォルトの代わりにハードウェア画像デコーダを使用できます。AnimatedSprite およびAnimatedSpriteDirectory の両方の QML タイプは、スプライトアニメーション用に登録された画像フォーマットをサポートしています。
この例では、STM32F769i、STM32H750b、RH850/D1M1A 評価ボード、およびInfineon TRAVEO T2G CYT4DNボードにおける画像デコーダのユースケースを示しています。 これらのボードでは、本プロジェクトはJPEGデコーダを設定し、ImageFilesノード内のJPEGファイルの生画像データを使用します。画像デコーダを使用することで、実行時に画像データをデコードしてレンダリングすることが可能になります。詳細については、「Qt Quick Ultralite 」のimagedecoderサンプルおよび「JPEGデコーダの使用方法 」を参照してください。
注: グラフィックスドライバの制限により 、現在、ソースJPEG画像でサポートされているサブサンプリングモードはYUV420のみです。 詳細については、『JPEGデコードドライバ TRAVEO T2G クラスタシリーズ ユーザーマニュアル』の「サンプルアプリケーション ユーザーガイド」を参照してください。ソース画像をYUV420サブサンプリング形式に変換するには、ImageMagickのConvertツールを使用できます:convert input.jpg -sampling-factor 4:2:0 output.jpg 。
注: Infineon TRAVEO T2G CYT4DNの場合 、必須の CMake 変数TVII_JPEG_DRIVER_DIR を設定してください。この変数は、JPEG デコードドライバ SDK のルートフォルダを指すように設定する必要があります。
RH850プラットフォームでは、JPEGドライバを構成するために以下のコンパイル定義を追加してください:
USE_OUTPUT_SPLIT_MODERenesas のJCUAハードウェアを、デコードがチャンク単位で行われるディビジョンモードに設定します。画像全体を一度にデコードする通常モードを使用する場合は、この定義を省略できます。
DECODE_BUFFER_PIXEL_LINESUSE_OUTPUT_SPLIT_MODEが有効になっている場合、DECODE_BUFFER_PIXEL_LINESは、1回の反復処理で処理される出力バッファのピクセル行数を設定します。この値は16の倍数でなければなりません。DECODE_BUFFER_PIXEL_LINESのデフォルト値は16です。CHROMA_SUBSAMPLING使用中の画像のクロマサブサンプリング形式を設定します。設定可能な値は以下の通りです:
R_JCUA_JPEG_FORMAT_YCBCR420R_JCUA_JPEG_FORMAT_YCBCR411R_JCUA_JPEG_FORMAT_YCBCR422R_JCUA_JPEG_FORMAT_YCBCR444
CHROMA_SUBSAMPLINGのデフォルト値は R_JCUA_JPEG_FORMAT_YCBCR420 です。注:現在 、色差サブサンプリングは実行時に決定できず、コンパイル時に指定する必要があります。アプリケーションで使用されるすべてのJPEG画像は、同じ色差サブサンプリングで保存されている必要があります。
その他のボードおよびプラットフォームについては、本プロジェクトではPNG画像ファイルを使用し、Resource Compilerによってビルド時に画像をデコードします。
プロジェクト構造
CMakeプロジェクトファイル
以下の CMake の例は、JPEG デコーダを使用しないプラットフォームで画像をデコードする方法を示しています:
qul_add_target(sprite_animations
QML_PROJECT mcu_sprite_animations.qmlproject
GENERATE_ENTRYPOINT
)以下の QmlProject の例は、必要な画像リソースのプロパティとプラットフォーム設定を用いて JPEG デコーダを構成する方法を示しています:
qul_add_target(sprite_animations
QML_PROJECT mcu_sprite_animations_jpeg.qmlproject
os/${QUL_OS_LOWERCASE}/main.cpp
)QmlProjectファイル
QmlProjectファイルには、必要なQmlファイルとImageファイルが含まれています。
// Copyright (C) 2026 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial
import QmlProject 1.3
Project {
mainFile: "sprite_animations.qml"
QmlFiles {
files: [
"ToggleButton.qml"
]
}
ImageFiles {
files: [
"qt-image-sequence.png"
]
MCU.resourceAnimatedSpriteFrameWidth: 180
MCU.resourceAnimatedSpriteFrameHeight: 160
}
}QmlProject では、ImageFiles.MCU.resourceAnimatedSpriteFrameWidth、ImageFiles.MCU.resourceAnimatedSpriteFrameHeight、およびImageFiles.MCU.resourceAnimatedSpriteOptimizationsを提供しており、これらを使用して画像ソースを最適化できます。
Resource Compilerは、内部で画像ソースを 16 フレームに分割し、クロッピング技術を用いて最適化を行い、パフォーマンスの向上とメモリ使用量の削減を図ります。これにより、一連のフレーム間で変更された部分のみをレンダリングすることが可能になります。
アプリケーション UI
sprite_animations.qml ファイルは、AnimatedSprite 型を定義します。これには、1フレームのサイズ、画像内のフレーム数、および画像のソースが定義されています。アニメーションはデフォルトで開始されます。ユーザーが画像をクリックすると、現在のrunning の値に基づいて、アニメーションの実行または停止が行われます。
AnimatedSprite {
id: sprite
anchors.centerIn: parent
source: "qt-image-sequence.png"
frameDuration: 80
frameCount: 16
frameWidth: 180
frameHeight: 160
loops: AnimatedSprite.Infinite
onFinished: {
txtMsg.text = "Finished"
}
onRunningChanged: {
if (sprite.running) {
txtMsg.text = ""
}
}
MouseArea {
anchors.fill: parent
onClicked: {
if (sprite.running) {
sprite.stop()
} else {
sprite.start()
}
}
}
}UIの左上隅には、アニメーションの各フレームの番号と、現在のフレームの再生時間(ミリ秒単位)が表示されます。
Column {
id: spriteInfo
anchors.top: parent.top
anchors.left: parent.left
anchors.margins: 16
spacing: 4
Text {
id: txtFrameNo
text: "frame: " + (sprite.currentFrame + 1) + " / " + sprite.frameCount
font.pixelSize: 14
color: "white"
}
Text {
id: txtDuration
text: "duration: " + sprite.frameDuration
font.pixelSize: 14
color: "white"
}
Text {
id: txtMsg
font.pixelSize: 14
text: ""
color: "white"
}
}アプリケーションの右上隅には、loops プロパティの値をAnimatedSprite.Infiniteと1の間で切り替えるボタンがあります。
ToggleButton {
id: toggleLoops
width: parent.width / 4
height: parent.height / 9
anchors.right: parent.right
anchors.top: parent.top
anchors.margins: 8
checkedText: "Infinite"
uncheckedText: "Once"
onCheckedChanged: {
if (toggleLoops.checked) {
sprite.loops = AnimatedSprite.Infinite
} else {
sprite.loops = 1
}
}
}ToggleButtonは、Rectangle 、MouseArea 、Text 、Row などのシンプルなQMLビジュアルタイプを使用したカスタムコンポーネントです。
import QtQuick 2.15
Rectangle {
id: control
color: "white"
property bool checked: true
readonly property color foregroundColor: "black"
readonly property int borderWidth: 1
readonly property alias checkedText: txtChecked.text
readonly property alias uncheckedText: txtUnchecked.text
Row {
x: control.borderWidth
y: control.borderWidth
spacing: control.borderWidth
Rectangle {
id: leftPart
width: (control.width - control.borderWidth * 3) / 2
height: (control.height - control.borderWidth * 2)
color: control.checked? control.color : control.foregroundColor
Text {
id: txtChecked
anchors.centerIn: parent
color: control.checked? control.foregroundColor : control.color
font.pixelSize: 14
}
}
Rectangle {
id: rightPart
width: leftPart.width
height: leftPart.height
color: control.checked? control.foregroundColor : control.color
Text {
id: txtUnchecked
anchors.centerIn: parent
color: control.checked? control.color : control.foregroundColor
font.pixelSize: 14
}
}
}
MouseArea {
anchors.fill: parent
onClicked: control.checked = !control.checked
}
}JPEG デコーダの使用
JPEGデコーダを使用するプラットフォームでは、QmlProjectのプロパティであるMCU.resourceKeepRawDataを使用して、JPEGファイルを生の画像データとしてバンドルできます。また、MCU.Config.maxResourceCacheSizeを定義することで、実行時にデコードされた画像データを格納するための十分なスペースを確保することもできます。
// Copyright (C) 2026 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial
import QmlProject 1.3
Project {
MCU.Config {
// enough size to contain one decoded image
maxResourceCacheSize: 153600
}
QmlFiles {
files: [
"ToggleButton.qml",
"sprite_animations_jpeg.qml"
]
}
ImageFiles {
files: [
"qt-image-sequence/00.jpg",
"qt-image-sequence/01.jpg",
"qt-image-sequence/02.jpg",
"qt-image-sequence/03.jpg",
"qt-image-sequence/04.jpg",
"qt-image-sequence/05.jpg",
"qt-image-sequence/06.jpg",
"qt-image-sequence/07.jpg",
"qt-image-sequence/08.jpg",
"qt-image-sequence/09.jpg",
"qt-image-sequence/10.jpg",
"qt-image-sequence/11.jpg",
"qt-image-sequence/12.jpg",
"qt-image-sequence/13.jpg",
"qt-image-sequence/14.jpg",
"qt-image-sequence/15.jpg"
]
MCU.resourceAnimatedSprite: true
MCU.resourceKeepRawData: true
}
}この例では、AnimatedSpriteDirectory を使用した一連のフレーム画像を用いて、ハードウェアデコードの利点を強調しています。これにより、スプライトアニメーションのメモリ使用量とCPU負荷が軽減されます。
AnimatedSpriteDirectory {
id: sprite
anchors.centerIn: parent
sourcePath: "qt-image-sequence"
frameDuration: 80
loops: AnimatedSprite.Infinite
readonly property int frameCount: 16
...ファイル:
- sprite_animations/CMakeLists.txt
- sprite_animations/ToggleButton.qml
- sprite_animations/mcu_sprite_animations.qmlproject
- sprite_animations/mcu_sprite_animations_jpeg.qmlproject
- sprite_animations/mcu_sprite_animations_t2g.qmlproject
- sprite_animations/os/baremetal/main.cpp
- sprite_animations/sprite_animations.qml
- sprite_animations/sprite_animations_jpeg.qml
画像:
- sprite_animations/qt-image-sequence.png
- sprite_animations/qt-image-sequence/00.jpg
- sprite_animations/qt-image-sequence/01.jpg
- sprite_animations/qt-image-sequence/02.jpg
- sprite_animations/qt-image-sequence/03.jpg
- sprite_animations/qt-image-sequence/04.jpg
- sprite_animations/qt-image-sequence/05.jpg
- sprite_animations/qt-image-sequence/06.jpg
- sprite_animations/qt-image-sequence/07.jpg
- sprite_animations/qt-image-sequence/08.jpg
- sprite_animations/qt-image-sequence/09.jpg
- sprite_animations/qt-image-sequence/10.jpg
- sprite_animations/qt-image-sequence/11.jpg
- sprite_animations/qt-image-sequence/12.jpg
- sprite_animations/qt-image-sequence/13.jpg
- sprite_animations/qt-image-sequence/14.jpg
- sprite_animations/qt-image-sequence/15.jpg
「リソースの管理」も参照してください 。
特定のQtライセンスの下で利用可能です。
詳細はこちらをご覧ください。