2013-05-28 3 views
0

Я делаю шутер сверху вниз, используя AS3, и у меня возникают проблемы с пулей с корабля, перемещаемого клавишами WASD, в направлении курсора. Пули создаются достаточно хорошо, но они уходят в случайных направлениях, а не туда, где находится курсор, когда вы нажимаете пробел.Стреляющие пули при курсоре Flash AS3

Это код класса пули:

package{ 
import flash.display.MovieClip; 
import flash.events.Event; 
import flash.ui.Mouse; 
import flash.events.MouseEvent; 
import flash.geom.Point; 

public class Bullet extends MovieClip 
{ 
    var speed:Number; 
    var moveX:Number; 
    var moveY:Number; 
    var shipX:Number; 
    var shipY:Number; 

    function Bullet(target:Ship) 
    { 
     speed = 20; 
     shipX = target.x; 
     shipY = target.y; 

     graphics.lineStyle(7,0x000000); 
     graphics.moveTo(-2,0); 
     graphics.lineTo(2,0); 

     graphics.lineStyle(3,0xffffff); 
     graphics.moveTo(-2,0); 
     graphics.lineTo(2,0); 

     addEventListener(Event.ADDED_TO_STAGE, onStage); 

    } 

    function onStage (e:Event) 
    { 
     /*addEventListener("enterFrame", enterFrame); 

     /*var mc = 
     var angleRadian = Math.atan2(mouseY - mc.y, mouseX - mc.x); 
     var angleDegree = angleRadian * 180/Math.PI; 
     mc.rotation = angleDegree;*/ 

     /*Ship.y += speed * Math.sin((Ship.rotation - 90) * (Math.PI/180)); 
     Ship.x += speed * Math.cos((Ship.rotation - 90) * (Math.PI/180));*/ 



     trace(stage.mouseY); 
     var cy:Number = stage.mouseY - shipY; 
     var cx:Number = stage.mouseX - shipX; 

     moveX = cx/cy; 
     moveY = (cy < 0) ? -1 : 1; 
     var Radians:Number = Math.atan2(cy,cx); 
     var Degrees:Number = Radians * 180/Math.PI;*/ 
    } 
    function enterFrame(e:Event) 
    { 
     /*this.x += speed;*/ 

     this.x += moveX * speed; 
     this.y += moveY * speed; 



     if (this.x > 900) 
     { 
      removeEventListener("enterFrame",enterFrame); 
      stage.removeChild(this); 
     } 
     if (this.x < 0) 
     { 
      removeEventListener("enterFrame",enterFrame); 
      stage.removeChild(this); 
     } 
     if (this.y > 800) 
     { 
      removeEventListener("enterFrame",enterFrame); 
      stage.removeChild(this); 
     } 
     if (this.y < 0) 
     { 
      removeEventListener("enterFrame",enterFrame); 
      stage.removeChild(this); 
     } 

     for(var i in Enemy.list) 
      { 
       if(this.hitTestObject(Enemy.list[i])) 
       { 
        removeEventListener("enterFrame", enterFrame); 
        stage.removeChild(this); 
        Enemy.list[i].kill(); 
        break; 
       } 
      } 
    } 
} 

}

Любая помощь в получении пули, чтобы стрелять правильно были бы оценены!

ответ

2

Скорости x и y должны быть результатом cos и sin угла (в радианах) соответственно.

т.е.

var angle:Number = Math.atan2(cy, cx); 
moveX = Math.cos(angle); 
moveY = Math.sin(angle); 

Затем умножим обе эти скоростью (что вы уже делаете).

Кроме того, вам не нужно вычислять степени, если вы не хотите, чтобы вращать графику:

rotation = angle * 180/Math.PI; 
+0

Это останавливали пули двигаться, они до сих пор появляются на сцене, и они вращаются себя должным образом, но они надевают Не двигайтесь, откуда они появляются. – user2430308

+0

@ user2430308 Что произойдет, если вы будете отслеживать 'moveX' и' moveY'? – Marty

+0

Мне удалось заставить его работать! это очень помогло! – user2430308