阳光VIP

少壮不努力,老大徒伤悲。平日弗用功,自到临期悔。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

游戏设计笔记:删除对象

Posted on 2012-02-15 21:33  阳光VIP  阅读(197)  评论(0编辑  收藏  举报

最近没有时间写博客了,真的希望可以把好的东西记录下来。

 

 

现在把博客文章都写成问题的形式,这样写起来解决问题能快一些。

 

背景:为什么要删除对象?

        删除是游戏中不可以缺少的步骤,同样了解这个过程实际上是内存一种消亡的过程,为了释放内存所做的一些操作,那就是对象删除

 

 

 

问题一:在游戏结束后,我想把所有的容器的对象都删除那么我应该怎样做?

书上都出现过这些解法:

方案一:写一个方法,然后引用这个方法把所有的对象都删除

 

package {
 import flash.display.*;
 public class DisplayRemove {
  public static function removeAllChildren(container:DisplayObjectContainer):void {
   var count:int = container.numChildren;
   for (var i:int = 0; i<count; i++) {
    container.removeChildAt(0);
   }
  }
 }
}

 

这里方案一是很多都提及过的,当在类引用它的时候只要使用到DisplayRemove.removeAllChildren(this);就能把所有的容器对象除去。

 

 

 

问题二:两个不同的子类产生的对象,子类是独立的,假如创建了对象实例化后这两个对象产生了碰撞,需要删除某一方或者全部删除问题是:

 

 

如何删除单个对象?

 

If(A碰撞了B)

{

 结果:删除B或者A

}

 

如何删除多个对象?

{

If(A碰撞了B)

{

 结果:全部对象要离场。

 }

 

 

}

 

问题关键是:在容器里面删除一个子对象列表。,每次删除一个对象1索引就会减少一个。如果删除了对象1,那么原本对象2在索引1的地方,会变成了索引0,对象3的索引就会变成了索引1

 

假设numChildren >0,那么就意味了容器还没有删除元素,要删除元素就需要使用循环来删除容器来的所有对象列表

f ( numChildren > 0 ) {

removeChildAt( 0 );

 

}

删除所有对象

package ascb.util {

import flash.display.*;

public class DisplayObjectUtilities {

// 删除所有对象

public static function removeAllChildren(

container:DisplayObjectContainer ):void {

var count:int = container.numChildren;

for ( var i:int = 0; i < count; i++ ) {

container.removeChildAt( 0 );

}

}

}

 

就是利用,删除索引为0的对象,让列表下的数不断地往上移动,直到删除完整为止。

使用到容器DisplayObjectContainer类的一个方法,removeChildAt();要调用它就需要使用对象引用方法,但是要注意一点:DisplayObjectContainer类是不能创建实例化

 

 

 

问题三:我使用了for循环复制了很多小球,当小球下落的时候,超过了一个界限,就删除这个子对象。该如何去实现看下面代码

 

  1. package{
  2.  import flash.display.MovieClip;
  3.  import flash.events.*;
  4.  import flash.utils.Timer;
  5.  import Player;
  6.  public class MyMoney extends MovieClip
  7.  {   private var _player:Player;
  8.   private var money:Money;
  9.   private var DropSpeed:int=5;//设置下落速度时间
  10.   private var Time:Timer;
  11.   public function MyMoney()
  12.   { 
  13.      _player=Player.getInstance();
  14.      Time=new Timer(1000);
  15.      Time.addEventListener(TimerEvent.TIMER,TimeRun);
  16.      Time.start();
  17.    
  18.   
  19.   
  20.   }
  21.   
  22.   private function TimeRun(event:TimerEvent):void
  23.   {
  24.    money=new Money();
  25.    money.x=Math.random()*510;
  26.    money.y=-10;
  27.       addChild(money);
  28.       money.addEventListener(Event.ENTER_FRAME,Run);
  29.    
  30.   
  31.   }
  32.   
  33.   
  34.   private function Run(event:Event):void 
  35.   {
  36.    var bullet:MovieClip= event.target as MovieClip;
  37.    bullet.y+=DropSpeed;
  38.    if (bullet.hitTestObject(_player)||bullet.y>400)
  39.    {
  40.     removeMovieclip(bullet,Run);  
  41.           bullet=null;//让金币消失在容器内
  42.      _player.Life-=1;
  43.      trace(_player.Life);
  44.    }
  45.      }
  46.   
  47.   private function removeMovieclip(Obj:MovieClip,functionName:Function):void
  48.   {
  49.    
  50.      this.removeChild(Obj);
  51.      Obj.removeEventListener(Event.ENTER_FRAME,functionName);
  52.   
  53.   
  54.   }
  55.   
  56.  }
  57. }
  58. 这段代码一个很关键的地方
  59. private function Run(event:Event):void 
  60.   {
  61.    var bullet:MovieClip= event.target as MovieClip;
  62.    bullet.y+=DropSpeed;
  63.    if (bullet.hitTestObject(_player)||bullet.y>400)
  64.    {
  65.     removeMovieclip(bullet,Run);  
  66.           bullet=null;//让金币消失在容器内
  67.      _player.Life-=1;
  68.      trace(_player.Life);
  69.    }
  70.      }
  71. private function removeMovieclip(Obj:MovieClip,functionName:Function):void
  72.   {
  73.    
  74.      this.removeChild(Obj);
  75.      Obj.removeEventListener(Event.ENTER_FRAME,functionName);
  76.   
  77.   
  78.   }

通过这个方法,是在类中写一个方法自己删除自身的写法。要注意到一个地方,Event.ENTER_FRAME 事件,如果为每一个子对象装上一个监听,那么意思就是每一帧都会产生一个事件,例如小球下落,每一帧小球都会下落一个位置,那么,有100个小球,每一个小球都意味装了100个监听事件,一旦我们不需要这个对象的时候,就要使用到removeEventListener();这个方法处理,这是设计游戏中一种好的习惯,不然内存一直占用影响cpu使用率,大大降低整体的游戏性能。

 

 

 

三,游戏监听和删除监听器组合

     游戏中经常要使用到addEventListener(Event.ENTER_FRAME,Run);但是使用这个经常有个不好的地方,就是它每一帧都要执行,如果不注意的话,很容易导致一些出错。removeEventListener()功能就是删除了监听器,如果说删除了对象,那么监听器就等于删除了,其实监听还会存在的,为了更好利用资源,需要借助这个removeEventListener()方法一起来删除对象的监听器。

 

 

 

像这种简单接金币小游戏,它需要解决的问题是碰撞金币后,让对象自己能够删除自己。 

 

 

提示:写一个类,在类中加人类消亡方法,说白一点就是自己毁灭自己。这样做碰撞会减少很多麻烦