【问题标题】:How to HitTest several objects at the same time in AS2.0?如何在 AS2.0 中同时对多个对象进行 HitTest?
【发布时间】:2013-08-03 18:57:52
【问题描述】:

所以我在 AS2.0 上制作了一个游戏,你可以控制一个可以移动的方格,并且你不应该接触任何墙壁,否则关卡会重置并且你会回到初始位置。我已经做到了,但是我必须为每面墙做一个如果,当我达到更大的水平时,这将是一项永恒的工作,即使我复制/粘贴。有什么方法可以同时测试多个对象吗? 谢谢 如果您需要,这是我的代码:D

on(keyPress "<Left>") {
    this._x -= 5;
}
on(keyPress "<Right>") {
    this._x += 5;
}
on(keyPress "<Down>") {
    this._y += 5;
}

on(keyPress "<Up>") {
    this._y -= 5;
}
onClipEvent(EnterFrame) {
    if (_root.square.hitTest(_root.wall)) {
        _root.touch._Alpha = 100;
        this._x = _root.x0;
        this._y = _root.y0;
    }
    if (_root.square.hitTest(_root.wall1)) {
        _root.touch._Alpha = 100;
        this._x = _root.x0;
        this._y = _root.y0;
    }
    if (_root.square.hitTest(_root.wall2)) {
        _root.touch._Alpha = 100;
        this._x = _root.x0;
        this._y = _root.y0;
    }
    if (_root.square.hitTest(_root.goal)) {
        _root.gotoAndStop(3);
    }
}

它是根据 Square 的动作制作的。

【问题讨论】:

    标签: flash object actionscript-2 hittest


    【解决方案1】:

    如果您曾经复制和粘贴大量差异很小的代码,您很有可能可以将其缩短并将其放入循环中(重复复制和粘贴代码可能是出现问题的警告信号=b)。

    不,您不能同时“精确”检查所有内容,但您可以使用循环来解决您的 if 语句问题。将所有的墙上动画剪辑粘贴到一个数组(或可循环的东西)中,然后循环遍历它。

    上述代码的循环版本示例如下:

    // create an array and add a reference to all your wall clips
    var collidableWalls:Array = new Array();
    collidableClips.push(_root.wall);
    collidableClips.push(_root.wall1;
    collidableClips.push(_root.wall2);
    

    然后在创建数组后,您可以通过以下方式检查每面墙的 hitTest:

    for(var counter:Number = 0; counter < collidableClips.length; counter++){
        if (_root.square.hitTest(collidableClips[counter])) {
            _root.touch._Alpha = 100;
            this._x = _root.x0;
            this._y = _root.y0;
        }
    }
    

    目前,您仍然需要单独处理“_root.goal”,因为它有不同的反应。

    if (_root.square.hitTest(_root.goal)) {
        _root.gotoAndStop(3);
    }
    

    不要在 onClipEvent (EnterFrame) 方法中创建数组,因为它会导致每个帧都创建数组,从而导致一些开销。最好把它放在某个地方,以便它只创建一次(见建议)。此外,还可以通过以下方式动态引用影片剪辑:

    _root["wall" + 1]
    

    这将与

    相同
    _root.wall1
    

    考虑到这一点,如果您所有的墙夹都命名相同(带有前缀“墙”和一个数字),您可以执行以下操作:

    for(var counter:Number = 1; counter < 3; counter++){
        collidableClips.push(_root["wall" + counter]);
    }
    

    仅添加 2 堵墙就有点过头了,但如果你有几百堵墙,那会很有帮助 (你也可以跳过使用数组直接比较)。

    现在有一些(当然是固执己见的)建议:我将不再使用“onClipEvent”,而是尽快将代码放在 moveiclips 上。如果您的代码到处都是,它会使您的代码在以后组织起来非常困难。此外,您可能会遇到参考问题,并对您的代码到底在哪些剪辑上感到困惑(尤其是在调试时,您有很多剪辑时)。我建议改为使用“框架脚本”(我认为这是“下一步”)。

    以后,在可能的情况下,最好避免使用 _root。依赖它的习惯可能会导致很多问题(例如,如果您开始将 swfs 加载到另一个文件中,或者迁移到根本不存在 _root 的 AS3)。

    【讨论】:

    • 不错!谢谢。顺便说一句,在某些情况下,我不得不使用 _root,因为例如,帧切换和命中测试会发生冲突。此外,我发现“绝对‘有意见’的建议”非常有帮助:D
    猜你喜欢
    • 1970-01-01
    • 2021-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    • 2013-06-01
    • 1970-01-01
    相关资源
    最近更新 更多