AS3 如何对具有相同实例名称的多个影片剪辑进行 hitTest?
AS3 How to hitTest with multiple Movie Clips of the same Instance Name?
大家好,我的 platforms
电影剪辑中有一个名为 mcTaco
的电影剪辑,所以 platforms.mcTaco
。我使用代码将我检查 hitTest 碰撞的 platforms
和 player
添加到舞台上。当我检查 player
和 platforms.mcTaco
collison 时,一切正常。当我复制 mcTaco
在 platforms
电影片段中创建它们的多个实例时,我遇到了主要问题。
我知道我必须将它们添加到数组并使用 for 循环来检查多个 platforms.mcTaco
实例的 hitTest,但我不知道如何完成此操作。我正在为我的代码使用 IDE Flash Develop,这是我目前所拥有的:
我像这样将我的平台添加到舞台上:
//ADD PLATFORMS AND ENVIRONMENT
private function addPlatForms():void
{
//Add Obstacle Platforms
platforms = new mcPlatforms();
platforms.x = (stage.stageWidth / 2) - 80;
platforms.y = (stage.stageHeight / 2) + 165;
addChildAt(platforms, 1);
aPlatformArray.push(platforms);
//trace(aPlatformArray.length + " NPLATFORMS");
}
我的播放器:
//Add Character
player = new mcPlayer();
player.x = (stage.stageWidth / 2) - 80;
player.y = (stage.stageHeight / 2) + 78;
addChildAt(player, 1);
在我的 ENTER_FRAME 事件监听器中,我这样做是为了测试 player
和 platforms.mcTaco
hitTest,就像这样:
private function tacoHitTestHandler():void
{
if (player.hitTestObject(platforms.mcTaco))
{
platforms.mcTaco.visible = false;
trace("HIT TACO");
}
}
我只是需要一些帮助来弄清楚如何去做这件事。我实例化了我的 Taco Arrayprivate var aTacoArray:Array;
,但我不知道如何将 platforms.mcTaco
影片剪辑推入其中以使用 for 循环对其进行测试。任何有关如何执行此操作的帮助将不胜感激。我只是不想做 if (player.hitTestObject(platforms.mcTaco1) || player.hitTestObject(platforms.mcTaco2) etc...)
您需要在每个平台内循环子项,以通过他们的 class or/and 名称获取所有炸玉米饼。
private function tacoHitTestHandler():void
{
// Loop through the list of the platforms.
for (var i:int = 0; i < aPlatformArray.length; i++)
{
// Get a platform instance from the Array.
var aPlatform:mcPlatforms = aPlatformArray[i];
// Loop through the children of a platform.
for (var j:int = 0; j < aPlatform.numChildren; j++)
{
// Get a potential taco.
var aTaco:mcTaco = aPlatform.getChildAt(j) as mcTaco;
// Skip if it is not a taco.
if (!aTaco) continue;
// Ignore invisible objects.
if (!aTaco.visible) continue;
// Ignore wrong tacos by name.
if (aTaco.name != "mcTaco") continue;
// Hit test against taco.
if (player.hitTestObject(aTaco))
{
aTaco.visible = false;
trace("HIT TACO");
}
}
}
}
一些注意事项。
首先,调用 class mcTaco 并给出相同的实例名称 mcTaco 令人头疼,因为有时如果您引用的是已声明实例的 class,那么您的代码将无法确定。
其次,用大写首字母称呼您的 classes,因为这样很好。一个不错的苏格兰 McTaco 就足够了。
您将 taco 推送到 aTacoArray 的方式与您在平台上执行的方式相同:
aTacoArray.push(myTacoMC);
然后你可以遍历它们并测试每个碰撞:
private function tacoHitTestHandler():void
{
for(var i:int = 0; i < aTacoArray.length; i++)
{
// get taco from array
var currentTaco:MovieClip = aTacoArray[i];
if (player.hitTestObject(currentTaco))
{
currentTaco.visible = false;
trace("HIT TACO");
}
}
}
大家好,我的 platforms
电影剪辑中有一个名为 mcTaco
的电影剪辑,所以 platforms.mcTaco
。我使用代码将我检查 hitTest 碰撞的 platforms
和 player
添加到舞台上。当我检查 player
和 platforms.mcTaco
collison 时,一切正常。当我复制 mcTaco
在 platforms
电影片段中创建它们的多个实例时,我遇到了主要问题。
我知道我必须将它们添加到数组并使用 for 循环来检查多个 platforms.mcTaco
实例的 hitTest,但我不知道如何完成此操作。我正在为我的代码使用 IDE Flash Develop,这是我目前所拥有的:
我像这样将我的平台添加到舞台上:
//ADD PLATFORMS AND ENVIRONMENT
private function addPlatForms():void
{
//Add Obstacle Platforms
platforms = new mcPlatforms();
platforms.x = (stage.stageWidth / 2) - 80;
platforms.y = (stage.stageHeight / 2) + 165;
addChildAt(platforms, 1);
aPlatformArray.push(platforms);
//trace(aPlatformArray.length + " NPLATFORMS");
}
我的播放器:
//Add Character
player = new mcPlayer();
player.x = (stage.stageWidth / 2) - 80;
player.y = (stage.stageHeight / 2) + 78;
addChildAt(player, 1);
在我的 ENTER_FRAME 事件监听器中,我这样做是为了测试 player
和 platforms.mcTaco
hitTest,就像这样:
private function tacoHitTestHandler():void
{
if (player.hitTestObject(platforms.mcTaco))
{
platforms.mcTaco.visible = false;
trace("HIT TACO");
}
}
我只是需要一些帮助来弄清楚如何去做这件事。我实例化了我的 Taco Arrayprivate var aTacoArray:Array;
,但我不知道如何将 platforms.mcTaco
影片剪辑推入其中以使用 for 循环对其进行测试。任何有关如何执行此操作的帮助将不胜感激。我只是不想做 if (player.hitTestObject(platforms.mcTaco1) || player.hitTestObject(platforms.mcTaco2) etc...)
您需要在每个平台内循环子项,以通过他们的 class or/and 名称获取所有炸玉米饼。
private function tacoHitTestHandler():void
{
// Loop through the list of the platforms.
for (var i:int = 0; i < aPlatformArray.length; i++)
{
// Get a platform instance from the Array.
var aPlatform:mcPlatforms = aPlatformArray[i];
// Loop through the children of a platform.
for (var j:int = 0; j < aPlatform.numChildren; j++)
{
// Get a potential taco.
var aTaco:mcTaco = aPlatform.getChildAt(j) as mcTaco;
// Skip if it is not a taco.
if (!aTaco) continue;
// Ignore invisible objects.
if (!aTaco.visible) continue;
// Ignore wrong tacos by name.
if (aTaco.name != "mcTaco") continue;
// Hit test against taco.
if (player.hitTestObject(aTaco))
{
aTaco.visible = false;
trace("HIT TACO");
}
}
}
}
一些注意事项。
首先,调用 class mcTaco 并给出相同的实例名称 mcTaco 令人头疼,因为有时如果您引用的是已声明实例的 class,那么您的代码将无法确定。
其次,用大写首字母称呼您的 classes,因为这样很好。一个不错的苏格兰 McTaco 就足够了。
您将 taco 推送到 aTacoArray 的方式与您在平台上执行的方式相同:
aTacoArray.push(myTacoMC);
然后你可以遍历它们并测试每个碰撞:
private function tacoHitTestHandler():void
{
for(var i:int = 0; i < aTacoArray.length; i++)
{
// get taco from array
var currentTaco:MovieClip = aTacoArray[i];
if (player.hitTestObject(currentTaco))
{
currentTaco.visible = false;
trace("HIT TACO");
}
}
}