2D游戏模型中动态分层的处理 及解决方案 (适用于 webgame 手游等资源控制较严格类型)
文章若非特别注明转载,皆是原创,转载请注明出处。
本文地址:http://www.cnblogs.com/bobolive/p/3537215.html
2D游戏中模型一般都有换装逻辑,特别是联网游戏,对资源有非常高的要求,很多时候甚至成了新游戏存活的生命线(特别是页游),一般来说都会采取分层处理。
比较多的是采用固定分层的方式, 较典型分层方式:身体(包括服装), 武器, 坐骑,翅膀,一般还有各个部件对应的物效层,再复杂一点还有多层武器/多层坐骑(比如:双手武器在跑动时一个在前一个在后,人身在坐骑头部和身体之间。不过页游一般不会这样做,因这样的复杂度高,资源量大,特别是在软渲染时层次越多效率越差)。
定好分层后,各个层的顺序不是固定的,以八方向的模型为例(以小键盘数字键来对应命名,一般会有5个方向的资源,可能是【1、2、4、7、8】,剩下的做反转),2方向的武器应该在身体后面,对应8方向的武器就应该是身体的前面。


一种做法是固定层次,做大面积镂空,这种方法在程序上处理简单,但是只能应用于武器只换颜色和特效不换形状的需求,否则无法做统一的镂空。
另一种是,关键部位镂空,武器的形状可以差别很大,关键部位(如握手处)差不多就可以, 层次由配置信息来决定, 并且每个模型有单独的配置文件。


游戏模型中配置一般细分到特定动作(如跑步)的特定方向,假设p代表跑步,小键盘数字标方向,p_2则表示模型是正向屏幕前的观看者做跑步动作。这可以满足游戏对模型的基本需求。
如果往精细做的话这些还是不够,可以想像下,如果有个模型的技能动作是拿着武器做大风车回旋斩的话,它在特定动作的特定方向上还是有层次变化的,这种也不是每个动作都有。这种情况的话,上面的方式就满足不了。
解决这种问题是给每一帧都定义上层次信息,如:c111333111, 这定义是这样解释:
c : 表示此处开始是层次定义
111333111 : 表示这个动作有九帧,前三帧和最后三帧在第一层,中间三帧是在第三层。
这种配置还可以扩展比如说加 tb 表示身体部份,tw 表示武器部份等等,剩下的就是在程序里灵活处理它。
程序实现上,例:
每个层次对应一张位图(这个层次跟具体模型无关), 按类型取出模型并根据配置摆到对应的层次,然后根据配置来设置位图的叠放顺序,这部份代码如下:
/**
* 得到一张已经摆放好层次的位图
* 取图按类型存取,同一个类型的位图大小一样
*/
public function getBitmapByIndex(type_:Object, index_:Object):Bitmap
{
var index:int = int(index_); var bitmap:Bitmap;
if(!_bitmapDic) _bitmapDic = [];
if(null != _bitmapDic[type_]) bitmap = _bitmapDic[type_] as Bitmap;
else bitmap = _bitmapDic[type_] = new Bitmap; appendNewBitmap(index, bitmap); return bitmap;
} //根据配置层次排序(好处是可以预留层次,如在定义上是1、3、6 中间可以有调整的空间),按排序后的深度设置图片
public function appendNewBitmap(index_:int, bitmap_:Bitmap):void
{
if(!_displayIndexs) _displayIndexs = [];
if(_displayIndexs.indexOf(index_) == -1)
{
var hasAdd_:Boolean = contains(bitmap_);
if(hasAdd_)
{
var oIndex_:int = getChildIndex(bitmap_);
} _displayIndexs.push(index_);
_displayIndexs.sort(Array.NUMERIC);
var index:int = _displayIndexs.indexOf(index_); if(!hasAdd_)
{
_bitmapNum ++;
addChildAt(bitmap_, index);
}
else if(oIndex_ != index)
{
setChildIndex(bitmap_, index);
}
}
}
交流合作邮箱: wenbocode@126.com
2D游戏模型中动态分层的处理 及解决方案 (适用于 webgame 手游等资源控制较严格类型)的更多相关文章
- 海外开发者推荐:10个顶级2D游戏资源站
转自:http://www.gamelook.com.cn/2015/12/239038 Gamelook报道/随着手游市场的持续增长,HTML5的发展以及大型发行商的支持,2D游戏的数量变得越来越多 ...
- vue中动态引入图片为什么要是require, 你不知道的那些事
相信用过vue的小伙伴,肯定被面试官问过这样一个问题:在vue中动态的引入图片为什么要使用require 有些小伙伴,可能会轻蔑一笑:呵,就这,因为动态添加src被当做静态资源处理了,没有进行编译,所 ...
- 腾讯WeTest《2017中国移动游戏质量白皮书》开放预约,再为国内手游把把脉
产品为王,质量先行.如果说2016年是爆款手游相继崛起的一年,那么2017年则更像是打磨精品.建立生态的高手切磋之年.守住一个游戏的质量生命线,方能建立健康生态,方能在如火如荼的行业竞争中角逐到最后. ...
- 年度游戏圈2018白皮书解析手游折扣app哪个好及靠谱程度分析
2018年,随着全国暂停游戏版本的审核和发布<综合防控儿童青少年近视实施方案>(控制新的在线游戏数量),游戏行业受到的影响不小. 在游戏产业中,游戏行业2018年的收入同比增长5.2%,远 ...
- 破解者是如何篡改游戏内数值的,揭秘Android手游破解全过程
由于Android系统的开放性,让人人都是开发者成为可能,也正因如此,手机APP遭受破解和盗版问题长期存在,且愈演愈烈.尤其是手游 行业,如刀塔传奇.植物大战僵尸.2048等知名游戏被破解的案例不胜枚 ...
- JY游戏之手游《打卡乐猫》
JY游戏之手游戏<打卡乐猫> JY是一款专门制作js小游戏的js库,它集成了一些对网页类小游戏的功能帮助 ,能帮你更快的完成js开发,它的主体框架包JY.JYG.Sprite.Sprite ...
- 【Unity3D】利用Shader以及更改Mesh实现2D游戏的动态阴影效果
最近看到一个非常有趣的益智小游戏,是一个盗贼进入房子偷东西的, 其实这种游戏市面上已经很多了,吸引我的是那个类似手电筒的效果, 主角走到哪里,光就到哪里,被挡住的地方还有阴影.有点类似策略游戏里的战争 ...
- 地图四叉树一般用在GIS中,在游戏寻路中2D游戏中一般用2维数组就够了
地图四叉树一般用在GIS中,在游戏寻路中2D游戏中一般用2维数组就够了 四叉树对于区域查询,效率比较高. 原理图
- Unity 2D游戏开发教程之游戏中精灵的跳跃状态
Unity 2D游戏开发教程之游戏中精灵的跳跃状态 精灵的跳跃状态 为了让游戏中的精灵有更大的活动范围,上一节为游戏场景添加了多个地面,于是精灵可以从高的地面移动到低的地面处,如图2-14所示.但是却 ...
随机推荐
- EntityFramework 连接数据库出错
本文转载:http://www.cnblogs.com/shuang121/archive/2012/03/19/2406121.html 总结:选择“是”时,连接字符串的密码会暴露出来,“否”的时候 ...
- Android develop tricks——整理自国外的一些Blog
ViewDragHelper --视图拖动是一个比較复杂的问题.这个类能够帮助解决不少问题.假设你须要一个样例,DrawerLayout就是利用它实现扫滑.Flavient Laurent 还写了一些 ...
- httpclient模拟浏览器訪问站点
HttpClient 是 Apache Jakarta Common 下的子项目.能够用来提供高效的.最新的.功能丰富的支持 HTTP 协议的client编程工具包.而且它支持 HTTP 协议最新的版 ...
- MySQL Cluster初步测试结果汇总图示报告 --> 用mysqlslap与sysbench进行测试
Cluster结构图 测试环境简介 Mysql cluster集群测试环境 4 data node,32G 8核cpu 4 ...
- PHP中获取中英文混合字符串长度[主要是指个数,而不是字符串长度](转)
今晚在写框架的表单验证类时,需要判断某个字符串长度是否在指定区间内,很自然地,想到了PHP中的strlen函数. $str = 'Hello world!'; echo strlen($str); ...
- careercup-中等难题
17.1 编写一个函数,不用临时变量,直接交换两函数. 解法: 方法一:这个是经典面试题,也相当直接.我们将用a0表示a的初值,b0表示b的初始值,用diff表示a0-b0的值. 让我们将a>b ...
- Array.prototype.slice.call(arguments) 类数组转成真正的数组
Array.prototype.slice.call(arguments) 我们知道,Array.prototype.slice.call(arguments)能将具有length属性的对象转成数 ...
- UNIX标准化及实现之标准之间的冲突
就整体而言,这些不同的标准之间配合得相当好.但是我们也很关注它们之间的差别,特别是ISO C标准和POSIX.1之间的差别. ISO C定义了函数clock,它返回进程使用的CPU时间,返回值类型是c ...
- (原)nginx 源码编译
要在nginx上开发,所以先了解下这个是干嘛的..百度一下很多 编译源码需要的组件 1.zlib 2.pcre 3.openssl 使用ubuntu的话.可以直接使用 sudo apt-get ins ...
- synopsys license maker
参见bingled大牛的文章(http://bbs.eetop.cn/viewthread.php?tid=366602&extra=&page=1) 注意:经坛友提示,部分系统版本2 ...