Поток событий в AS3 - стрелять пули - PullRequest
0 голосов
/ 12 августа 2011

Моя цель - стрелять пулей каждый раз, когда я нажимаю на корабль. На самом деле происходит следующее: если я щелкаю по нему один раз, пуля выстреливает, но если я щелкаю по нему дважды, пока первая пуля не исчезла с экрана, первая пуля буквально останавливается (она не исчезает, а останавливается) и вторая пуля выстрелила.

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 ]

2 голосов
/ 12 августа 2011

Установите маркер как свой собственный класс, и пусть этот класс выполняет итерацию самостоятельно:

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);
        }
    }
}

В вашем классе кораблей измените свою функцию выстрела на:

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

Хорошо иметь Корабль как один класс и Пуля как другой.Таким образом, каждый объект заботится о о себе .Кроме того, если у вас получится EnemyBullet, то вы можете начать использовать наследование и полиморфизм (держу пари, вам понравятся те, кто выучит их).

0 голосов
/ 14 августа 2011

Это потому, что у вас есть только 1 пуля.

Вы можете создать массив пуль, поэтому измените

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);
  }
}

- EDIT -

В ответ на ваш комментарий

Мне не нравится идея, что каждая пуля имеет свой собственный 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);
     }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...