如何在AS2.0中同时测试几个对象?

时间:2013-08-03 18:57:53

标签: flash object actionscript-2 hittest

所以我在AS2.0上制作游戏,你可以控制一个你可以移动的方格,你不应该碰到任何一个墙壁,否则关卡会重置,你会回到初始位置。我已经设法做到了,但我必须为每一面墙制作一个If,当我达到更高的水平时,即使我复制/粘贴,它也将是一项永恒的工作。有没有办法同时测试几个物体? 谢谢 如果你需要它,这是我的代码: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的行动中制作的。

1 个答案:

答案 0 :(得分: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加载到另一个,或者转移到AS3,那里根本不存在_root)。