游戏设计笔记:删除对象
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()方法一起来删除对象的监听器。
像这种简单接金币小游戏,它需要解决的问题是碰撞金币后,让对象自己能够删除自己。
提示:写一个类,在类中加人类消亡方法,说白一点就是自己毁灭自己。这样做碰撞会减少很多麻烦
删除是游戏中不可以缺少的步骤,同样了解这个过程实际上是内存一种消亡的过程,为了释放内存所做的一些操作,那就是对象删除
问题一:在游戏结束后,我想把所有的容器的对象都删除那么我应该怎样做?
书上都出现过这些解法:
方案一:写一个方法,然后引用这个方法把所有的对象都删除
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()方法一起来删除对象的监听器。
像这种简单接金币小游戏,它需要解决的问题是碰撞金币后,让对象自己能够删除自己。
提示:写一个类,在类中加人类消亡方法,说白一点就是自己毁灭自己。这样做碰撞会减少很多麻烦
相关文章推荐
- 游戏设计笔记:删除对象
- 游戏设计笔记:删除对象
- flash 游戏设计笔记:删除对象
- 游戏设计笔记:删除对象
- 游戏系统开发笔记(七)——对象系统设计
- 游戏系统开发笔记(六)——对象系统设计
- 游戏系统开发笔记(七)——对象系统设计
- 游戏系统开发笔记(七)——对象系统设计
- 设计模式笔记二十二:空对象模式
- C#面向对象设计模式纵横谈 笔记1. 面向对象设计模式与原则
- Java自学笔记(第六天)-static-类变量-对象变量-javadoc文档-static代码块-单例设计模式
- 【Cocos2d-X游戏实战开发】捕鱼达人之单例对象的设计(二)
- flash 游戏设计笔记:人物行走一种做法 (2)
- 游戏系统开发笔记(六)——服务端架构设计
- Flash 游戏设计笔记:鼠标类游戏(4)
- Sigleton单件(创建型模式)--面向对象设计模式纵横谈讲座笔记之二
- 通关!游戏设计之道的学习笔记(五)3C
- C#面向对象设计模式纵横谈 学习笔记22 State模式(行为型模式)
- 在线捉鬼游戏开发之二 - 设计业务对象与对象职责划分(3)
- flash 游戏设计笔记