AS3 - Как - Вражеская пуля стрелять по диагонали? - PullRequest
0 голосов
/ 13 июля 2011

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

private function loop(e:Event) : void
    {

        y += vy;
        x += 0;
        x -= 0;
        if ((target.x - x) > (target.y - y) && (getDistance(target.x, target.y, x, y) < interestDistance / 2))
              x += 5;

        if ((target.y - y) > (target.x - x) && (getDistance(target.x, target.y, x, y) < interestDistance / 2))
              x -= 5;



        if (y > stageRef.stageWidth || y < 0)
        removeSelf();
    }

Что я могу добавить к коду, чтобы «Пуля» двигалась по своей первоначальной траектории, независимо от того, куда Цель переместилась?

Спасибо за ваше время.

Ответы [ 2 ]

2 голосов
/ 14 июля 2011

Ваш код - небольшой беспорядок, подумайте об этом на секунду:

Когда определяется траектория полета пули?Прямо сейчас ваша пуля действует как управляемая ракета с нарушенным кодом наведения (без обид:)).

В частности, ваша пуля попадает в y + из-за этой строки кода:

y+ = вы;

, как вы можете видеть, он всегда выполняется внутри цикла, даже если x + = 5 или -5 не ...

vy и некоторая переменная vx, которой у вас сейчас нет, должны быть инициализированыв начале жизни пули, то есть, вероятно, где-то в конструкторе пуль

package {
    public class Bullet extends MovieClip{
        public var vx:Number;
        public var vy:Number;
        public var target:MovieClip;
              public function Bullet(target:MovieClip, startX:Number, startY:Number){

                    /*this is a slightly bad idea to let the bullet have any knowledge of
                      the target but for purposes of this explanation lets do it like that.
                      This should better be put where the bullet was created but for now...*/
                     this.target = target;
                     x = startX;
                     y = startY;
                     /*this is slightly better code then your loop and it is only set once
                      instead of all the time*/
                     if(target.x < x-20){
                          vx = -5;
                     }else if(target.x > x+20){
                          vx = +5;
                     } else {vx = 0;}
                     if(target.y < y-20){
                          vy = -5;
                     }else if(target.y > y+20){
                          vy = +5;
                     } else {vy = 0;}

                      //now we create the loop itself
                      addEventListener(Event.ENTER_FRAME, loop);
              }

              private function loop(e:Event) : void{
                   x+=vx;
                   y+=vy;
                   /*this is collision code, bear in mind this should probably also be
                    in an enter frame in the class that created the bullet and the target
                    the bullet simply should not know about the target but alas, long story...*/
                   if(checkCollision(target)){
                      //do something
                   }
              }
              /* notice that this function can be used outside of this class as well...
               this is why i programmed it like this instead of just using the              
               this.hitTest if*/
              public function checkCollision(target):Boolean{
                    if(this.hitTest(target)){
                         return true;
                    }
                    return false;
              }
    }
}

Надеюсь, я не допустил ошибок в этом коде ...

Кроме того, мне кажется,Вы только хотите, чтобы пуля шла по диагонали в нижний левый или нижний правый угол ... в этом случае, пожалуйста, измените конструктор так, чтобы он просто имел что-то вроде vy = 5;вместо всего этого:

if(target.y < y-20){
     vy = -5;
}else if(target.y > y+20){
     vy = +5;
} else {vy = 0;}

Надеюсь, это поможет вам.

0 голосов
/ 13 июля 2011

Вам нужно сделать новую переменную. Назовите его xspeed. Затем используйте код, который выглядит следующим образом.

цикл частной функции (e: Event): void {

    y += vy;
    if ((target.x - x) > (target.y - y) && (getDistance(target.x, target.y, x, y) < interestDistance / 2))
          xspeed = 5;

    if ((target.y - y) > (target.x - x) && (getDistance(target.x, target.y, x, y) < interestDistance / 2))
          xspeed = -5;

    x+=xspeed;

    if (y > stageRef.stageWidth || y < 0)
    removeSelf();
}

Таким образом, вы сохраняете скорость перемещения объекта в направлении х. Затем вы всегда двигаетесь на этой скорости независимо от того, находится ли цель в радиусе действия или нет.

...