Сценарий действия 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% верно. Просто переместите логику, чтобы определить, какой игровой объект нажимается за пределами этого объекта.
- Слушай
MOUSE_DOWN/MOUSE_UP
события в контейнере, который содержит ваши игровые объекты. - Поймай событие
- Проверьте, прозрачен ли игровой объект, являющийся целью этого события, в данный момент, используя
BitmapData.getPixel32
- Если это использовать
getObjectsUnderPoint
чтобы узнать все другие игровые объекты на данный момент - Найдите в цикле первый объект, который не является прозрачным в этой точке
Теперь вы получили реальный объект, который попал.