PDA

Просмотр полной версии : Обрезать битмап.


Artureg
24.10.2007, 00:34
Подскажите как вырезать из BitmapData области залитые определённым цветом? Не спрятать а именно вырезать. Что бы onMouseOver не срабатывал на вырезанных "дырках". Маски не помогают.

зы. Bitmap берётся из библиотеки и накладывается на Sprite.

Nirth
24.10.2007, 00:43
Создать Shape нужной формы(с дырками) и наложить на hitArea у Sprite'а

Artureg
24.10.2007, 00:57
В таком случае handleMouseOverSprite вообще не срабатывает

Shape на хитАреа спрайта наложить не получается пишет
"1067: Implicit coercion of a value of type flash.display:Shape to an unrelated type flash.display:Sprite."

Если на спрайт не добавлять битмап то всё работает.


var s:Sprite = new Sprite();
s.addEventListener(MouseEvent.MOUSE_OVER,handleMouseOverSprite);
s.addEventListener(MouseEvent.MOUSE_OUT,handleMouseOutSprite);
var bd:Bitmap = new Bitmap(new Pic(tw,th));


var sh:Sprite = new Sprite();
sh.graphics.beginFill(0x000000);
sh.graphics.moveTo(0,18);
sh.graphics.lineTo(36,0);
sh.graphics.lineTo(37,0);
sh.graphics.lineTo(73,18);
sh.graphics.lineTo(73,19);
sh.graphics.lineTo(37,37);
sh.graphics.lineTo(36,37);
sh.graphics.lineTo(0,19);
sh.graphics.endFill();

s.addChild(bd);
s.hitArea = sh;


function handleMouseOverSprite(e:MouseEvent):void{
(e.target).alpha = 0.9;
}
function handleMouseOutSprite(e:MouseEvent):void{
(e.target).alpha = 1;
}

Nirth
24.10.2007, 01:04
Я не знаю каким образом ты форматировал свой код. Но нормальные люди форматируют тэгом CODE, лично я не собираюсь гробить свои глаза смотря на это творчество синим и зеленым.

Artureg
24.10.2007, 01:07
Это был тэг PHP. Уже исправил.

2morrowMan
24.10.2007, 01:19
sh.mouseEnabled = false;

Artureg
24.10.2007, 01:20
Всё. Нашёл ошибку у себя в ДНК, забыл добавить спрайт с нарисованной областью к основному спрайту. Всё работает, спасибо. Вопрос закрыт.

Nirth
24.10.2007, 01:25
package {
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.events.MouseEvent;

public class HitArea extends Sprite
{
public function HitArea()
{
addChild(createButton()).addEventListener(MouseEvent.CLICK, trace);
}

private function createButton():Sprite
{
var result:Sprite = new Sprite();
result.addChild(new Bitmap(new BitmapData(200, 200, true, 0xFFFF6600)));
result.hitArea = result.addChild(createHitArea()) as Sprite;
result.buttonMode = result.useHandCursor = true;

return result;
}

private function createHitArea():Sprite
{
var result:Sprite = new Sprite();
result.graphics.beginFill(0x000000);
result.graphics.moveTo(0,18);
result.graphics.lineTo(36,0);
result.graphics.lineTo(37,0);
result.graphics.lineTo(73,18);
result.graphics.lineTo(73,19);
result.graphics.lineTo(37,37);
result.graphics.lineTo(36,37);
result.graphics.lineTo(0,19);
result.graphics.endFill();

return result;
}
}
}

Artureg
24.10.2007, 01:42
Спасибо. Всё работает.

И ещё вопрос. С простым ромбом фишка с хитАреа проходит. А как быть если это сложный битмап со всякими завитушками и его нельзя повторить простыми лайнТу?

Nirth
24.10.2007, 02:12
Попробуй засунуть битмап в спрайт(копию битмапа) и сделай спрайт хит ареей?

Artureg
24.10.2007, 02:30
Нет. так к сожалению не работает.

Nirth
24.10.2007, 03:08
Выложи битмап пример.

Artureg
24.10.2007, 12:53
Да вот хотябы. Дерево перекрывает грибочек.

MerlinTwi
25.10.2007, 12:30
Если это не нужно делать динамически, то лучше так:
1. Добавляем в библиотеку новый мувиклип
2. Вставляем в него картинку
3. Делаем на картинке правой кнопкой мыши Break Apart получаем shape с заливкой картинкой
4. Берем инструмент лассо (L), ниже включаем магическую палочку (Magic Wand), выделяем все прозрачные области на shape и просто их удаляем.

см. аттач

Artureg
25.10.2007, 13:28
Спасибо но. В том то и дело что динамически, причём графики очень много и она очень разная.

Nirth
25.10.2007, 15:54
Я бы сказал никак. Тоесть можно конечно математически находить вершины, потом заливать их вектором.

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

MerlinTwi
25.10.2007, 16:57
Как вариант, сделать свой "onMouseOver", при движении мышки брать все объекты под курсором мыши (getObjectsUnderPoint), и если среди них есть битмапы, то проверять, не является ли прозрачным цвет под курсором мыши и если нет, то генерить от его имени событие "myMouseOver"

Artureg
25.10.2007, 17:36
MerlinTwi :) Да я так и сделал. Но думалось что есть более простой и надёжный способ.

Artureg
25.10.2007, 18:04
Упростил пример :) Теперь работает без глюклв. Может кому нибудь, когда нибудь пригодится :)