• 45度游戏的另类深度排序(copyPixels)


        前面一段时间公司的事情一直比较忙,没什么时间写帖子,都怕小超扣我工资了。今天稍稍闲一些,嘎嘎,偷懒来和大家讨论下45度游戏开发的一个相对重要的问题:深度排序。
        在Actionscript3.0中,由于引入了显示列表的概念,使得深度排序比AS2时代更加简单直接。大概的意思就是,先加入显示列表的深度更深,深度越深的物件会被深度较浅的物件遮挡。

    AS3和AS1 AS2在深度管理上的区别:
         在 ActionScript 1.0 和 2.0 中,通过线性深度管理方案和方法(如 getNextHighestDepth())进行深度管理。
         在 ActionScript 3.0 中提供了 DisplayObjectContainer 类,该类提供用于管理显示对象深度的更便捷的方法和属性。
         在 ActionScript 3.0 中,当您将显示对象移到 DisplayObjectContainer 实例的子级列表中的新位置时,显示对象容器中的其它子级会自动重新定位并在显示对象容器中分配相应的子索引位置。
         此外,在 ActionScript 3.0 中,总是可以发现任何显示对象容器中的所有子对象。每个 DisplayObjectContainer 实例都有numChildren 属性,用于列出显示对象容器中的子级数。由于显示对象容器的子级列表始终是索引列表,因此可以检查列表中从索引位置 0 到最后一个索引位置 (numChildren - 1) 的所有对象。这不适用于 ActionScript 1.0 和 2.0 中 MovieClip 对象的方法和属性。
         在 ActionScript 3.0 中,可以按顺序轻松遍历显示列表;显示对象容器子级列表的索引编号没有中断。遍历显示列表和管理对象深度比在 ActionScript 1.0 和 2.0 中更容易。在 ActionScript 1.0 和 2.0 中,影片剪辑可以包含深度顺序有间歇中断的对象,这可能导致难以遍历对象列表。在 ActionScript 3.0 中,显示对象容器的每个子级列表都在内部缓存为一个数组,这样按索引查找的速度就非常快。遍历显示对象容器所有子级的速度也非常快。
         在 ActionScript 3.0 中,还可以通过使用 DisplayObjectContainer 类的 getChildByName() 方法来访问显示对象容器中的子级。
    ===============www.eb163.com分割线===================
        深度排序在45度游戏中的应用最多的地方,还是人物移动时的深度处理。比如人物移动到一座房子前面,那应该用人物遮挡房子。人物移动到房子后面,就应该用房子遮挡人物。
        而现在网上已经有很多关于45度视觉游戏的深度排序算法及教程,实现的根本逻辑也很简单:
        1、判断是否需要排序。比如人物和房子重叠,就需要判断该用谁遮挡谁。
        2、得到人物和房子的位置,判断从业务逻辑上,谁在前边谁在后边,任务是到底移动到了房子前面还是后面。一般简单的就只需要判断人物和房子的Y坐标即可。
        3、交换人物和房子的显示深度。在AS3中,只需要调用父容器的swapChildren()方法即可。
    ===============www.eb163.com分割线===================
        上面就是一般的作法。但是在玩天书奇谈的时候,发现它的遮挡处理很不错,是采用的透明的方式处理遮挡。比如人物移动到房子后面,那么房子和人物都半透明,既可以体现人物移动到房子后面的视觉效果,又不影响操作。
        那这个是怎么做到的呢?研究了一下,大概应该就是使用了我们今天的主角:copyPixels。
        整个方法应该和上面的方法步骤差不多,主要的不同就在第三步上。判断出遮挡关系以后,不是使用显示列表的深度排序来处理,而是使用copyPixels,来使被遮挡物体实现半透明效果。

    伪代码如下:

      filter.fillRect(rect, 0xff0000ff);
      filter.threshold(bs, rect2, pt, ">", 0x00000000, 0x80000000);//所有不透明的点变为透明
      bgm.bitmapData.copyPixels(bg, rect, pt, filter, pt, false);

  • 相关阅读:
    linux下解压命令大全
    关于伸展树的详细解析(E文)
    数据结构与算法汇总
    Linux下的压缩解压缩命令详解
    Linux Netcat 命令——网络工具中的瑞士军刀
    gethostbyname
    Html 转化为 PDF
    返回一个表
    sqlserver创建函数
    取不同类别的第一条数据
  • 原文地址:https://www.cnblogs.com/axyz/p/2261552.html
Copyright © 2020-2023  润新知