我在Flash和AS3的小型射击游戏中工作。我仍然开始使用类文档,但我理解感谢教程。 所以这里是如何工作的: 当Enemy MovieClip击中用户射击的子弹时,我使用了HitTestObject:
//checking if it is touching any bullets
//we will have to run a for loop because there will be multiple bullets
for(var i:int = 0;i<_root.bulletContainer.numChildren;i++){
//numChildren is just the amount of movieclips within
//the bulletContainer.
//we define a variable that will be the bullet that we are currently
//hit testing.
var bulletTarget:MovieClip = _root.bulletContainer.getChildAt(i);
//now we hit test
if(hitTestObject(bulletTarget)){
hit++;
if(hit==4)
{
gotoAndPlay(4); //the Enemy MC is removed after 4 hits(parent.removeChild(this))
removeEventListener(Event.ENTER_FRAME, eFrame);
//the Bullet MC is removed with its Listeners
_root.bulletContainer.removeChild(bulletTarget);
bulletTarget.removeListeners();
}
if(hit<4)
{
gotoAndPlay(2);
_root.bulletContainer.removeChild(bulletTarget);
bulletTarget.removeListeners();
}
if(hit > 4)
{
_root.bulletContainer.removeChild(bulletTarget);
bulletTarget.removeListeners();
hit = 0;
}
}
}
因此在4次点击之后,它完全从屏幕上移除。 eFrame功能会删除Enemy MC,如果它离开舞台:
private function eFrame (event:Event):void{
x+=speed;
if(this.x > stage.stageWidth + 50){
removeEventListener(Event.ENTER_FRAME, eFrame);
_root.removeChild(this);
}
}
我还发出一个命令来检测Enemy MC和玩家之间的碰撞(我给了&#34; craft&#34;实例名称):
if(hitTestPoint(_root.craft.x -203.25, _root.craft.y - 44.9, collide))
{
_root.dmg.width+=8;//reduce the life bar
removeEventListener(Event.ENTER_FRAME, eFrame);
gotoAndPlay(4);
}
if(hitTestPoint(_root.craft.x -210.6, _root.craft.y - 32.9, collide))
{
_root.dmg.width+=8;
removeEventListener(Event.ENTER_FRAME, eFrame);
gotoAndPlay(4);
}
if(hitTestPoint(_root.craft.x -210.6, _root.craft.y - 6, collide))
{
_root.dmg.width+=8;
removeEventListener(Event.ENTER_FRAME, eFrame);
gotoAndPlay(4);
}
if(hitTestPoint(_root.craft.x -211.4, _root.craft.y + 20, collide))
{
_root.dmg.width+=8;
removeEventListener(Event.ENTER_FRAME, eFrame);
gotoAndPlay(4);
}
...//There is a lot of other points with the same results...
因此,如果敌人MC击中了手法MC(玩家),它也会被移除。但是我遇到了一个问题:当Enemy MC被击中时(4次被Bullet影片剪辑&#34;镜头&#34;被用户删除它)但相撞 由玩家它不会被移除,因为它应该是...... 它仍然显示在屏幕上,并且是静态的:它既不会被子弹MC击中,也不会被玩家MC击中......
我认为这是因为parent.removeChild(this)
从敌人MC的gotoAndPlay(4)
执行,导致该问题:执行两次(因为Enemy MC是被子弹MC和玩家摧毁)......
任何人都有想法解决removeChild
的双重执行?
如果您想获得更多信息,可以下载来源:
https://www.dropbox.com/s/wvl116wjqpu69d0/shoot_aircraft%20game.zip?dl=0
感谢您的帮助。
答案 0 :(得分:0)
将你的敌人放入一个容器(可能只是一个Sprite对象)和动画调用的第四帧
parent.parent.removeChild(this.parent);
你可能必须更改一些敌人的移动代码行,但你可以弄明白。
基本上,我们的想法是将动画隐藏在非动画精灵中。在代码中间更改帧会使事情变得复杂,除非它的嵌套深度比被调用的对象更深。我希望这是有道理的。