Flash社交游戏开发攻略连载(四)——基础控制流3

前段时间比较忙,所以一直没有更新,不好意思。废话不多说,继续我们的控制流第三讲

这次主要讲两个内容:1、完善插入对象以及移出对象功能
    2、在合适的时候更新显示列表,并更新层深
1插入以及移出对象
我们设想,因为程序需要,我们要在场景中插入一个对象,但又因为其他因素,这个对象需要立刻被移出,而这之间的间隔非常小,小到在两帧之间,这个时候我们就没有必要将该对象真正插入到显示列表中(这种情况虽然不多,但是也有可能出现)。
对应public var objectsToAdd:Array(待添加对象数组) ,我们在建一个数组  public var objectsToRemove:Array(待移出对象数组)
然后我们在addObject方法中判断该对象是否也在objectsToRemove出现,如果有,则从objectsToRemove数组中移出该对象,否则,添加到objectsToAdd数组中,removeObject方法也如法炮制。代码如下:
 public function addObject(obj:BaseObject) : void
        {
            var removeIndex:int;
            if (obj)
            {
                removeIndex = objectsToRemove.indexOf(obj);
                if (removeIndex != -1)
                {
                    objectsToRemove.splice(removeIndex, 1);
                }
                else if (objectsToAdd.indexOf(obj) == -1 && baseObjects.indexOf(obj) == -1)
                {
                    objectsToAdd.push(obj);
                    if (obj.parent != null && obj.parent is BaseObject)
                    {
                        BaseObject(obj.parent).removeObject(obj);
                    }
                }
            }
            return;
        }
移 出代码就不写了,也是一样的。这么一来,最终我们得到的肯定是一组真正要被添加到显示列表中和要从显示列表中移除的对象数组。注意,无论怎么添加和移出, 尚未进入下一帧之前,显示列表中的内容都是没有变的,不会对显示性能造成影响,同时baseObjects中的内容也不会发生变化,通常 baseObjects中的内容总是与现实列表中的内容保持一致。
以上两个方法为我们将要在tickBase中的方法addAndRemoveObjects()做了铺垫,那么接下来我就讨论一下addAndRemoveObjects()方法的作用于特点。

一 旦大家开始做AS3游戏了,很快就会发现一个大问题,那就是层深的控制。as2中层深控制看起来可能比较简单,设置层深的深度就可以了,但这在AS3中被 ADOBE取消了,可能是因为性能的低下。取而代之的是使用addChildAt方法来替代,这样一来,我们可能不能很直观的去控制我们想要控制的层深。 因此我们使用addAndRemoveObjects() 方法结合我们自己新建的属性drawPriority(绘画优先级)来控制层次之间的关系。这样的好处就是:无论一个场景内有多少东西的层次要发生变化,我们只会在进入下一帧的时候对这些对象排序一次。
 public function addAndRemoveObjects() : void
 {
            var obj:BaseObject;
            var index:int;
            var isPrio:Boolean;
            if (objectsToRemove.length > 0)
            {
               for each(var i in objectsToRemove)
{
   obj = i;
   index = baseObjects.indexOf(obj);
   if (index != -1)
                    {
                        baseObjects.splice(index, 1);
                     }
                    if (obj.parent != null && obj.parent == this)
                    {
                        removeChild(obj);
                    }
         }
                objectsToRemove.splice(0, objectsToRemove.length);
            }
           
   if (objectsToAdd.length > 0)
            {
               for each(var k in objectsToAdd)
{
  isPrio = false; 
  for (var j = 0; j < baseObjects.length; j++ )
  {
 if (k.drawPriority < baseObjects[j].drawPriority)
 {
            addChildAt(k, getChildIndex(baseObjects[j]));
            baseObjects.splice(j, 0, k);
     isPrio = true;
    break;
  }
   }
   if (!isPrio)
   {
baseObjects.push(k);
addChild(k);

   }
         }
                objectsToAdd.splice(0, objectsToAdd.length);
          }
            return;
 }
简单的解释一下代码,一共做了两件事:
1 把放在objectsToRemove数组中的对象从baseObjects中移出,同时从显示列表中移出,清空objectsToRemove
2 根据objectsToAdd中的每个对象的drawPriority属性,将对象按顺序插入显示列表以及baseObjects数组中,清空objectsToAdd。

这样,我们就完成对该对象内的所有“子”的排序与显示层深的重置。并且每帧最多只会排序一次。
好 了,现在我们的BaseObject类已经完成了一大半。拥有了添加删除对象的两个方法,并且会将帧间隔时间传入该对象的子对象以及该对象的子对象的子对 象以及……(太多了不写了)中,并且拥有属性drawPriority,只要改变该属性,在进入下一帧的时候就会改变显示列表中的层次关系。
接下来,我们只要继承这个类,就可以轻松的控制每一个对象的行为(只要在类中重写tick的方法即可),以及轻松的控制他们层次关系(由于只在帧间隔的时候做,即不会在肉眼上有延迟,且执行效率也会比较高)。

大家可以动手写一个这样的类,然后去用用看,记得在文档类中调用最外层的BaseObject对象的tickBase函数,然后尝试着做添加,删除,修改层深以及覆盖tick方法的操作,这样一来,我们的基本控制流的结构就差不多了。
接下来我们会讲到如何用反射(Reflection)来简化以及模块化开发。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值