您的位置:首页 > 其它

游戏设计笔记:删除对象

2010-11-11 22:50 363 查看
背景:为什么要删除对象?

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

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


书上都出现过这些解法:

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

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循环复制了很多小球,当小球下落的时候,超过了一个界限,就删除这个子对象。该如何去实现看下面代码

package{

import flash.display.MovieClip;

import flash.events.*;

import flash.utils.Timer;

import Player;

public
class
MyMoney extends MovieClip

{ private
var _player:Player;

private
var money:Money;

private
var DropSpeed:int
=5;//设置下落速度时间

private
var Time:Timer;

public
function MyMoney()

{

_player=Player.getInstance();

Time=new
Timer(1000);

Time.addEventListener(TimerEvent.TIMER,TimeRun);

Time.start();

}

private
function TimeRun(event
:TimerEvent):void

{

money=new
Money();

money.x=Math.random()*510;

money.y=-10;

addChild(money);

money.addEventListener(Event.ENTER_FRAME,Run);

}

private
function Run(event
:Event):void

{

var bullet:MovieClip= event
.target as
MovieClip;

bullet.y+=DropSpeed;

if
(bullet.hitTestObject(_player)||bullet.y>400)

{

removeMovieclip(bullet,Run);

bullet=null
;//让金币消失在容器内

_player.Life-=1;

trace(_player.Life);

}

}

private
function removeMovieclip(Obj:MovieClip,functionName:Function):void

{

this
.removeChild(Obj);

Obj.removeEventListener(Event.ENTER_FRAME,functionName);

}

}

}

这段代码一个很关键的地方

private
function Run(event
:Event):void

{

var bullet:MovieClip= event
.target as
MovieClip;

bullet.y+=DropSpeed;

if
(bullet.hitTestObject(_player)||bullet.y>400)

{

removeMovieclip(bullet,Run);

bullet=null
;//让金币消失在容器内

_player.Life-=1;

trace(_player.Life);

}

}

private
function removeMovieclip(Obj:MovieClip,functionName:Function):void

{

this
.removeChild(Obj);

Obj.removeEventListener(Event.ENTER_FRAME,functionName);

}

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

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

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



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

提示:写一个类,在类中加人类消亡方法,说白一点就是自己毁灭自己。这样做碰撞会减少很多麻烦
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: