arpg网页游戏特效播放(一)
网页游戏中的特效,主要包括:场景特效,攻击特效和UI特效三种。场景特效是在地图层上播放的特效,攻击特效主要是技能触发的一些特效,UI特效是面板上的一些特效,还有一些在人物身上播放的特效,例如脚底光圈特效等。特效的播放方式有两种,一种是直接播放swf,二种是根据图片序列,直接绘画到Bitmap上,对于两种方式,我比较倾向于直接绘画到Bitmap上。一般我们我们处理程序的逻辑是,显示和逻辑分开。对于特效显示逻辑,就是特效的绘画逻辑,以及资源的整理方式,逻辑就是特效的播放位置和播放时机不一样而已。所以对于特效,我们抽象出一个基类来处理显示逻辑。
- 特效资源的组织方式:一种是swf方式,即特效制作人员直接倒出swf文件,直接放到程序中播放,一般小游戏会这么做;还有一种是特效制作人员给出一系列png图片,然后程序根据图片序列和帧率用FlashCS 制作swf文件,然后再程序里根帧率去把swf中每一帧绘画一个bitmapdata中,还有一种是写一个工具,把所以的图片序列生成一张大的png,然后还有一个图片xy偏移的配置文件,根据这个配置文件去取像素,绘画到bitmap上。
- 特效绘画到bitmap,要一个需要解决的问题,我把它称作“置心点”,即特效制作人员,制作特效的时候,肯定是根据一个中心点来制作。这个中心一般是画布的中央,或者左上角等。所有绘画到bitmap上的图片序列需要根据这个点做偏移的。
- 因为游戏中,会涉及到特效重叠的情况,所以bitmap有一个属性blendMode,即指定使用的混合模式,一般情况用不到这个属性,但是偶尔一些特殊效果,需要用到这个。这个属性查一下API会有详细的图例说明。
- cacheAsBitmap属性,为True时,可提高显示性能,这属性是一把双刃剑,最好将此属性与主要具有静态内容且不频繁缩放和旋转的影片剪辑一起使用,如果对位图适用滤镜时,此属性直接为True,其实我感觉这就是一种拿内存来换显示效率的一种方式。具体在什么情况下,使用此属性,我也没有一个很明确的定论,一直跟着自己的感觉走,就是设置下此属性,看看流畅度和内存使用率,怎么好就怎么选择了。
现举例说明:
资源的组织方式:特效制作人员会给出一系列png图片和置心点,然后用jsfl工具,把png裁剪到最小范围,并且生成一个偏移量的xml文件。然后再用生成工具把处理过的png图片绘画到swf中的每一帧当中,并且在配置文件中配置此特效的ID,置心点,播放序列。如:590000004(ID),75,85(point),
1,1,2,2,3,3,4,4,5,5,6,6(frames)。这个帧序列的意思就是:第一帧播放swf中第一个图片,第二帧也是第一张图片,第三帧是2张图片,如此循环,便形成一个特效的播放过程。
特效的播放函数(伪代码):
public function render(stepFrame:int, stepTime:Number):void
{
var index:int = _info.frames[_currentFrame];
var pack:IPackageFileData = _effectSwf.getPkgData(index); //取当前播放图片序列
if(pack != null)
{
if(index != lastImg)
bitmapData = pack.getBD();
lastImg = index;
var _x:int = pack.getX() -_info.org_point.x + _sceneX;
var _y:int = pack.getY() -_info.org_point.y + _sceneY;
if(super.x != _x)
super.x = _x;
if(super.y != _y)
super.y = _y;
}
_currentFrame = _currentFrame + stepFrame;
if (_currentFrame >= _info.frames.length)
{
count++;
_currentFrame = 0;
}
}
public function getPkgData(imgId:int):IPackageFileData // 接上面的函数
{
if(_isReady == false)
return null; if(_bmdDatas[imgId]){ // 有缓存直接返回
return _bmdDatas[imgId];
} if(imgId > _frameCount)
return null; var bmdRect:Rectangle;
var bmd:BitmapData; this._source.gotoAndStop(imgId); // swf直接播放到当前图片序列
bmdRect = this._source.getBounds(this._source);
if (bmdRect.width == 0)
{
return null;
}
else
{
bmd = new BitmapData(bmdRect.width, bmdRect.height, true, 0);
this._matrix.tx = -bmdRect.x;
this._matrix.ty = -bmdRect.y;
bmd.draw(this._source, this._matrix);
var pkgData:PacckageFileData = new PacckageFileData(bmd, bmdRect.x, bmdRect.y);
_bmdDatas[imgId] = pkgData;
}
return _bmdDatas[imgId];
}
现在想来,如果把png序列图片,通过一定的算法,绘画到一张大的bitmap上,然后根据配置文件直接去像素,这样的效率应该会更高。做手游处理资源的方式是这样的,而且还有专门的工具。这个东西也不太好评估,因为把png序列导成swf可以对图片进行一些压缩,从而减少加载大小,提高显示速度,加载是快了,但是显示的时候,还隐形的创造了一个swf对象,多占了好多内存。如果只加载一张比较png图片,加载慢了些,但是png多大,就会占用的多大的内存,比swf对象占的内存小的多。哪个更好些,我也没对比过。不过随着硬件的不断发展和网络不断提速,这两种方式区别可能越来越小,那就怎么方便怎么来吧。
(转载请表明出处)
arpg网页游戏特效播放(一)的更多相关文章
- arpg网页游戏之地图(一)
[转]http://www.cnblogs.com/BlueWoods/p/4681572.html?from=timeline&isappinstalled=1 开发arpg网页游戏一项比较 ...
- arpg网页游戏之地图(三)
地图分块加载类MapEngine,主要包含以下属性: g 地图层graphics,地图将画在上面 buffPixelRange 地图加载范围矩形 viewPort 屏幕视窗 currZoneArr 已 ...
- arpg网页游戏之地图(二)
[转]http://www.cnblogs.com/BlueWoods/p/4684557.html 这一节说说视窗,这个视窗,也就是游戏的视角.现在的网页游戏分为2D游戏,2.5D游戏和3D游戏,2 ...
- arpg网页游戏之地图(四)
这一节主要是针对上一节的补充,关于地图的优化策略上一节中已经涉及了一些,这一节具体说下. 地图块加载队列:就拿1280*800的屏幕分辨率来讲,大约需要加载的地图块为30~35块之间,如果这个时候一下 ...
- 原生js写的贪吃蛇网页版游戏特效
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <bo ...
- [Mugeda HTML5技术教程之14]案例分析:制作网页游戏
本文档要分析的案例是一个爱消除的网页小游戏,从中可以体会一些Mugeda API的用法和使用Mugeda动画制作网页游戏的方法. (一)游戏规则: 1.开始游戏时,手机出现在最上面一行的任意一格: 2 ...
- 推荐21款最佳 HTML5 网页游戏
尽管 HTML5 的完全实现还有很长的路要走,但 HTML5 正在改变 Web,未来 HTML5 将把 Web 带入一个更加成熟和开放的应用平台.现在,越来越多的人尝试用 HTML5 来制作网页游戏等 ...
- 基于html5实现的愤怒的小鸟网页游戏
之前给大家分享一款基于html5 canvas和js实现的水果忍者网页版,今天给大家分享一款基于html5实现的愤怒的小鸟网页游戏.这款游戏适用浏览器:360.FireFox.Chrome.Safar ...
- 解决unity3d发布的网页游戏放到服务器上无法使用的问题
http://www.unity蛮牛.com/blog-2429-1226.html 第一次把unity3d发布的网页游戏放到服务器上(Win2003),发现无法使用.可以尝试以下办法. ...
随机推荐
- 升级php7一些需要注意的地方
1.升级过程涉及代码的主要处理的就是几个扩展(mysql.mssql .mcrypt.ereg)使用到的一些废弃函数(call_user_method.call_user_method_array等) ...
- SQL 常用的命令
--修改表名 --格式:SP_RENAME TABLENAME,NEWTABLENAME SP_RENAME TABLENAME,NEWTABLENAME --只能对表,不能对临时表 --修改字段名 ...
- 使用Fragment适应不同屏幕和分辨率
Fragment是Android3.0后增加的新控件,有点类似于Activity组件,也是用来承载各种View元素.Google增加这个 玩意的目的是为了平板电脑里面可以复用部分显示的View,只要写 ...
- 百度echart如何动态生成图表
百度echart如何动态生成图表 一.总结 一句话总结: clear hideloading setOption 主要是下面三行代码: myChart.clear(); //清空画布myChart.h ...
- springboot入门(一)--快速搭建一个springboot框架
原文出处 前言在开始之前先简单介绍一下springboot,springboot作为一个微框架,它本身并不提供Spring框架的核心特性以及扩展功能,只是用于快速.敏捷地开发新一代基于Spring框架 ...
- [转]TOMCAT启动提示NB: JAVA_HOME should point to a JDK not a JRE解决
来源:http://blog.csdn.net/caozhongyan/article/details/6602759 本人使用的Tomcat版本为apache-tomcat-6.0.18(用的是解压 ...
- .net 获取邮箱邮件列表和内容
需求: 最近项目里遇到了个问题,对方没有提供直接获取数据源的api接口,而是通过邮件发数据的.这就需要接收邮件后解析邮件内容获得数据. 分析: 想在代码里实时获取邮件,可以通过邮件的几个协议来实现,常 ...
- Linux crontab定时执行任务 命令格式与详细例子(转)
基本格式 : * * * * * command 分 时 日 月 周 命令 第1列表示分钟1-59 每分钟用*或者 */1表示 第2列表示小时1-23(0表示0点) 第3列表示日期1-31 第4列表示 ...
- Jersey 2.x 从Maven Archetype 创建一个新项目
创建 Jersey 工程需要使用 Apache 的 Maven 软件工程和管理工具.所有的Jersey产品模块都可以在 Maven中央库 中找到.这样的话 Jersey 可以非常容易和其他基于 Mav ...
- Axel and Marston in Bitland CodeForces - 782F (bitset优化)
题目链接 $dp[0/1][i][x][y]$表示起始边为0/1, 走$2^i$ 步, 是否能从$x$走到$y$ 则有转移方程 $dp[z][i][x][y]\mid=dp[z][i-1][x][k] ...