【问题标题】:hittest wont work as3hittest 不能作为 3
【发布时间】:2014-06-01 19:31:15
【问题描述】:

好的,我有一个小问题。我有两个对象(每个对象中有两个不可见的按钮),第一个对象称为“crveno”,第二个对象称为“zeleno”。 “zeleno”有hittest area,叫做“zlhit”,“crveno”有hittest area,叫做“chit”,都是按钮。

我还有 4 个具有相似命中测试的对象,都可以。

这对于 zeleno 和 crveno 来说是最热门的。我想 zeleno 回到它的起始位置,当它击中 crveno.chit 时,但它不起作用。它停留在当前位置,并且 crveno 进入起始位置。另一方面, crveno 的 hittest 有效。这是来自两个命中测试的代码。

else if (zeleno.zlhit.hitTestObject(crveno.chit))
{
    crveno.x = crveno.x;
    crveno.y = crveno.y;
    zeleno.x = zelenoStartX;
    zeleno.y = zelenoStartY;

}


else if (crveno.chit.hitTestObject(zeleno.zlhit))
{
    zeleno.x = zeleno.x;
    zeleno.y = zeleno.y;
    crveno.x = crvenoStartX;
    crveno.y = crvenoStartY;
}

【问题讨论】:

  • 当crveno和zeleno的位置发生变化时,它们所包含的按钮的位置是否也发生了变化?
  • 是的,它们是“固定”到对象上的。
  • 我不确定是否有人指出了这一点,但是像crveno.x = crveno.x; 这样的表达式是多余的。
  • 是的,我知道,但是……没有它就不行……不知道为什么……

标签: actionscript-3 hittest


【解决方案1】:

你有两个不同的测试,实际上是相同的条件,即。两个实例的命中区域相交。因此,当 hittest 为这两个实例返回 true 时,第一个 else if 条件将始终执行,并且您的代码将永远不会到达第二个 else if

如果不了解更多有关您要做什么的信息,很难就如何解决问题提供建议,但是如果您希望两个对象在它们相交时返回到起始位置,您可以将其合并为一个有条件的:

// When crveno and zeleno hit, return both to their start positions
else if (zeleno.zlhit.hitTestObject(crveno.chit))
{
    crveno.x = crvenoStartX;
    crveno.y = crvenoStartY;
    zeleno.x = zelenoStartX;
    zeleno.y = zelenoStartY;

}

【讨论】:

  • 好的,但是,它适用于任何其他对象(代码相同,或多或少)。
【解决方案2】:

由于您提到 crveno 确实会更改位置,因此我假设包含按钮的对象会在对象的位置更改时更新按钮的位置。如果不是这种情况,那么按钮不随容器对象改变位置可能是问题所在。

否则,似乎任何时候 zlhit 与 chit 重叠,我都希望反之亦然。由于您的代码包含 else if 语句,因此只有第一个为 true 的条件才会触发。如果您的目标是每个对象在其按钮重叠时移回其起始位置,那么您可以尝试以下操作:

if (zeleno.zlhit.hitTestObject(crveno.chit) &&
    crveno.chit.hitTestObject(zeleno.zlhit)) //this 2nd collision check is probably unnecessary
{
    crveno.x = crvenoStartX;
    crveno.y = crvenoStartY;
    zeleno.x = zelenoStartX;
    zeleno.y = zelenoStartY;
}

【讨论】:

  • 如果问题出在哪里,您认为其他方式是什么?按钮确实会改变位置,这是我检查的第一件事。
  • 使用您提供的代码,“else if”问题是我最好的猜测。
  • 好的,谢谢。还有一个问题。 “案例”能解决问题吗?我可以试试。
  • 这行得通!!!使用“如果”,如: if (zeleno.zlhit.hitTestObject(crveno.chit)) { zeleno.x = zelenoStartX; zeleno.y = zelenoStartY; } if (crveno.chit.hitTestObject(zeleno.zlhit)) { crveno.x = crvenoStartX; crveno.y = crvenoStartY; }
  • 这是相同的条件,只是表达方式不同(相反),所以两个 if 条件现在都测试为真。你现在得到的实际上和我发布的代码一样,除了你有一个不必要的命中测试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-15
相关资源
最近更新 更多