所以我在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的行动中制作的。
答案 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)。