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移动应用开发(三):使用精灵图片实现帧动画的更多相关文章
- Android开发三种第三方图片加载的框架
最近在项目中用到了大量图片加载,第三方优秀框架还不错,下面介绍三款榜首的框架用法和问题,做一个记录. 现在项目使用的是Android Studio开发的,现在也没有多少人使用Eclipse了吧. 一. ...
- Qt计算器开发(三):执行效果及项目总结
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/guodongxiaren/article/details/26046543 执行效果 project ...
- 【Qt编程】基于Qt的词典开发系列<三>--开始菜单的设计
这篇文章讲讲如何实现开始菜单(或者称为主菜单)的设计.什么是开始菜单呢?我们拿常用的软件来用图例说明,大多数软件的开始菜单在左下角,如下图: 1.window 7的开始菜单 2.有道词典的主菜单 3. ...
- (三)Sass和Compass--制作精灵图片
6.1 精灵的工作原理 // 将各种图片合并到一张图片里面,并在不同的状态下改变背景图片的位置; 6.2 精灵的重要性 // 压缩图片的内存; // 减少HTTP请求 6.2.3 Compass处理精 ...
- 基于Spring MVC的Web应用开发(三) - Resources
基于Spring MVC的Web应用开发(3) - Resources 上一篇介绍了在基于Spring MVC的Web项目中加入日志,本文介绍Spring MVC如何处理资源文件. 注意到本项目的we ...
- Java Web高性能开发(三)
今日要闻: Clarifai:可识别视频中物体 最近几年,得益于深度学习技术的发展,谷歌和Facebook等企业的研究人员在图形识别软件领域取得了重大突破.现在,一家名为Clarifai的创业公司则提 ...
- Qt For Android 开发环境配置
想了想,还是再写一篇关于Qt for Android开发环境配置的教程. 准备:Java jdk,Android sdk,Android adb,Android ndk,Android ant,Qt ...
- 【Qt编程】基于Qt的词典开发系列<六>--界面美化设计
本文讲一讲界面设计,作品要面向用户,界面设计的好坏直接影响到用户的体验.现在的窗口设计基本都是扁平化的,你可以从window XP与window 8的窗口可以明显感觉出来.当然除了窗口本身的效果,窗口 ...
- 【Qt编程】基于Qt的词典开发系列<一>--词典框架设计及成品展示
去年暑假的时候,作为学习Qt的实战,我写了一个名为<我爱查词典>的词典软件.后来由于导师项目及上课等原因,时间不足,所以该软件的部分功能欠缺,性能有待改善.这学期重新拿出来看时,又有很多东 ...
随机推荐
- TObjectList
AOwnsObjects = true 就是 objectlist释放的时候,里面的对象一并释放. TObjectList对象的创建方法有一个参数:constructor TObjectList.C ...
- xcode7 创建pch文件
1.打开xcode 7.2 项目,在屏幕顶端的工具栏,选择File>New>File..>iOS>Other>PCH File,点击"next"下一步 ...
- springMVC源码分析--HttpMessageConverter参数read操作(二)
上一篇博客springMVC源码分析--HttpMessageConverter数据转化(一)中我们简单介绍了一下HttpMessageConverter接口提供的几个方法,主要有以下几个方法: (1 ...
- Ubuntu 14.04 16.04 Linux nvidia 驱动下载与安装
Ubuntu 14.04 16.04 nvidia 驱动安装 最简单直观的方式是在如下的对话框中直接选择驱动安装即可 但是有时候,驱动不够新,比如14.04用的是340.98版本,如果手动安装驱动可以 ...
- select into的缺点
当使用到select * into 表A from 表 B时可以复制表的结构和数据,但是千万不要忘了给新表A添加主键和索引, 因为在使用select into 时不会复制索引和主键,因此,当我 ...
- 利用sys.dm_db_index_physical_stats查看索引大小/碎片等信息
我们都知道,提高sql server的数据查询速度,最有效的方法,就是为表创建索引,而我们对数据表进行新增,删除,修改的时候,会产生索引碎片,索引碎片多了,对性能产生很大的影响,索引碎片越多对数据库查 ...
- CVE-2014-1776 秘狐
传说中的IE秘狐 [CNNVD]Microsoft Internet Explorer 释放后重用漏洞(CNNVD-201404-530) Microsoft Internet Explorer(IE ...
- 转:40个Java集合面试问题和答案
转自牛客网:http://mp.weixin.qq.com/s?__biz=MjM5NDYxMzk1Nw==&mid=215319390&idx=1&sn=1ab621bc40 ...
- 2017 Tag Cloud
距离上一篇随笔已经过去了三年多,惊讶地发现我还有个博客在这里 :) 越来越懒,这三年多就用下面这个tag cloud来总结好了
- Ubuntu18.04 n卡配置
一.背景 最近安装了ubutnu18.04后,安装系统后重启卡住,强制关机重启后,又在开机界面紫屏卡住,上网搜索后发现是n卡的驱动问题,使用以下方法安装驱动后成功解决该问题. 二.解决方法 1.进入恢 ...