Попытка найти способ «скользить» по квестам в ActionScript 3.0 Billiards Game - PullRequest
1 голос
/ 17 ноября 2011

Я пытаюсь заставить реплику перестать вращаться, когда она находится в событии MOUSE_DOWN, но продолжаю добавлять расстояние mouseX и mouseY к расстоянию реплики от cueball. Другими словами, для того, чтобы кий скользил вдоль линии, кий направлен вниз.

    Cue.addEventListener(Event.ENTER_FRAME, aimCue);
    Cue.addEventListener(MouseEvent.MOUSE_DOWN,StartToShoot);
    addEventListener(Event.ENTER_FRAME,MoveBalls);

    public function aimCue(event:Event)
    {
        var dx:Number = Cueball.x - Cue.x;
        var dy:Number = Cueball.y - Cue.y;
        var angle:Number = Math.atan2(dy,dx);
        Cue.rotation = angle * 180 / Math.PI;
        Cue.x = mouseX;
        Cue.y = mouseY;
    }
    public function StartToShoot(event:MouseEvent)
    {
        var dx:Number = Cueball.x - mouseX;
        var dy:Number = Cueball.y - mouseY;
        var dist:Number = Math.sqrt(dx * dx + dy * dy);
        //Cue.x = dx + Cueball.x;
        //Cue.y = dy + Cueball.y;


        if (dist > 230)
        {
            Cue.startx = Cue.x;
            Cue.starty = Cue.y;

            Cue.addEventListener(Event.ENTER_FRAME,FinishShoot);
        }
    }
    public function FinishShoot(event:Event)
    {
        var dx:Number = Cueball.x - Cue.x;
        var dy:Number = Cueball.y - Cue.y;
        var dist:Number = Math.sqrt(dx * dx + dy * dy);

        if (dist < 230)
        {
            Cueball.vx = Cue.x - Cue.startx;
            Cueball.vy = Cue.y - Cue.starty;
            Cue.removeEventListener(Event.ENTER_FRAME,FinishShoot);
        }

    }

Ответы [ 2 ]

1 голос
/ 17 ноября 2011

Например, вы можете добавить логическое isShooting. В вашем обработчике MOUSE_DOWN вы можете установить для него значение true, а с помощью aimCue вы можете проверить, правда это или нет. Когда вы закончите снимать, вы можете снова установить его на false.

Cue.addEventListener(Event.ENTER_FRAME, aimCue);
Cue.addEventListener(MouseEvent.MOUSE_DOWN,StartToShoot);
addEventListener(Event.ENTER_FRAME,MoveBalls);    

private var isShooting:Boolean = false;

public function aimCue(event:Event)
{
    if(!isShooting)
    {
        var dx:Number = Cueball.x - Cue.x;
        var dy:Number = Cueball.y - Cue.y;
        var angle:Number = Math.atan2(dy,dx);
        Cue.rotation = angle * 180 / Math.PI;
        Cue.x = mouseX;
        Cue.y = mouseY;
    }
}
public function StartToShoot(event:MouseEvent)
{

    isShooting = true;

    var dx:Number = Cueball.x - mouseX;
    var dy:Number = Cueball.y - mouseY;
    var dist:Number = Math.sqrt(dx * dx + dy * dy);
    //Cue.x = dx + Cueball.x;
    //Cue.y = dy + Cueball.y;


    if (dist > 230)
    {
        Cue.startx = Cue.x;
        Cue.starty = Cue.y;

        Cue.addEventListener(Event.ENTER_FRAME,FinishShoot);
    }
}

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

private var storedPoint:Point;

public function StartToShoot(event:MouseEvent)
{

    isShooting = true;

    storedPoint = new Point(stage.mouseX, stage.mouseY);

    stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
}

private function onMouseMove(e:MouseEvent):void
{
    var curPoint:Point = new Point(stage.mouseX, stage.mouseY);
    var distance:Number = Point.distance(storedPoint, curPoint);

    /* do stuff with the distance*/

    e.updateAfterEvent();
}
0 голосов
/ 17 ноября 2011

Вы можете использовать любую библиотеку Tweening, например, greensock.com .

Как минимум, вам нужно будет ввести координаты x & y для пункта назначения битка, а библиотека Tweening должна обработать все остальное ...

Допустим, вы "стреляете"с помощью мыши вы можете определить ось, используя координаты мыши и координаты мыши вверх.

Если у вас есть ось, вам просто нужно определить точку удара битка, проверив, где находится ось ибиток перекрытия.Это даст вам координаты назначения x, y для кия.

...