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

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

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

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

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

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

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

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

Красный шар Актив

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

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

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

Есть другой метод, который я собирался использовать, используя метод BitPixel getPixel. Который обсуждается здесь.

Но есть еще одна проблема с этим методом.

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

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

2 ответа

Решение

Одним из интересных решений является использование 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();
            }
        }
    }

}

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

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

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

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

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

Другие вопросы по тегам