Проблема с более чем одним врагом и игрой в случае попадания ракеты - PullRequest
0 голосов
/ 16 марта 2011

Я создаю простую флеш-игру для класса. Я хотел сделать второй уровень, но не могу заставить врага взорваться независимо. Я сделал одинаковые символы врага2, врага3, врага4 и врага5 с именами экземпляров. Я тоже на всякий случай сделал отдельный плеер. приведенный ниже код находится на рамке плеера. Любые предложения будут с благодарностью.

onClipEvent(load) {
    var shipSpeed:Number = 15;
    var rotationSpeed:Number = 15;
    var missileNum:Number = 0;
    var missile:Array = new Array();
    var missleSpeed:Number = 20;
}



onClipEvent (enterFrame) {
if(Key.isDown(Key.LEFT)) {
    _rotation -= shipSpeed;
}

if(Key.isDown(Key.RIGHT)) {
    _rotation += shipSpeed;
}

var radian:Number = (-1 * _rotation + 90) * Math.PI/180;

if(Key.isDown(Key.UP)) {
    _x += shipSpeed * Math.cos(radian);
    _y -= shipSpeed * Math.sin(radian);
}

if(Key.isDown(Key.DOWN)) {
    _x -= shipSpeed * Math.cos(radian);
    _y += shipSpeed * Math.sin(radian);
}


// keeps player in the frame    
if(this._x >= 800)  this._x = 11;
if(this._x <= 10)  this._x = 799;
if(this._y >= 600)  this._y = 11;
if(this._y <= 10)  this._y = 599;




 if(this.hitTest(_root.enemy2))
 {
    _root.player2.play ();
 }

if(this.hitTest(_root.enemy3))
 {
    _root.player2.play ();
 }

 if(this.hitTest(_root.enemy4))
 {
    _root.player2.play ();
 }

 if(this.hitTest(_root.enemy5))
 {
    _root.player2.play ();
 }

//Shoot missile in direction the ship is facing
if(Key.isDown(Key.SPACE)) {
    missile[missileNum] = _root.attachMovie("missile","missile"+missileNum,_root.getNextHighestDepth(),{_x:_x,_y:_y,_rotation:_rotation});
    missile[missileNum].ySpeed = Math.sin(radian)*missleSpeed;
    missile[missileNum].xSpeed = Math.cos(radian)*missleSpeed;
    missile[missileNum].onEnterFrame = function() {
        if(this.hitTest(_root.enemy2)) {
            _root.enemy2.play ();}


        if(this.hitTest(_root.enemy3)) {
            _root.enemy3.play ();}

    if(this.hitTest(_root.enemy4)) {
        _root.enemy4.play();}

    if(this.hitTest(_root.enemy5)) {
        _root.enemy5.play();}

           // this.attachMovie("enemy", "enemy", 3 );
        }
        this._y -= this.ySpeed;
        this._x += this.xSpeed;
        trace("missile: " + missileNum);
        if(0 > this._x || this._x > 800 || 0 > this._y || this._y > 600)
            this.removeMovieClip();
    }
    missileNum++;
}
}

1 Ответ

0 голосов
/ 25 апреля 2013

вам определенно нужно научиться правильно делать отступы в вашем коде.Как видите, это приводит не только к путанице, но и ко многим ошибкам.

Проблема в том, что эта часть кода

    this._y -= this.ySpeed;
    this._x += this.xSpeed;
    trace("missile: " + missileNum);
    if(0 > this._x || this._x > 800 || 0 > this._y || this._y > 600)
        this.removeMovieClip();

не находится в слушателе события onEnterFrame.переместите блуждающую фигурную скобку НИЖЕ этого кода.также погрузите missleNum++ часть над 1 скобкой

, другими словами, преобразуйте это:

       // this.attachMovie("enemy", "enemy", 3 );
    }
    this._y -= this.ySpeed;
    this._x += this.xSpeed;
    trace("missile: " + missileNum);
    if(0 > this._x || this._x > 800 || 0 > this._y || this._y > 600)
        this.removeMovieClip();
}
missileNum++;

в это:

       // this.attachMovie("enemy", "enemy", 3 );
    this._y -= this.ySpeed;
    this._x += this.xSpeed;
    trace("missile: " + missileNum);
    if(0 > this._x || this._x > 800 || 0 > this._y || this._y > 600)
        this.removeMovieClip();

    }

missileNum++;
}

также, кажется, чтопредоставленный вами код содержит 2 ненужных / неиспользуемых} скобки в конце кода.

позвольте мне дать вам полную, правильно отступающую часть "missle":

if(Key.isDown(Key.SPACE)) {
    missile[missileNum] = _root.attachMovie("missile","missile"+missileNum,_root.getNextHighestDepth(),{_x:_x,_y:_y,_rotation:_rotation});
    missile[missileNum].ySpeed = Math.sin(radian)*missleSpeed;
    missile[missileNum].xSpeed = Math.cos(radian)*missleSpeed;

    missile[missileNum].onEnterFrame = function() {
      if(this.hitTest(_root.enemy2)) {
        _root.enemy2.play ();}

      if(this.hitTest(_root.enemy3)) {
        _root.enemy3.play ();}

      if(this.hitTest(_root.enemy4)) {
        _root.enemy4.play();}

      if(this.hitTest(_root.enemy5)) {
          _root.enemy5.play();}

      // this.attachMovie("enemy", "enemy", 3 );

      this._y -= this.ySpeed;
      this._x += this.xSpeed;
      trace("missile: " + missileNum);
      if(0 > this._x || this._x > 800 || 0 > this._y || this._y > 600)
          this.removeMovieClip();
    }//end of the missle's onEnterFrame

    missileNum++;
}//end of the Key.isDown

еще одно предложение, которое я хотел бы сделать, это переместить своих врагов в массив, скажем, «враги» в начале

 var enemies:Array = new Array(); //initiate them now or later

, тогда вы можете толкнуть врагов, как вы это делаете с ракетными врагами.push (_root.some_newly_created_enemy);

, а затем выполните

foreach(enemy in enemies){
  if(this.hitTest(enemy)) {
    enemy.play();}
}

вместо того, чтобы проверять их статически один за другим

...