Flash 执行循环 - 每次命中仅带走一次健康
Flash execution looping - only take health away once per hit
我是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:重复的变量定义。
输出 PANEL:TypeError:错误 #1006:removeAt 不是函数。
在 ObstacleCourse_fla::MainTimeline/loop()
求助如何解决
FOR NEAL DAVIS 我使用 flash player 11.2 r2o2
请注意,这不是我的整个脚本
不要使用visible
属性因为这不会移除瓶子或敌人(它仍然存在,导致脚本触发每一帧,你只是看不到它)
而是使用 healthbottle1.parent.removeChild(healthbottle1);
或类似的东西。
这样做的目的是从称为显示列表的东西中删除对象。 Google "AS3 display list" 了解更多信息。
你可以对杀手做同样的事情,但我想你不希望他们在击中玩家一次后消失。因此,您可以采用某种反冲机制,立即让玩家后退(足够的像素让敌人停止攻击他),或者让玩家在 1 秒或 2 秒内处于无敌状态。许多游戏都实现了这种类型的机制(经典的是在无敌时期使角色闪现的视觉耀斑)。如果您选择其中一种方法,请尝试一下,如果遇到困难,请告诉我们。祝你好运。
要使用我在评论中所说的方法:
假设您有 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 loop"的开始。你可以 google 那个。这里的另一个技巧是使用数组。 Google 那也是。
好的@Neal davis 我只是把瓶子放在舞台上,杀手没有阵列也很好,所以谢谢你的帮助!
我宁愿在未来学习未来的答案 (Duh xD) 并搜索它们,这样我就可以避免在 Whosebug 中被问到很多问题……但它对人们回答这个问题也很有用……XD 谢谢!
我是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:重复的变量定义。 输出 PANEL:TypeError:错误 #1006:removeAt 不是函数。 在 ObstacleCourse_fla::MainTimeline/loop()
求助如何解决
FOR NEAL DAVIS 我使用 flash player 11.2 r2o2
请注意,这不是我的整个脚本
不要使用visible
属性因为这不会移除瓶子或敌人(它仍然存在,导致脚本触发每一帧,你只是看不到它)
而是使用 healthbottle1.parent.removeChild(healthbottle1);
或类似的东西。
这样做的目的是从称为显示列表的东西中删除对象。 Google "AS3 display list" 了解更多信息。
你可以对杀手做同样的事情,但我想你不希望他们在击中玩家一次后消失。因此,您可以采用某种反冲机制,立即让玩家后退(足够的像素让敌人停止攻击他),或者让玩家在 1 秒或 2 秒内处于无敌状态。许多游戏都实现了这种类型的机制(经典的是在无敌时期使角色闪现的视觉耀斑)。如果您选择其中一种方法,请尝试一下,如果遇到困难,请告诉我们。祝你好运。
要使用我在评论中所说的方法:
假设您有 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 loop"的开始。你可以 google 那个。这里的另一个技巧是使用数组。 Google 那也是。
好的@Neal davis 我只是把瓶子放在舞台上,杀手没有阵列也很好,所以谢谢你的帮助! 我宁愿在未来学习未来的答案 (Duh xD) 并搜索它们,这样我就可以避免在 Whosebug 中被问到很多问题……但它对人们回答这个问题也很有用……XD 谢谢!