Actionscript 3 AS3参数错误#2025
我正在为学校制作一个游戏,最近在as3中遇到了一个小问题。我正在制作一个游戏,在游戏中你操纵飞船避开小行星,并且刚刚添加了这个功能,这样当你撞上小行星时,你的飞船会通过stage.removeChild从舞台上移除。一切都很好,直到你真的击中了什么东西,然后这个错误出现了(我的意思是很多,就像它一直重复自己,只要游戏还在继续): 下面是代码(我在第54行标出):Actionscript 3 AS3参数错误#2025,actionscript-3,Actionscript 3,我正在为学校制作一个游戏,最近在as3中遇到了一个小问题。我正在制作一个游戏,在游戏中你操纵飞船避开小行星,并且刚刚添加了这个功能,这样当你撞上小行星时,你的飞船会通过stage.removeChild从舞台上移除。一切都很好,直到你真的击中了什么东西,然后这个错误出现了(我的意思是很多,就像它一直重复自己,只要游戏还在继续): 下面是代码(我在第54行标出): package com.asgamer.basics1 { 导入flash.display.MovieClip; 导入flash.di
package com.asgamer.basics1
{
导入flash.display.MovieClip;
导入flash.display.Stage;
导入flash.events.Event;
公共类引擎扩展了MovieClip
{
私有变量numStars:int=80;
private-var-enemyList:Array=new-Array();
私人船舶:船舶;
公共函数引擎():void
{
我们的船=新船(阶段);
阶段。添加孩子(我们的船);
ourShip.x=stage.stageWidth/2;
ourShip.y=stage.stageHeight/2;
对于(变量i:int=0;i 舞台。移除孩子(我们的船)问题是由于您多次尝试从阶段删除我们的而引起的。更准确地说,是在每个事件上。输入_FRAME
事件。问题是,正如刚才提到的,您在实际将我们的阶段删除后,没有清理它。请参阅,一旦您调用stage.removeChild()
船不再在舞台上,但碰撞检查仍在进行,因为您没有删除enter frame侦听器。您应该将remove listener语句添加到删除船的代码分支中
stage.addEventListener(Event.ENTER_FRAME, krash);
... // other code
function krash(e:Event):void{
for each (var enemy in enemyList)
if (enemy.hitTestObject(ourShip)==true){
stage.removeChild(ourShip);
stage.removeEventListener(Event.ENTER_FRAME, krash); // THIS line
}
}
编辑:首先,将addEventListener(Event.ENTER_FRAME,krash)
行移动到添加循环
侦听器的位置,因为您不希望有多个侦听器,其次,对hitTestObject
与EneyList
进行完整循环。上面的代码已更新
注意:一些有效性检查可能需要出现在侦听器代码中,例如,如果ourShip
已被删除,您可以从事件侦听器函数中返回
,或者跳过命中测试检查。一旦您开始进入单主输入帧侦听器,这也会对您有所帮助-通常更快将一个函数作为同一事件的事件监听器,比将多个函数作为同一事件的事件监听器,还可以帮助您将响应特定事件而要执行的每一段代码整合到一个位置,而不是搜索错误出现的语句的位置。这也有助于避免定期添加/删除监听器有时和听众一起玩会让你做得更好。克拉什听众附在舞台上。我认为,应该把它从舞台上移除,而不是我们的飞船上。@Pethrehorovsky,对了,修复了。非常感谢你的回答!但我尝试过这个,起初它是有效的,但当更多的敌人通过舞台后,错误再次出现。Cou是不是我的敌人类中的某个东西导致了冲突?因为其中有一个函数,可以在敌人离开舞台时移除他们..啊,没有注意到侦听器被添加了多次。你应该有一个侦听器来处理冲突,而不是很多。编辑。很抱歉打扰你这么多,但是我到底在哪里n当你说圈内听者时?
package com.asgamer.basics1
{
import flash.display.MovieClip;
import flash.display.Stage;
import flash.events.Event;
public class Engine extends MovieClip
{
private var numStars:int = 80;
private var enemyList:Array = new Array();
private var ourShip:Ship;
public function Engine() : void
{
ourShip = new Ship(stage);
stage.addChild(ourShip);
ourShip.x = stage.stageWidth / 2;
ourShip.y = stage.stageHeight / 2;
for (var i:int = 0; i < numStars; i++)
{
stage.addChildAt(new Star(stage), stage.getChildIndex(ourShip));
}
addEventListener(Event.ENTER_FRAME, loop, false, 0, true);
}
private function loop(e:Event) : void
{
if (Math.floor(Math.random() * 14) == 5)
{
var enemy:Asteroid = new Asteroid(stage);
enemy.addEventListener(Event.REMOVED_FROM_STAGE, removeEnemy, false, 0, true);
enemyList.push(enemy);
stage.addChild(enemy);
stage.addEventListener(Event.ENTER_FRAME, krash);
function krash(e:Event):void{
if (enemy.hitTestObject(ourShip)==true){
stage.removeChild(ourShip); <-------------------------- LINE 54
}
}
}
}
private function removeEnemy(e:Event)
{
enemyList.splice(enemyList.indexOf(e.currentTarget), 1);
}
}
stage.addEventListener(Event.ENTER_FRAME, krash);
... // other code
function krash(e:Event):void{
for each (var enemy in enemyList)
if (enemy.hitTestObject(ourShip)==true){
stage.removeChild(ourShip);
stage.removeEventListener(Event.ENTER_FRAME, krash); // THIS line
}
}