-1

所以我在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的行动而做出的。

4

1 回答 1

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 根本不存在)。

于 2013-08-05T02:51:46.937 回答