AS3中的事件流程 - 射击子弹

时间:2011-08-11 23:53:41

标签: flash actionscript-3

我的目标是每次点击船只时射击子弹。事实上,如果我点击它一次,子弹就会被击中,但是如果我在第一颗子弹离开屏幕之前点击它两次,那么第一颗子弹就会停止(它不会消失,只会停止)第二颗子弹被击中了。

public var ship:Ship = new Ship();
public var bullet:Bullet = new Bullet();

stage.addChild(ship);


ship.addEventListener(MouseEvent.CLICK, shoot);

function shoot(e:MouseEvent):void
{ 

  stage.addEventListener(Event.ENTER_FRAME, bulletflies);

}

function bulletflies(e:Event):void
{

  stage.addChild(bullet);
  bullet.y -= 5; 
}

2 个答案:

答案 0 :(得分:2)

将子弹设置为自己的类,让该类自行迭代运动:

public class Bullet extends Sprite {
    public function Bullet(ship:Ship) {
        // this assumes that you've also set "Ship" up as it's own class

        this.x = ship.x;
        this.y = ship.y;

        this.addEventListener(Event.ENTER_FRAME, this.enterFrameHandler);
    }

    private function enterFrameHandler(event:Event):void {
        this.y -= 1;
        // destroy this clip when it's outside of the stage - better mem managament
        if(this.y < 0 || this.y > this.stage.stageHeight) {
             this.removeEventListener(Event.ENTER_FRAME, this.enterFrameHandler);
             this.parent.removeChild(this);
        }
    }
}

在您的Ship类中,将拍摄功能更改为:

function shoot(e:MouseEvent):void {
    this.addChild(new Bullet(this));
}

将Ship作为一个类并将Bullet作为另一个类是很好的。这样每个对象都会照顾它的自我。此外,如果您最终拥有EnemyBullet,那么您可以开始使用继承多态(我敢打赌,在您学习它们之后,您会喜欢这些)。

答案 1 :(得分:0)

这是因为你只有一颗子弹。

您可以创建项目符号数组,因此请更改

public var bullet:Bullet = new Bullet();

public var bullets:Array = [];

然后,

ship.addEventListener(MouseEvent.CLICK, shoot);

function shoot(e:MouseEvent):void
{ 

  var b:Bullet=new Bullet();
  b.addEventListener(Event.ENTER_FRAME, bulletflies);
  stage.addChild(b);
  bullets.push(b);

}

function bulletflies(e:Event):void
{
  e.currentTarget.y -= 5;
  if(e.currentTarget.y < 0 || e.currentTarget.y > stage.height) {
    stage.removeChild(e.currentTarget);
    bullets.splice(bullets.indexOf(e.currentTarget), 1);
  }
}

- 编辑 -

回应你的评论

  

我不喜欢每个子弹拥有它自己的ENTER_FRAME

的想法

stage.addEventListener(Event.ENTER_FRAME, bulletflies);

下添加一行ship.addEventListener(MouseEvent.CLICK, shoot);

删除b.addEventListener(Event.ENTER_FRAME, bulletflies);

并将事件处理程序更改为:

function bulletflies(e:Event):void
{
  for each(var b:Bullet in bullets) {
    b.y -= 5;
    if(b.y < 0 || b.y > stage.height) {
      stage.removeChild(b);
      //bullets.splice(bullets.indexOf(b), 1);
     }
  }
}