Как сжать хит Зона Спрайта на RollOver - PullRequest
1 голос
/ 17 декабря 2011

У меня есть сетка из множества квадратов 10х10 пикселей, разделенных только линией пикселей. Когда пользователь переворачивает спрайт, он увеличивается, анимируясь примерно в 4 раза больше - примерно до 40x40 пикселей. Спрайт остается большим, пока мышь находится над спрайтом, но если пользователь хочет переворачивать соседний спрайт, он скрывается этим спрайтом и его большим размером.

Можно ли уменьшить размер области попадания, чтобы, хотя спрайт увеличивался в размере, мышь все еще могла получить доступ или вызвать соседние спрайты внизу - справа, слева, сверху, снизу? Я думал об использовании Mouse_move, но не был уверен, что это вызовет слишком много событий.

Я прочитал следующие посты. Тем не менее, мой hitArea должен быть того же размера или чуть больше, чем оригинальный спрайт 10x10 пикселей. У меня был небольшой успех.

Не уверен, имеет ли это значение: я работаю с классом ActionsScript внутри проекта Flex. Основной файл класса - mxml.

Маршрутизация событий мыши через спрайт в ActionScript 3

AS3: определение области попадания

public function onRollOver(event:MouseEvent):void
{  
    //do a bunch of stuff
    timerUp.start();
    timerUp.addEventListener(TimerEvent.TIMER, growSquare);     
}

private function growSquare(e:TimerEvent):void
{
    var maxSize:Number = 40;    
    if (currSprite.width < maxSize) {
        currSprite.width++;
        currSprite.height++;
        if (currSprite.width > maxSize) { 
        currSprite.width = maxSize;
        currSprite.height = maxSize;
        }
        e.updateAfterEvent();   
        } else {
          timerUp.stop();
        }   
  }


    /////////Hit Area Code - From Square Object //////////////////

        var vHeight:Number = 10;
        var vWidth:Number = 10;
        var square:Sprite = new Sprite();   
        square.graphics.beginFill(0x000000); 
        square.graphics.drawRect(0, 0, vWidth, vHeight);
        square.graphics.drawRect(-vWidth/2, -vHeight/2, vWidth, vHeight);
        square.graphics.endFill();

       // try to decrease the hit area, or keep it at the original size
        const hitArea:Sprite = new Sprite()
        hitArea.graphics.beginFill( 0xFFFFFF );
        hitArea.graphics.drawRect(-vWidth/2, -vHeight/2, vWidth, vHeight);
        hitArea.mouseEnabled = false;
        hitArea.visible = false;
        hitArea.x = square.x
        hitArea.y = square.y
        square.hitArea = hitArea;
        addChild( square );
        addChild( hitArea );

1 Ответ

2 голосов
/ 17 декабря 2011

Вы можете разделить свой спрайт на два подприта: один для области попадания и один для чертежа.Примерно так:

public class GridBox extends Sprite
{
    public var hitAreaSprite:Sprite;
    public var drawingSprite:Sprite;

    public function GridBox()
    {
        hitAreaSprite = new Sprite();
        // Draw a 10x10 pixel box in hitAreaSprite, add event listeners, etc.

        drawingSprite = new Sprite();
        // Disable mouse input for drawingSprite here.

        addChild(hitAreaSprite);
        addChild(drawingSprite);
    }
}

...

var yourSprite:GridBox = new GridBox();

Затем установите yourSprite.hitAreaSprite равным 10x10 пикселей и добавьте в него события прослушивателя мыши.yourSprite.drawingSprite должен содержать все графические элементы и рисунки.Установите для его свойств mouseChildren и mouseEnabled значение false.

Тогда, когда предполагается, что спрайт будет расти, не изменяйте напрямую yourSprite.width, а вместо этого yourSprite.drawingSprite.width.Поскольку мышь для этого вложенного спрайта не включена, а hitAreaSprite не перемещается, указанные ниже спрайты будут по-прежнему получать события мыши.

...