Actionscript 3 如何删除数组AS3中类的实例
所以我有一个在数组中实例化的敌人列表,我在屏幕上看到了它们。当他们被射杀时,我希望被射杀的敌人从屏幕上移除。顺便说一句,敌人的职业和敌人的电影剪辑有联系,子弹也是一样。我知道问题是它不能比较和删除,但我不知道如何修复它。基本上,我想知道如何删除存储在数组中的类文件的实例 到目前为止,我得到的是:Actionscript 3 如何删除数组AS3中类的实例,actionscript-3,flash,flash-cs6,Actionscript 3,Flash,Flash Cs6,所以我有一个在数组中实例化的敌人列表,我在屏幕上看到了它们。当他们被射杀时,我希望被射杀的敌人从屏幕上移除。顺便说一句,敌人的职业和敌人的电影剪辑有联系,子弹也是一样。我知道问题是它不能比较和删除,但我不知道如何修复它。基本上,我想知道如何删除存储在数组中的类文件的实例 到目前为止,我得到的是: stage.addEventListener(MouseEvent.CLICK, shoot); var enemyList:Array = new Array(); addE
stage.addEventListener(MouseEvent.CLICK, shoot);
var enemyList:Array = new Array();
addEnemies(608.75, 371.85);
function addEnemies(xLoc:Number, yLoc:Number):void {
var enemy:Enemy = new Enemy(xLoc, yLoc);
addChild(enemy);
enemyList.push(enemy);
}
function shoot(event:MouseEvent):void{
for(var i:int = 0; i < 4; i++){
var enemy:Enemy = enemyList[i];
if(scope.redDot.hitTestObject(enemy)){
trace("SHOT TO DEATH");
}
else{
trace("DIDNT DIE");
}
}
}
stage.addEventListener(MouseEvent.CLICK,shot);
var enemyList:Array=new Array();
增编(608.75、371.85);
函数加法(xLoc:Number,yLoc:Number):void{
var敌人:敌人=新敌人(xLoc,yLoc);
addChild(敌人);
推进(敌人);
}
功能射击(事件:MouseEvent):无效{
对于(变量i:int=0;i<4;i++){
var敌人:敌人=敌人列表[i];
if(scope.redDot.hitTestObject(敌人)){
痕迹(“枪杀”);
}
否则{
痕迹(“没有死”);
}
}
}
我在输出窗口中不断遇到此错误:
TypeError:Error#1010:术语未定义且没有属性。
在佛罗里达州狙击手::主时间线/射击()
任何帮助都将不胜感激 我已经很久没有使用AS3了,但是
enemyList.splice(enemyList.indexOf(enemy), 1)
应该可以移除
虽然RustyH是正确的,但我不确定您遇到的错误:
enemyList.splice( enemyList.indexOf( enemy ), 1 );
但是,由于您是在一个带有常数求值(i<4)的for循环中执行此操作的,因此您可以执行速度稍快的操作:
enemyList.splice( i, 1 );
另外,您将获得的空引用错误:
TypeError: Error #1010: A term is undefined and has no properties. at sniper_fla::MainTimeline/shoot()[sniper_fla.MainTimeline::frame1:58]
这很可能是由您的:scope.redDot.hitTestObject(敌人)
引起的,尤其是scope
或子scope.redDot
。当您试图引用它时,其中一个可能不存在。您必须彻底检查您的代码,但这是在时间轴中编码的缺点,因为它可能有许多不同的问题(或者根本没有以下问题),例如:
不作为作用域的子级存在redDot
- 尚未在当前帧上创建redDot或scope(或两者)
或scope
是不正确的引用名称redDot
scope
或scope.redDot
从敌人阵列中移除物品的更复杂但更快的方法是使用:
这种方法消除了在从阵列中删除某些内容时对整个阵列重新编制索引的需要,如果您不断从敌人列表中删除和添加项目,这将大大提高性能。这种方法的缺点是敌人列表不会保持排序,尽管我认为没有必要对其进行排序。我想知道,如果将
pop()
缓存在if(I>=0)
下,然后删除if语句if(enemyList.length==1)
,可能会看到增加。
function removeEnemy(enemy:Enemy):void
{
var i:int = enemyList.indexOf(enemy);
if(i >= 0)
{
if(enemyList.length === 1 || enemyList[enemyList.length] === enemy)
{
// If we are referring to the last enemy in the list, or there is only
// one enemy in the list, we can just use pop to get rid of the target.
enemyList.pop();
}
else
{
// In this case, we remove the last enemy from the array and retain a
// reference to it, then replace the target enemy we want to remove
// with that enemy.
var tempEnemy:Enemy = enemyList.pop();
enemyList[i] = tempEnemy;
}
}
// We can also remove the Enemy from the stage in this function.
enemy.parent && enemy.parent.removeChild(enemy);
}