2014-10-29 7 views
2

Для приложения «рисование» ActionScript 3, я хочу иметь возможность выбрать текстуру и установить ее прозрачность. Поэтому я пытаюсь установить альфа-прозрачность текстуры. Но это не работает.as3 - настройка текстур альфа-значение

Что я делаю:

  1. На первый я использую graphics.linestyle(), чтобы установить линии толщины и ALPHA-значение.
  2. После этого я (a) загружаю png, (b) читаем его bitmapData и (c), затем используем его с помощью lineBitmapStyle.

Результат:

При рисовании линии (с MoveTo, LineTo, и т.д.) линии использовать текстуру, но ИГНОРИРУЙТЕ "Альфа", который был установлен с LineStyle.

Что я делаю неправильно?

myLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, setTexture);   

setTexture(e:Event):void 
{ 
    e.currentTarget.removeEventListener(e.type, arguments.callee); 

    //Try 1: Trying to set the Alpha-Trasparency with "lineStyle"-Command: 
    myDrawContainer.graphics.lineBitmapStyle(5, 0xFF0000, 0,6); 

    //Try 2: Trying to set the Alpha-Transparency by changing the Alpha-Value of the loaded content: 
    myLoader.content.alpha = 0.6; 

    //Getting the BitmapData of the Image: 
    BitmapDataOfMyTexture = Bitmap(LoaderInfo(e.target).content).bitmapData 

    //"Using" the TBitmapData as "Color/Texture" for my Drawing: 
    myDrawContainer.graphics.lineBitmapStyle(BitmapDataOfMyTexture); 

    //Test-Drawing: 
    myDrawContainer.graphics.moveTo(0, 0); 
    myDrawContainer.graphics.moveTo(500, 500); //-> RESULT: Textured Line WITHOUT Transparency! 

}

РЕЗУЛЬТАТ: Я получаю строку, которая использует текстуру, но без прозрачности.

(Update) РЕШЕНИЕ: (Спасибо DodgerThud)
Для установки/изменения альфа-канал загруженного изображения, вы не используете "LineStyle", но ...

  1. создать новый ColorTransform-объект

  2. затем установите это «alphaMultiplier» к атрибуту по конкретному AlphaChannel

  3. И затем применить этот вновь созданный colorTransform-Object для загруженного BitmapData, используя метод colorTransform для загруженных BitmapData.

НО:

Это не работает с изображениями, которые не имеют альфа-канал или не активировали их альфа-канал. Эти изображения получают только DARKER при опускании альфа-канала. В этих случаях вы должны сделать это:

  1. Сначала я создать НОВЫЙ BitmapData-объект с «новым», установите его ширины и высоты к ширине и высоте загруженного изображения и установить его третий аргумент в TRUE (= прозрачность: ВКЛ.). Итак, вы получили «Контейнер», который имеет прозрачность ACTIVATED.
  2. Затем вы используете «copyPixels» в этом «Container» -Object, чтобы заполнить его пикселями LOADED BitmapData-Object.
  3. И сразу после этого вышеприведенный подход с «colorTransform» -Object приносит ожидаемый результат.

Так вот рабочий код:

myLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, setTexture); 

setTexture(e:Event):void 
{ 
    e.currentTarget.removeEventListener(e.type, arguments.callee); 

    //Getting the BitmapData of the Image: 
    BitmapDataOfMyTexture = Bitmap(LoaderInfo(e.target).content).bitmapData 

    //Create an ADDITIONAL BitmapData-Object with 3rd 
    //argument set to TRUE and with same width and height 
    //as the LOADED image: 
    var BMDContainerWithAlphaActivated:BitmapData; 
    BMDContainerWithAlphaActivated = new BitmapData(BitmapDataOfMyTexture.width, BitmapDataOfMyTexture.height, true, 0xFFFFFF); 

    //Copy the pixels of the loaded image into the newly created 
    //"BitmapData-Container with activated AlphaChannel": 
    BMDContainerWithAlphaActivated.copyPixels(BitmapDataOfMyTexture, new Rectangle(0, 0, BitmapDataOfMyTexture.width, BitmapDataOfMyTexture.height), new Point(0,0)) 

    //Modify the Alpha-Value (of the NEW BitmapData-Object): 
    var colorChanges:ColorTransform = new ColorTransform(); 
     colorChanges.alphaMultiplier = 0.3; 
    BMDContainerWithAlphaActivated.colorTransform(new Rectangle(0, 0, BitmapDataOfMyTexture.width, BitmapDataOfMyTexture.height), colorChanges); 


    //"Using" the (NEW) BitmapData as "Color/Texture" for my Drawing: 
    myDrawContainer.graphics.lineBitmapStyle(BMDContainerWithAlphaActivated); 

    //Test-Drawing: 
    myDrawContainer.graphics.moveTo(0, 0); 
    myDrawContainer.graphics.moveTo(500, 500); //-> RESULT: Textured Line WITH Transparency 0.3!   
} 
+0

могли бы вы опубликовать фактическую (соответствующий) код, который помог бы нам помочь вы намного лучше, имо. – DodgerThud

+0

Хорошо! Я отправлю код (см. Выше)! –

+0

Хорошо, я думаю, проблема в следующем. Изменение альфа-значения 'myLoader.content' не изменит свойства' bitmapdata' загруженного png-файла. Вы просто изменяете внутреннее альфа-значение вспышки объекта. Поэтому, когда вы передаете содержимое загруженного файла, он по-прежнему имеет те же битмаддаты, что и раньше. Теперь у меня есть вопрос, почему бы просто не установить значение alpha myDrawContainer прямо на нужное значение, например 'myDrawContainer.alpha = 0.6'? – DodgerThud

ответ

1

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

Хорошо, глядя на documentation для lineBitmapStyle показывает мне, что функция ожидает следующие параметры: lineBitmapStyle(bitmap:BitmapData, matrix:Matrix = null, repeat:Boolean = true, smooth:Boolean = false)

Теперь матрица, повторение и сглаживать не поможет нам здесь (матрица используется здесь для трансформации, то есть позиционирование, вращение и т. д.), но растровое изображение: BitmapData может. Что нам нужно сделать, так это манипулировать BitmapData загруженного PNG-файла, прежде чем передавать его на lineBitmapStyle. К сожалению, мы не можем установить альфа-значение непосредственно на BMD, поэтому мы можем попробовать colorTransform.

Это непроверенный код, но я думаю, что это правильный подход:

.. 
//store the bitmapdata in a seperate local variable 
var bmd:BitmapData = LoaderInfo(e.target).content; 
//create a ColorTransform Object to change the values of the BMD 
var cTransform:ColorTransform = new ColorTransform(); 
//now here I am unsure, manipulating the alpha value of the BMD 
cTransform.alphaMultiplier = 0.6; 
//defining the rectangle dimensions of the bmd, we want it to be over the entire texture 
var rect:Rectangle = new Rectangle(0,0,bmd.width,bmd.height); 
//apply the colorTransformation on the BMD 
bmd.colorTransform(rect,cTransform); 
... 
//the now manipulated BMD gets set as lineBitmapStyle 
myDrawContainer.graphics.lineBitmapStyle(bmd); 

И теперь, когда я думаю об этом, возможно, мы сможем обойти настройки альфа-значение на БМД, путем создания растрового изображения первого , установите там значение альфа и вместо этого используйте битмаддаты Bitmap. Как это:

var bmd:BitmapData = LoaderInfo(e.target).content; 
var bm:Bitmap = new Bitmap(bmd); 
bm.alpha = 0.6; 
myDrawContainer.graphics.lineBitmapStyle(bm.bitmapData); 

Хорошо, первый фрагмент сверху, кажется, способ сделать это, но значение BitmapData transparent должно быть правдой. Учитывая, что вы непосредственно не создаете BitmapData самостоятельно, а значение ложно, у нас здесь довольно сложная ситуация.

Другой подход должен был бы создать дополнительный BitmapData, который позволяет ПРОЗРАЧНОСТИ и draw() BitmapData загруженного изображения на нем:

var bmdSource:BitmapData = LoaderInfo(e.target).content; 
var bmd:BitmapData = new BitmapData(bmdSource.width, bmdSource.height,true,0xffffffff); 
var cTransform:ColorTransform = new ColorTransform(); 
cTransform.alphaMultiplier = 0.6; 
var rect:Rectangle = new Rectangle(0,0,bmd.width,bmd.height); 
bmd.colorTransform(rect,cTransform); 
//now we have a completely white bitmapdata bmd, with an alpha value of 0.6 
//we draw the contents of the bmdSource onto bmd, the alpha value effect should carry over 
bmd.draw(bmdSource); 
+0

К сожалению, оба подхода не работают. Второй, похоже, не имеет никакого эффекта. Первая делает текстуру DARKER (нижнее альфа-значение = более темная текстура). Любая идея почему. –

+0

Хм, извините, нет. Не могли бы вы проследить свойство 'transparent' на' bmd' сразу после создания 'bmd'из моего фрагмента. Это свойство только для чтения, но это скажет нам, поддерживает ли bitmapdata даже прозрачность. – DodgerThud

+0

Мы, похоже, приближаемся: когда я прослеживаю это, он возвращает FALSE. Так что bitmapdata пока не поддерживает прозрачность. Но я не знаю способ «активировать» прозрачность.Я знаю, что я могу применять прозрачность при создании bitmapdata-объекта с помощью «new» (=> new bitmapdata (width, height, true). Но, как вы можете видеть в моем коде, я не создаю объект bitmap-data-object с «новым», но возвращая битмапдату из Bitmap (LoaderInfo (e.target) .content) .bitmapData. -> И возвращаемое BitmapData ... –

Смежные вопросы