2017-04-09 40 views
0

我只是Flash的初学者,我无法解决这个问题。闪存执行循环 - 每击一次只带走一次健康

我该如何让每个命中的动作只执行一次?

这是我的代码:

stage.addEventListener(Event.ENTER_FRAME,loop); 
function loop (event:Event):void 
    { 
      for (var i:int = hBottleArray.length-1; i >= 0; i--){ 
     if (runner.hitTestObject(hBottleArray[i])){ 
      health++; 
      hBottleArray.removeAt(i); 
     } 
      } 
for (var i:int = killerarray.length-1; i >= 0; i--){ 
    if (runner.hitTestObject(killerarray[i])){ 
     health--; 
     killerarray.removeAt(i); 
     sign1.x-=40; 
     tip1.x-=40; 
     bg.x-=40; 
     secretmessage.x-=40; 
     healthbottle1.x-=40; 
     killer.x-=40; 
     killer2.x-=40; 
     killer3.x-=40; 
     platform.x-=40; 
    } 
} 
    if (bg.x>327) 
    { 
     sign1.x-=40; 
     tip1.x-=40; 
     bg.x-=40; 
     secretmessage.x-=40; 
     healthbottle1.x-=40; 
     killer.x-=40; 
     killer2.x-=40; 
     killer3.x-=40; 
     platform.x-=40; 
    } 
} 

结果: 它是一种警告,并在输出面板中的另一个错误.. 警告3596:重复的变量定义。 OUTPUT PANEL:TypeError:错误#1006:removeAt不是函数。 在ObstacleCourse_fla :: MainTimeline /环路()

请帮助如何解决

FOR NEAL DAVIS我使用Flash播放器11.2 r2o2

请大家注意,这是不整个脚本

+0

如果您使用的是Flash Player,则使用哪个版本?这是一个Air应用程序吗?要使用removeAt,您需要Flash播放器19或更高版本或Air 19或更高版本。如果您使用的是旧版本,请根据我对此的评论进行升级或使用'.splice'。 –

回答

0

要使用我谈论的评论方法:

比方说,你有3个保健瓶叫healthbottle1

var hBottleArray:Array = [healthbottle1,healthbottle2,healthbottle3]; 

那么你的游戏主循环内:

for (var i:int = hBottleArray.length-1; i >= 0; i--){ 
    if (character.hitTest(hBottleArray[i])){ 
     health++; 
     // any code you want to execute for when a health bottle is picked up 
     hBottleArray.removeAt(i);//this removes the bottle from the array so it doesn't get checked again. This will stop your continued health increase. 
    } 
} 

for (var的部分是“for循环”的开始。你可以谷歌。另一个技巧是使用数组。 Google也是如此。

+0

所以你告诉我,for(var是循环开始本身?如果是的话,我是否必须把它放在我所制作的游戏循环中?我不必,对吧?我只能在阵列中使用一个元素吗?我有很多问题,但我认为健康 - 会减少数量,而不会增加...我是否必须删除我的生物瓶gameloop?我现在有一个混合起来的大脑..对不起!再次! – Oran153

+0

是把它放在游戏循环中 –

+0

是的,你可以有一个只有1的数组 –

1

不要使用visible属性,因为这不会消除瓶子或敌人(它仍然存在,导致脚本触发每一帧,你只是看不到它)

而不是使用healthbottle1.parent.removeChild(healthbottle1);或沿着这些线路。

这是做什么是从称为显示列表中删除对象。谷歌“AS3显示列表”的更多信息。

你可以对杀手做同样的事情,但我认为你不希望它们在击中玩家后消失。相反,您可以使用某种反击技能立即将玩家放回(足够的像素以使敌人停止击中他),或者让玩家在1秒或2秒内无敌。许多游戏都实现了这种类型的机制(经典的是在无敌期间使角色闪现的视觉效果)。如果您选择其中一种方法,请尝试一下,让我们知道您是否卡住了。祝你好运。

+0

尼尔戴维斯我不知道该怎么做当玩家击中杀手时的无敌/无懈可击的部分...对不起,但我可以问,如何? – Oran153

+0

我也使用removechild的东西,并在输出面板中出现这样:TypeError:错误#1009:无法访问空对象引用的属性或方法。 \t在ObstacleCourse_fla :: MainTimelineline/loop() 而且它仍然不断增加健康no – Oran153

+0

您的.visible部分按照您的意图工作吗?它消失了吗? –

0

Ok @Neal davis我只是把这个瓶子拿出舞台而杀手没有阵列,所以感谢你的帮助! 我宁愿在未来学习未来的答案(Duh xD)并搜索它们,所以我会避免在这里提出很多问题在stackoverflow ...但它也有用的人回答这个问题... XD谢谢!