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的帮助下,实现细菌的帧动画就变得很easy:


// 细菌
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;
}
}

articleid=33743527">本文參加了CSDN博文大赛。请大家支持我。为我投一票!

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

  1. Android开发三种第三方图片加载的框架

    最近在项目中用到了大量图片加载,第三方优秀框架还不错,下面介绍三款榜首的框架用法和问题,做一个记录. 现在项目使用的是Android Studio开发的,现在也没有多少人使用Eclipse了吧. 一. ...

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

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/guodongxiaren/article/details/26046543 执行效果 project ...

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

    这篇文章讲讲如何实现开始菜单(或者称为主菜单)的设计.什么是开始菜单呢?我们拿常用的软件来用图例说明,大多数软件的开始菜单在左下角,如下图: 1.window 7的开始菜单 2.有道词典的主菜单 3. ...

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

    6.1 精灵的工作原理 // 将各种图片合并到一张图片里面,并在不同的状态下改变背景图片的位置; 6.2 精灵的重要性 // 压缩图片的内存; // 减少HTTP请求 6.2.3 Compass处理精 ...

  5. 基于Spring MVC的Web应用开发(三) - Resources

    基于Spring MVC的Web应用开发(3) - Resources 上一篇介绍了在基于Spring MVC的Web项目中加入日志,本文介绍Spring MVC如何处理资源文件. 注意到本项目的we ...

  6. Java Web高性能开发(三)

    今日要闻: Clarifai:可识别视频中物体 最近几年,得益于深度学习技术的发展,谷歌和Facebook等企业的研究人员在图形识别软件领域取得了重大突破.现在,一家名为Clarifai的创业公司则提 ...

  7. Qt For Android 开发环境配置

    想了想,还是再写一篇关于Qt for Android开发环境配置的教程. 准备:Java jdk,Android sdk,Android adb,Android ndk,Android ant,Qt ...

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

    本文讲一讲界面设计,作品要面向用户,界面设计的好坏直接影响到用户的体验.现在的窗口设计基本都是扁平化的,你可以从window XP与window 8的窗口可以明显感觉出来.当然除了窗口本身的效果,窗口 ...

  9. 【Qt编程】基于Qt的词典开发系列<一>--词典框架设计及成品展示

    去年暑假的时候,作为学习Qt的实战,我写了一个名为<我爱查词典>的词典软件.后来由于导师项目及上课等原因,时间不足,所以该软件的部分功能欠缺,性能有待改善.这学期重新拿出来看时,又有很多东 ...

随机推荐

  1. (一)SpringMVC

    第一章 问候SpringMVC 第一节 SpringMVC简介 SpringMVC是一套功能强大,性能强悍,使用方便的优秀的MVC框架 下载和安装Spring框架: 登录http://repo.spr ...

  2. vue组件中的轮播实现

    一.直接上代码 <template> <el-row class="Slide"> <el-row class="title"&g ...

  3. Mac OS 下安装mysqlclient报“mysql_config not found”的解决

    如问题所示,应该是你没有将mysql_config所在文件夹加入系统的PATH路径,解决方案下: 1.第一步找到你的mysql_config所在位置 1.1. 如果是直接安装mysql,所在位置应该是 ...

  4. Owin 自定义中间件(2)中间件进阶

    前面一篇文章简单的介绍了中间件的应用 下面编写一个自定义的中间件类库,并加入中间件参数以及引入日志记录中间件的异常 下面来看下中间件的构造,参数可以自定义 这里我定义了一个参数类 编写中间件需要引入 ...

  5. 一步一步学习IdentityServer3 (13) 令牌

    IdentityServer3中客户端保护了授权资源,不难看出在IdentityServer3中,有这样一个设置 AllowedScopes = new List<string> { &q ...

  6. USACO 4.3 Buy Low, Buy Lower

    Buy Low, Buy Lower The advice to "buy low" is half the formula to success in the stock mar ...

  7. 阿里云修改CentOS Linux服务器的主机名

    阿里云主机的默认主机名是为AY开头的随机名称,如何修改为易于区分的友好名称呢?请看下面的操作步骤: 1. vi /etc/hosts i键,修改主机名,esc键,:wq键保存退出 2. vi /etc ...

  8. QT防止程序启动两次的方法

    为了使QT 能保证只创建一个实例来进行, 对windows和linux分别采取了全局互斥变量和文件锁的方法. Q_OS_WIN32宏用来表示编译运行的目标平台是windows,Q_OS_LINUX则标 ...

  9. Object-c和Java中的代理

    代理模式的核心思想就是一个类想做一件事情(函数),但它不去亲自做(实现),而是通过委托别的类(代理类)来完成. 代理模式的优点: 1.可以实现传值,尤其是当一个对象无法直接获取到另一个对象的指针,又希 ...

  10. MCI:移动持续集成在大众点评的实践

    一.背景 美团是全球最大的互联网+生活服务平台,为3.2亿活跃用户和500多万的优质商户提供一个连接线上与线下的电子商务服务.秉承“帮大家吃得更好,生活更好”的使命,我们的业务覆盖了超过200个品类和 ...