ActionScript 3:字符命中测试对象,所有对象都在数组中
Posted
技术标签:
【中文标题】ActionScript 3:字符命中测试对象,所有对象都在数组中【英文标题】:ActionScript 3 : character hit test object with all objects in array 【发布时间】:2017-10-11 15:55:45 【问题描述】:首先感谢您对阅读此问题的任何人的关注
我是印度尼西亚人,如果我的英语不好,请见谅。
我目前正在一个学校项目中使用 Flash ActionScript 3 或 Unity 创建触摸屏 android 游戏,我当前的项目是使用 Flash 和 ActionScript 3 制作的。我目前的工作是一个类似于 Feeding Frenzy 的游戏,其中涉及一名女性潜水员将消灭掉入水下的鱼弹。
我正试图让潜水员警告屏幕上的所有炸弹。我有一个 BombsLayer 类,它将调用一个 RegularBomb 类以随机 x 位置。所有RegularBomb实例都被放入一个数组中,然后我使用hitTestObject进行每个循环,因此如果潜水员击中movieclip内的透明圆圈,则会出现一个感叹号并将潜水员类中的readyToDefuse布尔值设置为true,并且当潜水员是远离炸弹,布尔值将设置为假,感叹号将消失。
我的问题是潜水员只能与数组中的最后一个炸弹影片剪辑实例进行交互。当第一个炸弹子添加到数组中并且潜水员到达它时,会出现感叹号,但是每次实例化新炸弹时,感叹号都会消失,我必须让潜水员移动到实例化的新炸弹以制作标志出现。
我已阅读有关此问题的建议:AS3 - array hit test in 'for each' loop only works properly with last object in array 删除 for each 循环中的 else 语句,但删除它将使 readyToDefuse 保持为 True 并且感叹号仍然出现。
我已经进行了谷歌搜索,但似乎没有任何问题可以解决我的问题,我必须在一周内完成这个游戏直到演示,这让我在过去的几天里感到困惑..
这是我的 Bombslayer 类的完整代码:
package
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.Event;
public class BombsLayer extends MovieClip
public var area:Sprite;
public var bombs:Array;
public var bomb:RegularBomb;
public var bombground:BombGround;
public var diver:Diver;
public var warner:BombWarn;
public function BombsLayer(character:Diver, warn:BombWarn)
// constructor code
area = new Sprite();
area.graphics.beginFill(000000, 0);
area.graphics.drawRect(0,0,2200,720);
area.graphics.endFill();
addChild(area);
diver = character;
warner = warn;
bombs = new Array();
var newBomb = new RegularBomb(Math.random()*area.width, diver, warner);
bombs.push(newBomb)
addChild(newBomb);
bombground = new BombGround(0, 670, this);
addChild(bombground);
this.addEventListener(Event.ENTER_FRAME, moveBomb);
function moveBomb(event:Event)
if(Math.random() <= 0.0005)
var newBomb = new RegularBomb(Math.random()*area.width, diver, warner);
bombs.push(newBomb)
addChild(newBomb);
for each(var bomb:RegularBomb in bombs)
bomb.moveDown();
if(diver.hitTestObject(bomb))
warner.visible = true;
diver.readyToDefuse = true;
else
warner.visible = false;
diver.readyToDefuse = false;
如果需要我也可以上传完整的项目..
所有帮助将不胜感激。 谢谢!
【问题讨论】:
【参考方案1】:逻辑错了。您需要浏览炸弹并找到与潜水员接触的炸弹(如果有),并使用唯一的炸弹。否则,潜水员准备好拆除炸弹 A,但还没有准备好拆除 B、C 和 D,因此根本没有准备好。
function moveBomb(event:Event)
var aBomb:RegularBomb;
if (Math.random() <= 0.0005)
aBomb = new RegularBomb(Math.random() * area.width, diver, warner);
bombs.push(aBomb)
addChild(aBomb);
for each(aBomb in bombs) aBomb.moveDown();
// Find bomb in diver's vicinity.
aBomb = findBomb();
// The same as "if (aBomb != null)"
if (aBomb)
warner.visible = true;
diver.readyToDefuse = true;
else
warner.visible = false;
diver.readyToDefuse = false;
function findBomb():RegularBomb
for each(var aBomb:RegularBomb in bombs)
if (diver.hitTestObject(aBomb))
return aBomb;
return null;
【讨论】:
有效!!实际上这只是开始,对于每个炸弹到达并且用户按住一个拆弹按钮,炸弹位置的指示器将充电,当它充满时,炸弹子将消失并且炸弹子将从阵列中移除..还有,不仅是炸弹,我还想与鲨鱼、水母、海蛇和河豚等危险的海洋生物进行同样的互动,但不是被警告,而是当潜水员击中其中一个时,潜水员的健康点会降低。我必须这样做吗?顺便说一句,非常感谢!! @AzmiFarhan 不,即时命中的逻辑会有所不同。笼统地考虑一下。潜水员应该挑选一颗炸弹并准备拆除它。然后,无论有多少鱼,任何危险的鱼都会立即伤害潜水员。 那么我应该使用我之前的逻辑来解决问题吗? 或者我的意思是通过使用相同的逻辑,只在 if 语句中使用不同的表达式来检查 find 函数的输出? @AzmiFarhan 请不要让我为你考虑。当然,我可以编写你想要编写的所有脚本,但有什么意义呢?是你自己必须尝试尽可能多地尝试自己解决它,然后你就会学到一些关于算法的东西。以上是关于ActionScript 3:字符命中测试对象,所有对象都在数组中的主要内容,如果未能解决你的问题,请参考以下文章
ActionScript 3 AS3 CSS颜色(字符串)到RGB颜色(对象)
Actionscript 3 - 将 yyyy-mm-dd hh:mm:ss 解析为 Date 对象的最快方法?
命中测试位于 SuperView 边界之外的 UIButton
Actionscript:如何创建一个计数器来注册一个 hitTestObject 并在主舞台上显示分数?