【问题标题】:flash cc createjs hittest works without hitflash cc createjs hittest 可以正常工作
【发布时间】:2017-01-26 00:09:50
【问题描述】:

一旦圆圈接触到 rect , rect 应该是 alpha=0.1 。但如果语句不起作用。它变成 0.1 的不透明度而没有命中

/* js

var circle = new lib.mycircle();
stage.addChild(circle);

var rect = new lib.myrect();
stage.addChild(rect);
rect.x=200;
rect.y=300;

circle.addEventListener('mousedown', downF);
function downF(e) {
stage.addEventListener('stagemousemove', moveF);
stage.addEventListener('stagemouseup', upF);
};
function upF(e) {

stage.removeAllEventListeners();
}
function moveF(e) {
circle.x = stage.mouseX;
circle.y = stage.mouseY;
}

if(circle.hitTest(rect))
{
  rect.alpha = 0.1;

}
stage.update();
*/

【问题讨论】:

  • 在这个演示中,hitTest 只运行一次(在开始时)。这是故意的吗?
  • 另外,您使用的是什么版本的 CreateJS? /*js */ 代码语法来自相当老的 CreateJS Toolkit 版本(与支持 JavaScript 代码的 Flash/Animate HTML5 文档格式相比)
  • 我更新了最新的托管库。没有任何问题 。但意图是使代码“当圆接触矩形时,矩形应该变为 alpha 0.1。
  • 请注意 CreateJS 中的 hitTest 只是基于点的。它会告诉你一个特定的点是否击中了一个物体。如果您想要基于形状的碰撞,则必须构建它,或使用 Box2D (demo) 之类的东西

标签: createjs


【解决方案1】:

您使用 hitTest 的方式不正确。 hitTest 方法不检查对象到对象。它采用 x 和 y 坐标,并确定该点 在其自己的坐标系中是否具有填充像素。

我修改了您的示例以使其更正确,尽管它实际上并没有达到您的预期:

circle.addEventListener('pressmove', moveF);
function moveF(e) {
    circle.x = stage.mouseX;
    circle.y = stage.mouseY;
    if (rect.hitTest(circle.x, circle.y)) {
        rect.alpha = 0.1;
    } else {
        rect.alpha = 1;
    }
    stage.update();
}

关键点:

  • 重新引入了pressmove。效果很好。
  • 将圆圈更新移到 上方 hitTest 检查。否则,您正在检查它的位置 上次
  • 将阶段更新移至最后。它应该是您更新的最后一件事。但是请注意,您可以完全删除它,因为您的 HTML 文件中的舞台上有一个 Ticker 侦听器,它会不断更新舞台。
  • 添加了 else 语句,如果 hitTest 失败,则将 alpha 转回 1。

然后,最重要的一点是我将 hitTest 改为在矩形上。这实质上是说:“在提供的 x 和 y 位置在矩形内处是否有填充像素?”由于矩形边界是-49.4, -37.9, 99, 76,当圆的坐标在这些范围内时,这将是正确的——也就是它位于画布的左上角。如果你用我的代码替换你的代码,你会看到这种行为。

因此,要让它更按您的意愿工作,您可以做一些事情。

  1. 变换你的坐标。使用 localToGlobal,或者只是作弊并使用localToLocal。这会将[0,0] 放入圆圈中,并将该坐标转换为矩形的坐标空间。

例子:

var p = rect.localToLocal(0, 0, circle);
if (rect.hitTest(p.x, p.y)) {
    rect.alpha = 0.1;
} else {
    rect.alpha = 1;
}
  1. 不要使用 hitTest。使用getObjectsUnderPoint,传递圆的x/y坐标,检查矩形是否在返回列表中。

希望对您有所帮助。正如我在上面的评论中提到的,您不能进行全形状碰撞,只能进行点碰撞(对象上的单个点)。

【讨论】:

    猜你喜欢
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    • 2017-05-10
    • 2014-11-27
    • 1970-01-01
    • 1970-01-01
    • 2020-06-11
    • 1970-01-01
    相关资源
    最近更新 更多