сценарий действия 3 - возможно ли вызвать событие щелчка только при щелчке мышью по части изображения? - PullRequest
2 голосов
/ 03 марта 2012

У меня есть проблема, и у меня есть потенциальное решение.Но я хотел подтвердить, есть ли простой и простой способ решения моей проблемы.

Тип приложения:

Изометрические игры

Постановка задачи:

Я загружаю изображения в мое приложение флэш-памяти, и к ним прикреплены события мыши.

Загружаемые изображения - это изображения пропеллера, такие как транспортные средства, деревья, здания и т. Д., И все они прозрачные.

Пример: актив Красного шара (пожалуйста, не обращайте внимания на желтый фон, который я применил для описания проблемы)

Red Ball Asset

Если я нажму на фактическийобласть изображения (окрашена в красный цвет), затем все работает идеально

Я не хочу запускать mouseevent, когда нажимаю на пустую часть изображения (или прозрачную область, которую я показал желтым цветом)

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

Есть еще один метод, который я собирался применить, используя метод BitP для getPixel.Обсуждается здесь .

Но есть и другая проблема с этим методом.

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

Что ж, размышления о решении этой проблемы приводят меня к getObjectsUnderPoint где я могу сканировать скрытые активы

Ответы [ 2 ]

2 голосов
/ 03 марта 2012

Хорошо, то, что вы предложили в качестве решения, является действительным на 100%.Просто переместите логику, чтобы определить, какой игровой объект нажимается за пределами этого объекта.

  1. Прослушивание MOUSE_DOWN/MOUSE_UP событий в контейнере, в котором содержатся ваши игровые объекты.
  2. Поймать событие
  3. Проверьте, прозрачен ли игровой объект, являющийся целью этого события, в данный момент, используя BitmapData.getPixel32
  4. Если используется getObjectsUnderPoint, чтобы найти все другие игровые объекты в этой точке
  5. Найдите в цикле первый объект, который не является прозрачным в этой точке

Теперь вы получили реальный объект, который попал.

1 голос
/ 03 марта 2012

Одним из интересных решений является использование Sprite объектов с отдельными непрозрачными пикселями, сгоревшими на них.

Предположим, что это ваш Loader "полный" обработчик:

private function loaderCompleteHandler(event:Event):void
{
    // Loader is not our child, we use a Sprite instead (below).
    var loader:Loader = Loader(event.target);

    var sprite:Sprite = new Sprite();
    addChild(sprite);

    var w:Number = loader.content.width;
    var h:Number = loader.content.height;

    // Use transparent bitmap.
    var bitmapData:BitmapData = new BitmapData(w, h, true, 0);
    bitmapData.draw(loader.content);

    // Now burn the image onto the Sprite object, ignoring
    // the transparent pixels.
    for (var xPos:int = 0; xPos < w; xPos++) {
        for (var yPos:int = 0; yPos < h; yPos++) {
            var pixel32:uint = bitmapData.getPixel32(xPos, yPos);
            var alpha:int = pixel32 >>> 24;
            if (alpha != 0) {
                sprite.graphics.beginFill(pixel32 & 0xFFFFFF, alpha / 0xFF);
                sprite.graphics.drawRect(xPos, yPos, 1, 1);
                sprite.graphics.endFill();
            }
        }
    }

}

По сути, вы хотите, чтобы «пустые» пиксели не были кликабельными, а полностью прозрачные пиксели - это не одно и то же.С этим решением вы получаете пустые пиксели.

Единственная проблема в том, что это может быть медленно.Дайте ему шанс.

...