Autor Zpráva
FlashManiac
Profil
Zdravím,
mohl by mi prosím někdo objasnit jak funguje třída BitmapData ve Flashi 8? Potřebuju totiž zjistit, jakou barvu maj jednotlivý pixely na ploše. např budu mít na ploše umístěnou barevnou šachovnici a podle barev pixelu na který kliknu se mi provede nějaká akce...

tady je nejaký kod který jsem našel ve Flash nápovědě,ale vůbec z toho nejsem moudrý..(je samozrejmě trochu upravený pro me potreby)
import flash.display.BitmapData;

var barva:BitmapData = new BitmapData(800, 600, true,0);
clip_mc.attachBitmap(barva,0);
//trace("0x" + barva.getPixel(0, 0).toString(16)); // 0xcccccc


_root.onMouseMove=function(){
//barva.setPixel(_root._xmouse,_root._ymouse,0xFF0000);
trace(barva.getPixel(_root._xmouse,_root._ymouse));
}


Hlavně teda nechápu tu deklaraci... var barva:BitmapData = new BitmapData(800, 600, true,0); je mi jasný že 800 a 600 jsou rozměry bitmapy.ale když nastavím průhlednost na true tak mi vůbec neukazuje hexa kód dané barvy, pokud ho nastavím na false, tak se mi zas celý stage pokryje tou barvou kterou jsem nastavil... já ale potřebuju zjistit barvu pixlu na stagi když se tam něco děje...a ne když nic nevidim...
PLS help
FlashManiac
Profil
JO a ještě něco má takový dojem že new BitmapData(800, 600, true,0); nepodporuje dynamické velikosti, že bych místo 800,600 dal proměnné.. pak mi to hlásí undefined, je to možné nějak dynamicky?
Hanz
Profil
FlashManiac
No pořádně nechápu o co ti jde. Popiš co potřebuješ udělat, protže to co jsi tu popsal je přesně to co to má dělat :o)

Jo a s tím dynamicky není problém. Nevím proč ti to nejde, ale mi to jde přez promněnnou.
FlashManiac
Profil
No zkrátka si představ, že mám na poli MC, který má několik druhů barvy například je červeno modro bílý... no a já potřebuju aby když se na ten MC klepne tak se zjistila barva na kterou se kleplo a podle barvy se pak následně vykonala nějaká funkce.. to je vše,ale pořádně se nemůžu dosta ani do té deklarace... tak mi to pls napiš polopaticky..Děkuju XD
P.S. dynamicky to jde .
Hanz
Profil
FlashManiac
Tak ten script je takhle:
import flash.display.BitmapData;

var barva:BitmapData = new BitmapData(clip_mc._width, clip_mc._height);
barva.draw(clip_mc);
onMouseMove = function () {
trace("0x"+barva.getPixel(clip_mc._xmouse, clip_mc._ymouse).toString(16));
};


Jo tu barvu rovnou převádím na hexadecimální hodnotu.
FlashManiac
Profil
Díky moc zachránils mi kožuch...XD
THX
FlashManiac
Profil
ehm, měl bych ještě jeden dotaz... Jak z toho kódu,ať už hexa nebo toho který generuje Flash, dostanu jednotlivé složky RGB např. R=0 G=25 B=120 . V helpu jsem se na to díval ale tak nějak jsem to nepochytil...XD PLS HELP
FlashManiac
Profil
To vázně nikoho nic nenapadá ?
Hanz
Profil
FlashManiac
Já to taky nechápu. Jde o nějaký přepočet, kterému nerozumím (přepočítávají se tak barvy).
http://www.actionscripts.org/tutorials/advanced/Color_fade/index2.shtm l
FlashManiac
Profil
Jo tak uz jsem to dal.. diky... Uz jsem to pochopil..
function hexToRGB(hex:Number){

var red:Number = hex>>16;
var grnBlu:Number = hex-(red<<16);
var grn:Number = grnBlu>>8;
var blu:Number = grnBlu-(grn<<8);
r=red;
g=grn;
b=blu;
trace(red);
trace(grn);
trace(blu);
}

1/ten operátor << odstraní určitý počet bitů z binárního čísla(počítač pracuje jen s binárnímy čísly), čili pokud převedu hexa číslo RGB na binární dostanu 24bitové číslo, kde vím, že prvních 8bitů reprezentuje červenou barvu... Proto posledních 16bitů odseknu, nezajímají mě...8bitové číslo uložím do proměnné a mám červenou barvu...

2/Pak musím odečíst číslo původní 0x... a červenou barvu a získám tak součet zelené a mordré barvy(pro správný výsledek musím 8bitovému číslu připsat dalších 16bitů -16nul- -udělám to operátorem opačným tedy >> 16- Teď tedy odečítám dvě 24bitová čísla)
Získám 16bitové číslo se zakódovanou hodnotou G a B kanálu..

3/vím, že prvních 8bitů v tom 16bitovém čísle z bodu 2/ reprezentuje zelenou barvu, proto udělám stejný krok jako v bodě 1/,ale neuseknu 16bitů ale jen 8..Získám tak 8bitové číslo, reprezentující zelenou barvu a uložím..

4/Následuje poslední krok který je stejný jako bod2/,ale opět odečítám dvě 16bitová čísla(tzn. za zelenou barvu musím opět přidat >> 8nul,abych dostal 16 bitové číslo...
Po odečtení tedy dostanu poslední položku, která je už 8bitová a mám i modrý kanál a uložím....

Hanz
Díky za odkaz...XD

Vím, že tohle povídání je asi zbytečný,ale chtěl jsem ho tu napsat pro ty, kteří by to chtěli použít a nevěděli jak na to... Doufám, že je ten postup pochopitelný...,ale myslím, že v kombinaci s tím odkazem to je OK...je tam všechno krásně rozkreslený..

Nejlepší to asi bude hodit si jako vlastní třídu, nebo si rozšířit třídu Math...
FlashManiac
Profil
Ještě bych rád uvedl i konverzi RGB složek na hexa kód, když už to tu máme tak hezky rozpracované...
function RGBToHex(red:Number,green:Number,blue:Number):Number{

red=red<<16;
green=green<<8;
//blue = blue; tady nic nedelam uvadim jen pro uplnost
hex=red+green+blue;
return hex;
}


Postupy jsou víceméně totožné jako v předchozím příspěvku,ale děje se tak přesně naopak a čísla sčítám, proto se to jeví jako jednodušší.. Doufám, že to někomu pomůže, když by na tento problém narazil...
Toto téma je uzamčeno. Odpověď nelze zaslat.