Qt移动应用开发(三):使用精灵图片实现帧动画

Qt移动应用开发(三):使用精灵图片实现帧动画

上一篇博文讲到了Qt Quick对于动画的一般支持,动画的形式多样,配合不同的插值函数,可以几乎实现所有想要的动画效果,而对于游戏的一些特殊的效果比如说帧动画,Qt更是有专门的类来实现。下面我们就来看看Qt Quick中究竟是对帧动画是如何实现的吧。

原创文章,反对未声明的引用。原博客地址:http://blog.csdn.net/gamesdev/article/details/33743527

一般2D的游戏引擎都将帧动画作为一项非常重要的功能特性加以宣传,比如说cocos2d-x也有很强大的帧动画效果,事实上,一个良好的设计可以让帧动画有无限的变种形式,从而给设计人员无限的灵感空间。Qt Quick的帧动画做得很完善,不仅可以单独渲染成动画的形式,而且可以和粒子系统相搭配,获得更炫的例子效果。

事实上帧动画为了节省显存的空间,一般会采用一张大图的形式来保存一个角色的所帧信息,下面两个例子就是帧动画图片:

帧动画的实现通常需要状态机系统的辅助。因为除了解析这张大图的任务外,为角色的每个动作赋予相应的状态也是帧动画的重要任务。所以一款游戏会将角色的某个动作的不同帧作为一组来分类播放,最后形成角色的行为动作。这是Qt自带的例子bear whack的截图:

下面我就使用一个实例来向大家介绍一下Qt如何使用Sprite和SpriteSequence来实现帧动画的。

import QtQuick 2.2
import QtQuick.Controls 1.1

ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: qsTr("Sprite测试")

    menuBar: MenuBar {
        Menu {
            title: qsTr("文件")
            MenuItem {
                text: qsTr("退出")
                onTriggered: Qt.quit( );
            }
        }
    }

    SpriteSequence
    {
        id: spriteSequence
        anchors.centerIn: parent
        width: 256
        height: 256
        interpolate: false
        running: true
        sprites:
        [
            Sprite
            {
                name: "floating"
                source: "Bear1.png"
                frameCount: 9
                frameWidth: 256
                frameHeight: 256
                frameDuration: 80
            }
        ]
    }

    Text
    {
        anchors.top: spriteSequence.bottom
        anchors.horizontalCenter: spriteSequence.horizontalCenter
        text: qsTr("本例用来测试Sprite的使用情况。")
    }
}

我们直接将Qt例子中的小熊帧动画拿过来了。下面是程序的截图:

SpriteSequence类的作用是为帧动画提供一个显示的容器,并且控制Sprite的运行情况。而Sprite呢,则类似于一个动作组,它可以指定角色的动作由哪些帧组成。上面的例子是通过使用frameCount、frameWidth、frameHeight和frameDuration来达到目的。Sprite的容器可以不是SpriteSequence,比如说将帧动画应用在粒子系统上就需要ImageParticle作为Sprite的容器了,比如说Qt自带的例子bear whack就使用了类似的手法。

除了上面的方法外,还有一种将SpriteSequence和Sprite结合起来的更加简单的方法来指定动画,那就是AnimateSprite。还是上面的例子,我们这样改写:

AnimatedSprite
{
    id: animatedSprite
    anchors.centerIn: parent
    width: 256
    height: 256
    frameCount: 9
    frameWidth: 256
    frameHeight: 256
frameDuration: 80
interpolate: false
    source: "Bear1.png"
}

效果和上面一样,而且语法更加简单。其实正是Qt去掉了自定义transition(过渡)的效果而推出的一个简单类,非常适合只有单个动作的角色。大多数情况下我们使用它就足够了。

在我制作的游戏《吃药了》中,我也受益于AnimatedSprite类,其实在时间紧迫的情况下,我只绘制出了两帧:

于是在AnimatedSprite的帮助下,实现细菌的帧动画就变得非常简单:


// 细菌
import QtQuick 2.2
import "GameController.js" as Controller

Block
{
    id: bacterium
    type: Controller.TYPE_BACTERIUM
    property alias source: sprite.source

    AnimatedSprite
    {
        id: sprite
        width: parent.width
        height: parent.height

        frameWidth: 128
        frameHeight: 128
        frameCount: 2
        frameRate: 2
        running: true
    }

    function setSource( color )
    {
        var imageResources = ["bacterium-red.png",
                              "bacterium-yellow.png",
                              "bacterium-blue.png"];
        source = "../../images/" + imageResources[color];
    }

    function setInvisible( )
    {
        sprite.visible = false;
    }
}

本文参加了CSDN博文大赛,请大家支持我,为我投一票!

Qt移动应用开发(三):使用精灵图片实现帧动画

时间: 2024-10-30 15:57:04

Qt移动应用开发(三):使用精灵图片实现帧动画的相关文章

图片抖动(帧动画)

1.帧动画介绍:         CAKeyframeAnimation它可以在多个值之间进行动画.         设置多值之间的属性为:         后面是一个数组,就是要设置的多个值.         anim.values = @[];                  它还可以根据一个路径做动画.         anim.path = 自己创建的路径.          2.图片抖动思路:         其实就是做一个左右旋转的动画.先让它往左边旋转-5,再往右边旋转5度,再从

将gif图片解析为cocos2d-x帧动画

因为游戏项目需要能够直接播放gif格式的图片,但是cocos2d-x本身并没有提供这方面的功能.在网上查阅发现已经有人给出了一种实现,但是并不能够完全满足我的需求.而且存在一些问题,如不能跨平台,频繁加载时导致内存用尽.后来参考其源码作出了一些修改,使gif图片转换为帧动画方便我使用. 现在已经优化了内存分配问题并且支持跨平台了,支持cocos2d-x3.0以上版本. 下面是使用例子: // 动画定义 GifAnimationDef def; def.loops = -1; // 循环次数 de

Qt计算器开发(三):运行效果及项目总结

运行效果 工程目录 Counter |--- Counter.pro |--- 头文件 |      |--- aboutdialog.h |      `--- mainwindow.h |--- 源文件 |      |--- aboutdialog.cpp |      |--- main.cpp |      `--- mainwindow.cpp `--- UI文件 |--- aboutdialog.ui `--- mainwindow.ui 总结 项目 这个工程的Ui部分我是直接使用

QT开发(二十九)——QT常用类(三)

QT开发(二十九)--QT常用类(三) 一.QImage 1.QImage简介 QT中提供了四个处理图像数据的类:QImage.QPixmap.QBitmap.QPicture. QImage提供了允许直接访问像素数据的硬件无关的图像显示方案,能够用作绘图设备. QImage专门为I/O.直接像素访问操作而设计,并进行了优化.访问图片的像素或是修改图片像素,则需要使用QImage,或者借助于QPainter来操作像素. 由于QImage继承自QPaintDevice,QPainter可以直接在Q

【Qt编程】基于Qt的词典开发系列<三>--开始菜单的设计

这篇文章讲讲如何实现开始菜单(或者称为主菜单)的设计.什么是开始菜单呢?我们拿常用的软件来用图例说明,大多数软件的开始菜单在左下角,如下图: 1.window 7的开始菜单 2.有道词典的主菜单 3.QQ的开始菜单 4.我写的词典软件的开始菜单 当你左键单击开始菜单时,就会弹出相应的菜单选项,然后你就可以进行相关操作.本文只讲如何实现点击按钮,弹出菜单功能,至于点击菜单后的事件需要你自己编写.当然,关于右击按钮出现菜单的方法,则是要重写qt自带的函数,至于具体操作可以百度. 要想使按钮实现左键单

【Qt编程】基于Qt的词典开发系列<三>--界面美化设计

本文讲一讲界面设计,作品要面向用户,界面设计的好坏直接影响到用户的体验.现在的窗口设计基本都是扁平化的,你可以从window  XP与window 8的窗口可以明显感觉出来.当然除了窗口本身的效果,窗口中各种控件的特效也是特别重要的一环.下面讲讲我在词典软件中的一些设计:说到界面美化的设计,不得不提到美工,一个好的美工是想当的重要!软件毕竟少不了图标,而不懂美工的我,也就只能在网上使用别人的图标了. 如何得到网上的图标? 直接百度就可以了,当然还有另一种方法:就是从别人的文件中提取这些图标文件.

(三)Sass和Compass--制作精灵图片

6.1 精灵的工作原理 // 将各种图片合并到一张图片里面,并在不同的状态下改变背景图片的位置; 6.2 精灵的重要性 // 压缩图片的内存; // 减少HTTP请求 6.2.3 Compass处理精灵方案 // 1.让Compass指向一个精灵的文件夹; // 2.告诉Compass撰写精灵CSS; // 3.编译样式表; 6.3 用Compass制作精灵 6.3.1 创建一个精灵地图 1 @import "compass/utilities/sprites"; // 精灵图片控件;

Qt移动应用开发(七):QML与Java的交互

上一篇文章讲到了如何实现QML和C++的交互,QML和C++的交互方法有很多,它们分别为使用上下文变量.注册QML类以及注册QML单例.那么这一次我们要了解如何使QML和Java进行交互.这里主要讲的是在Android系统下的实现,不适用于桌面平台J2SE的JVM. 原创文章,反对未声明的引用.原博客地址:http://blog.csdn.net/gamesdev/article/details/37997555 Qt5中针对不同的平台适配并开发了不同的模块,比如说Qt Windows Extr

Qt Quick应用开发介绍 1-5

Qt Quick应用开发介绍 Introduction to Application Development with Qt Quick Release 1.0 Chapter1 Introduction 介绍 1.1 谁应该阅读这份教程 本教程解释了Qt Quick应用开发的基础以及使用示例代码帮助全面了解; 教程包含标准Qt Quick文档和基础概念, API以及详细的源码信息; 本教程是为了新接触Qt Quick的你准备的, 虽然从基础开始, 但你还是要熟悉编程的概念, 有JavaScri