Как я могу создать непрерывный эффект огня при щелчке мышью с ActionScript 3? - PullRequest
0 голосов
/ 27 апреля 2011

Когда кто-то «щелкает и удерживает», я хочу выключать функцию снова и снова, скажем, один раз каждые 100 мс, пока нажата мышь. Вместо MouseEvent.CLICK я бы искал MouseEvent.MOUSE_DOWN, а затем запускал таймер для той функции события, которая каждые 100 мс вызывает другую функцию. Затем на MouseEvent.MOUSE_UP я бы остановил таймер. Я на правильном пути? Смогу ли я получить обновленные координаты X и Y во время запуска события mousedown?

Ответы [ 3 ]

3 голосов
/ 27 апреля 2011

Попробуйте что-то похожее на это: лично у меня не было бы таймера, и я просто позволил частоте кадров обрабатывать, как часто происходят вещи.

var _mouseDown:Boolean = false;
var _msTimer:int = 3;
var _msMax:int = _msTimer;

stage.addEventListener(MouseEvent.MOUSE_DOWN, _mousedown);
stage.addEventListener(MouseEvent.MOUSE_UP, _mouseup);
stage.addEventListener(Event.ENTER_FRAME, _handle);

function _mousedown(e:MouseEvent):void
{
    _mouseDown = true;
}

function _mouseup(e:MouseEvent):void
{
    _mouseDown = false;
}


function _handle(e:Event):void
{
    if(_mouseDown) _msTimer --;
    else _msTimer = _msMax;
    if(_msTimer < 1)
    {
        _msTimer = _msMax;

        // DO FIRE EFFECT HERE
        var xm:Number = stage.mouseX;
        var ym:Number = stage.mouseY;

        trace("do fire effect here", xm, ym);
    }
}

Вот быстрый эффект огня только для ударов:)

var _mouseDown:Boolean = false;
var fire:Array = [];
var colors:Array = [0xFF0000,0xFF9900,0xFFCC00,0xFF0000,0xFF9900,0xFFCC00,0x333333];

var rect:Rectangle = new Rectangle(0,0,stage.stageWidth, stage.stageHeight);
var point:Point = new Point(0, 0);
var bmd:BitmapData = new BitmapData(stage.stageWidth, stage.stageHeight);
var filter:BlurFilter = new BlurFilter(6,6,3);

var container:MovieClip = new MovieClip();
var bitmap:Bitmap = new Bitmap(bmd);

addChild(bitmap);

stage.addEventListener(MouseEvent.MOUSE_DOWN, _mousedown);
stage.addEventListener(MouseEvent.MOUSE_UP, _mouseup);
stage.addEventListener(Event.ENTER_FRAME, _handle);

function _mousedown(e:MouseEvent):void
{
    _mouseDown = true;
}

function _mouseup(e:MouseEvent):void
{
    _mouseDown = false;
}


function _handle(e:Event):void
{
    if(_mouseDown)
    {
        // DO FIRE EFFECT HERE
        var xm:Number = stage.mouseX;
        var ym:Number = stage.mouseY;

        var k:uint = 0;
        for(k; k<10; k++)
        {
            var s:Sprite = fireThing();
            s.x = -30 + xm + Math.random()*30;
            s.y = -30 + ym + Math.random()*30;
        }
    }

    // handle fire
    var i:Array;
    for each(i in fire)
    {
        i[0].x += Math.cos(i[1].ang) * i[1].speed;
        i[0].y += Math.sin(i[1].ang) * i[1].speed;

        if(i[0].y < 0 || i[0].x < 0 || i[0].x > stage.stageWidth || i[0].y > stage.stageHeight)
        {
            if(i[0].parent) i[0].parent.removeChild(i[0]);

            var ix:uint = fire.indexOf(i);
            fire.splice(ix, 1);
        }
    }

    bmd.lock();
    bmd.draw(container);
    bmd.applyFilter(bmd, rect, point, filter);
    bmd.unlock();
}

function fireThing():Sprite
{
    var s:Sprite = new Sprite();

    s.graphics.beginFill(colors[uint(Math.random()*colors.length)]);
    s.graphics.drawCircle(0,0,1+Math.random()*2);
    s.graphics.endFill();

    var o:Object =
    {
        ang: Math.random()*Math.PI*2,
        speed: Math.random()*4
    };

    fire.push([s,o]);
    container.addChild(s);

    return s;
}
0 голосов
/ 27 апреля 2011

Прослушивание события buttonDown после установки для свойства автоповтора кнопки значения true.

<mx:Button label="Click" buttonDown="trace('continuous')" autoRepeat="true"/>
0 голосов
/ 27 апреля 2011

Вы на правильном пути.Чтобы получить обновленные координаты мыши также на MouseEvent.MOUSE_DOWN, добавьте MouseEvent.MOUSE_MOVE слушатель и сохраните координаты X и Y для некоторой переменной в этом слушателе.Таким образом, при вызове прослушивателя «псевдо» щелчка у вас всегда будут обновленные координаты.И на MouseEvent.MOUSE_UP удалите MouseEvent.MOUSE_MOVE слушателя.ИЛИ ЖЕВы можете просто использовать свойства вашего компонента mouseX, mouseY и contentMouseX, contentMouseY (для UIComponent во Flex).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...