Пули в списке после движения мыши - PullRequest
1 голос
/ 02 февраля 2012

У меня возникла проблема, над которой я работал несколько часов, но не повезло.У меня есть движение, связанное с клавишами со стрелками, и пользователь смотрит вокруг с помощью мыши.Когда я стреляю, я хочу, чтобы он продолжал двигаться в том же направлении, в котором он изначально был запущен, но в случае, если пользователь перемещает мышь, пули меняют направление с ним.в начале, когда «игрок» следует за курсором.

stage.addEventListener("mouseMove", Follow);
function Follow(e:MouseEvent):void
{
    var a1 = mouseY - player_obj.y;
    var b1 = mouseX - player_obj.x;
    var radians1 = Math.atan2(a1,b1);
    var degrees1 = radians1 / (Math.PI / 180);
    player_obj.rotation = degrees1;
}

Я думаю, что проблема в том, что когда я помещаю пули в массив, все они разделяют эффекты перемещения пользователямышь вместо сохранения их начального значения.Если у кого-то есть какие-либо комментарии по этому поводу, это будет очень цениться и извините за длинный пост.

Спасибо, Коул

Ответы [ 2 ]

1 голос
/ 02 февраля 2012

У меня были такие ситуации раньше.Лучшее решение, которое я смог найти, - это добавить два свойства в класс снарядов для хранения синуса и косинуса начального угла.Если скорость снаряда никогда не меняется, вы можете вместо этого сохранить deltaX и deltaY для снаряда.Вам больше не понадобится свойство Bullet "currentPlayerRotation".

ваша функция выстрела будет выглядеть следующим образом:

function shoot(shooteven:Event)
{
  var Create:Bullet = new Bullet();
  addChild(Create);
  Create.x = player_obj.x;
  Create.y = player_obj.y;
  Create.dirCos = Math.cos((player_obj.rotation)*degreesToRadians);
  Create.dirSin = Math.sin((player_obj.rotation)*degreesToRadians);
  list.push(Create);
}

цикл, который перемещает ваши пули, также упрощен, теперь, когда естьникакой вызов sin () / cos () для каждого снаряда на экране.

for (var i:int=0; i<list.length; i++)
{
  target = Bullet(list[i]);
  target.x += target.dirCos * 10;
  target.y += target.dirSin * 10;
}

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

1 голос
/ 02 февраля 2012

Попробуйте этот код:

var myTimer2:Timer = new Timer(50);
var list:Array = new Array();

myTimer2.addEventListener(TimerEvent.TIMER, timerListener2);
myTimer2.start();

stage.addEventListener(MouseEvent.CLICK, shoot);
function shoot(shooteven:Event)
{
    var Create:Bullet = new Bullet();
    addChild(Create);
    Create.x = player_obj.x;
    Create.y = player_obj.y;
    Create.currentPlayerRotation = player_obj.rotation;
    list.push(Create);
}

function timerListener2(e:TimerEvent):void
{
    moveBullets();
}

function moveBullets():void
{
    var target:Bullet;
    for (var i:int=0; i<list.length; i++)
    {
        target = Bullet(list[i]);
        target.x +=Math.cos((target.currentPlayerRotation)*degreesToRadians) *10;
        target.y +=Math.sin((target.currentPlayerRotation)*degreesToRadians) *10;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...