我正在写一个你必须经历迷宫的游戏。我希望这个游戏有不同的水平。但对于每个级别,迷宫将会有所不同。所以我画了其他墙。但如果我有50个不同的等级,我不想写我的碰撞检测方法50次。
我想到了修复它的方法,但它没有用。我创建了一个没有任何内容的新符号,并将其命名为wall。我想我可以让我的墙= wall1(我转换的另一个符号,并导出为),然后只做stage.addChild(墙)。但我找不到办法做到这一点。所以我需要帮助!
答案 0 :(得分:0)
制作一个通用类,例如Wall
并使您的库符号将其用于其基类。您不需要在运行时使用ActionScript创建它们以使此继承有效,您仍然可以将MovieClip放在舞台上。
接下来你要做的就是将这些墙存放在某个地方。由于您似乎对ActionScript缺乏经验,并且希望避免为新级别编写代码,因此可以使用管理器类型类自动执行此过程。我们将此类称为WallManager
,它将如下所示:
public class WallManager
{
private static var _walls:Vector.<Wall> = new <Wall>[];
internal static function register(wall:Wall):void
{
_walls.push(wall);
}
public static function reset():void
{
_walls = new <Wall>[];
}
public static function get walls():Vector.<Wall>{ return _walls; }
}
然后我们将创建您的Wall
课程。在此类的构造函数中,我们将自动将Wall添加到WallManager
列表中:
public class Wall extends Sprite
{
public function Wall()
{
WallManager.register(this);
}
public function touchingMouse(mouseX:int, mouseY:int):Boolean
{
// For this example I am checking for collisions with the
// mouse pointer. Replace this function with your own collision
// logic for whatever it is that is supposed to collide with
// these walls.
if(parent === null) return false;
var bounds:Rectangle = getBounds(parent);
return bounds.contains(mouseX, mouseY);
}
}
此设置不是最佳做法,但它适用于您的情况,因为您的项目看起来很小,您似乎只是单独工作,它很简单,它可以得到工作完成。
在每个级别结束时,使用WallManager.reset()
删除上一级别的墙。要检查所有墙壁的碰撞,只需使用如下的循环:
for each(var i:Wall in WallManager.walls)
{
var collision:Boolean = i.touchingMouse(mouseX, mouseY);
if(collision)
{
// There was a collision.
//
//
}
}
答案 1 :(得分:0)
您可以制作一个包含50帧的MovieClip,在第一帧上显示stop()
并执行以下代码:
private var wallnum:int;
public function Main()
{
stop();
wallnum = 1;
var wallobj = new Wall();
addChild(wallobj);
wallobj.gotoAndStop(wallnum);
}
对于碰撞检测,我建议使用Pixel Perfect Collision Detection(https://code.google.com/p/master-air-controller/source/browse/trunk/master-air-controller/src/PixelPerfectCollisionDetection.as?spec=svn6&r=6)