Building en bedre Bitmap Button i AS3
Del
Del
en
Del
Dette Cyber mandag Envato Tuts + kurs vil bli redusert til bare $ 3. Ikke gå glipp av.
Bygge en knapp fra en bitmap kan være belastende. Hvis du bruker Flash IDE, kan du lage en maske for å finne ut hvilke piksler er en del av knappen, og som ikke er det, men i en annen arbeidsflyt, hele rektangelet som inneholder bitmap - inkludert eventuelle gjennomsiktige piksler - vil være klikkbar . I denne opplæringen vil du lære hvordan du automatisk gjøre alle gjennomsiktige piksler klikkes, med bare noen få linjer med kode.
Endelig resultat Forhåndsvisning
La oss ta en titt på det endelige resultatet vil vi jobbe mot:
Legg merke til at hånden markøren vises kun når svever over det faktiske bildet; selv hull i håret ikke føre til at den skal vises. Og det er ikke bare for show: knappetrykk bare registrere når du klikker på disse områdene
Innledning:.? Hva er så spesielt
Ved første øyekast ovenfor vises SWF ekstremt enkelt . Men se nærmere! Legg merke til hvordan i demoen ovenfor, er et tastetrykk telles bare hvis du klikker et sted på selve bildet. Dette er ikke det som normalt ville skje. Siden et bitmap bilde er alltid et rektangel klikke hvor som helst inne i sin rektangel normalt ville telle som et knappetrykk. Ta en titt på eksempelet nedenfor, hvor jeg har skissert grensen rektangel av vårt bilde. Her kan du klikke hvor som helst inne i rektangelet, inkludert de gjennomsiktige områdene.
Som du kan se, er dette ikke hva vi vil! For det første kan en bruker ved et uhell klikker du på knappen når han ikke betyr å. I tillegg ser det rart når en hånd markør kommer over mellomrom. I denne opplæringen vil du lære hvordan du enkelt kan løse disse problemene.
Hvis du ikke allerede er kjent med objektorientert programmering eller FlashDevelop, anbefaler jeg å sjekke ut de medfølgende koblingene før du starter denne opplæringen.
Trinn 1: Komme i gang
Åpne opp FlashDevelop og opprette et nytt AS3 prosjekt ( Prosjekt > Nytt prosjekt Vi trenger nå et bilde å jobbe med. Her er den jeg bruker: Hvis du vil bruke et punktgrafikkbilde (for eksempel en JPEG-fil eller en .png fil) i Actionscript 3, må vi legge det. FlashDevelop gjør dette enkelt. Etter å ha lagret bilde over et sted, høyreklikker du på lib Bildet du valgte vil nå vises i lib Deretter vil vi legge til en Textfield for å vise hvor mange ganger vi har klikket på knappen ( som vil bli lagt ved). Legg dette til main (): Koden ovenfor bare formaterer teksten som skal vises øverst i midten av vårt prosjekt. Ikke gå glipp av hvordan vi erklært vår Textfield på linje 15. Denne koden skal også gå i Main (): Når vi instantiate vår BitmapButton i linje 36, passerer vi vår innebygd bilde klassen som en parameter. Dette vil bli brukt av BitmapButton klassen. Etter dette kan vi bare behandle vår BitmapButton eksempel som alle andre Displayobject: vi kan plassere den og legge en MouseEvent.CLICK lytteren som vi normalt ville Legg til dette hendelseshåndterer funksjonen til Main.as: Den siste delen av koden i vår Hoved klassen er tilfelle lytteren for knapp klikk. I det, vi bare legge en til antall klikk, numClicks, og oppdatere teksten i clicksTextField Flip over til BitmapButton.as. Først importerer disse klassene: Deretter erklærer disse: Du må sørge for at BitmapButton klassen strekker Sprite, siden en Bitmap i seg selv ikke kan ha noen mus interaktivitet. (The Bitmap klassen ikke strekker InteractiveObject.) I vår BitmapButton konstruktør, vi oppnå et par viktige ting Vår enkle ser MOUSE_MOVE hendelse lytteren er den virkelige hjernen bak vår klasse. Hovedformålet er å avgjøre om musepekeren er over en gjennomsiktig piksel eller ikke. La oss se på hvordan den gjør dette. Den første linjen får farge og gjennomsiktighet på pikselen at markøren er i dag over. For å gjøre dette, bruker vi getPixel32 () metode for den variable bitmapData (som, husk, er bitmap data representasjon av vårt bilde). Vi må passere en x- og y-koordinat til getPixel32 () , så naturlig vi bruke musens posisjon. Kallet returnerer deretter en uint representerer farge og gjennomsiktighet på pikselen ved stedet vi følger med. Farger i Flash er normalt behandlet som en heksadesimale UINT i formatet RRGGBB. De to første sifrene representerer mengden av rødt i farge, de neste to, grønn, og de to siste, blå. Men getPixel32 () gir oss en spesiell uint representerer vår piksel i formatet AARRGGBB. Her er de to første sifrene representerer alpha Så, for eksempel, FF980000 vil representere en helt ugjennomsiktig rød farge, mens 00980000 ville representere en fullstendig gjennomsiktig rød farge. Du vil vanligvis se disse representert som 0xFF980000 eller 0x0098000: den "0x" lar deg (og Flash!) Vet at tallet er i heksadesimal (0-f), i stedet for desimal (0-9) På dette punktet har vi en uint kalt pixel som holder fargen og alfa på pikselen under vår mus i AARRGGBB format. Dessverre er dette for mye informasjon. Alt vi bryr oss om er åpenhet i denne piksel, eller AA delen. Du kan skrive et matematisk uttrykk for å få tak i denne delen - faktisk int (pixel /Math.pow (16,6)) ville fungere. Dette er en noe vanskelig uttalelse, skjønt, og tregere ytelse-messig enn et annet alternativ vi har: bitvis usignert høyre shift operatør, > > >. Vår variabel piksel er bare et binært tall til Flash . Vi skriver det normalt i heksadesimale bare for å gjøre den mer lesbar. Uten å gå i for mye detalj, kan hver siffer i et heksadesimalt tall representeres av en streng med fire binære siffer, en enten 0 eller 1. (Så, bruker hver heksadesimale sifrene 0-f, bruker desimal 0-9, og binære bruker 0-1.) Si vi har et heksadesimalt tall, D4. I binær, ville dette være representert som 11010100. Legg merke til hvordan vi bruker åtte binære siffer for binære representasjon: fire ganger så mange som i heksadesimale Med dette er tankene, la oss undersøke hva > > >.; operatør faktisk gjør. Lar bruke vår forrige eksempel, det heksadesimale tallet D4, eller 0xD4 for klarhet. Nå la oss bruke > > > som så: Legg merke til at 4 er en normal desimal representasjon av et tall (det er ingen "0x" på start). Dette uttrykket egentlig turnus hver binær 0xD4, i binær, er 11.010.100. Påfør fire skift, og det blir 1101. I heksadesimale, er dette 0XD. Hvis du har problemer med å forstå dette, tenk de binære siffer som blokker som sitter på høyre side av et bord. Den > > > Operatøren er akkurat som presser blokkene til høyre. Her er vår opprinnelige binært tall: Nå her er vår nye nummer, etter at vi gjør 0xD4 > > > 4: Legg merke til hvordan etter at vi flyttet 0xD4 av 4 biter, endte vi opp med bare 0XD? Det er ikke en tilfeldighet. Som sagt før, er hver heksadesimalsiffer består av 4 binære siffer - så hver gang vi skifte den til høyre med 4, vi egentlig banke én heksadesimalsiffer av enden. Du kan sannsynligvis se hvor vi kommer med dette! Tilbake til vår piksel, i 0xAARRGGBB format. Hvis vi skifte det ved 24, er vi faktisk skiftende av 6 heksadesimale sifre. Dette betyr at RRGGBB del blir slått av, og vi ender opp med bare 0xAA del venstre, som er vår alfa komponent En rask talleksempel. Si vår piksel er lik FF980000. I binær, dette er 1111 1111 1001 1000 0000 0000 0000 0000 (Hver gruppe på 4 siffer representerer en heksadesimalsiffer.) Når vi skifte denne med 24, vi bare ender opp med 1111 1111, eller FF, våre to gjennomsiktighet sifre. Ta en titt på det igjen: OK, (pixel > > > 24 ) del er fornuftig nå, men hva med resten? Det er lett. Vi sjekker om vår alpha komponent (resultatet av pixel > > > 24), er større enn verdien av TERSKEL (som for tiden er satt til 0). Hvis det er, useHandCursor og buttonMode er satt til sann, noe som vil gjøre markøren endring i en hånd. Dette gjør vår image virke som en knapp. Hvis vår alpha komponent er mindre enn eller lik TERSKEL, vil markøren være normal, siden musen er over et (semi-) gjennomsiktig piksel. Siden vi har den satt til 0, bare helt gjennomsiktige bildepunkter vil ikke inngå som en del av vår knappen, men du kan sette dette til, si, 0x80, og da ville det vise hånden markøren for noe som er mer enn halvparten gjennomsiktig. Den siste delen av vår BitmapButton klassen er MouseEvent.CLICK arrangementet lytteren. Denne funksjonen vil bli kalt hver gang vår image klikkes, enten det piksel er uansett gjennomsiktig eller ikke. (Endre musepekeren som vi gjorde før vil ikke påvirke selve MouseEvent.) Så hver gang det er en klikk, sjekker vi det useHandCursor eiendommen. Hvis det er sant, betyr dette at musen er over en normal piksel i vårt bilde, og vi trenger ikke å gjøre noe. Dette er fornuftig - arrangementet vil deretter fortsette til hendelsen lytteren vi lagt i Main.as. Men hvis useHandCursor er falsk, må vi gjøre noe for å stoppe hendelsen fra å fortsette videre til andre hendelsen lyttere. Til dette bruker vi den stopImmediatePropagation () metode som alle tilstelninger objekter har. Enkelt sagt, dette stopper flyten av hendelsen, og ingen flere event lyttere vil motta den. I så fall vil vårt arrangement lytteren funksjon i Main.as aldri bli kalt Advarsel: Dette kan ha en ekkel bivirkning - noen global hendelse lytteren vil ikke få arrangementet heller.. Hvis du er bekymret for dette, kan du prøve å legge linjen parent.dispatchEvent (e.clone ()); etter e.stopImmediatePropogation (). Selv om dette er utenfor omfanget av opplæringen, anbefaler jeg å lese mer om arrangementet systemet her. Dette brytes opp vår tutorial! Takk for lesing, og jeg håper du har lært noe nytt En liten advarsel når du bruker vår BitmapButton klasse -. Andre MouseEvents vil fortsatt fungere som normalt, siden vi bare jobbet med MouseEvent.CLICK. Hvis du ønsker, kan du bruke den samme teknikken vi brukte for MouseEvent.CLICK og bruke den til andre hendelser, som for eksempel MouseEvent.MOUSE_DOWN. Vår BitmapButton klassen tillater oss å raskt og enkelt lage flotte knapper fra punktgrafikkbilder med åpenhet, slik vi gjorde i denne demoen. Hvis du har noen spørsmål, vil jeg være glad for å svare på dem, bare legge igjen en kommentar nedenfor. Anmeldelser
) og kaller det noe sånt som BitmapButtonProj. På høyre, åpne opp src
mappen og dobbeltklikk Main.as å åpne den. Legg til en ny klasse i prosjektet ( høyreklikk /src /> Legg til > New Class
) kalt BitmapButton
Trinn 2: Inkludering et bilde
mappen til høyre, musen over Legg
, og velger Bibliotek Asset
alternativet.
< p> Hvis du ønsker å bruke ditt eget bilde, må du velge en med åpenhet.
mappe i FlashDevelop. Høyreklikk på bildet og velg Generer inn kode
public class Hoved strekker Sprite {[Bygg (kilde = "../lib/face.png")] privat Var ButtonImg. Class; < p> Denne koden bygger inn bildet i vårt prosjekt. Når du bygger inn et bilde, må du definere på neste linje en klasse som representerer det bildet du innebygd. I dette tilfellet er vår klasse kalt ButtonImg
Trinn 3:. Legge til en Textfield
clicksTextField = new Textfield (); clicksTextField.width = stage.stageWidth; clicksTextField.defaultTextFormat = new tekstformat (null, 14, 0, true, false, false, null, null, TextFormatAlign. midten); clicksTextField.text = "knappetrykk:" + numClicks; clicksTextField.mouseEnabled = false; addChild (clicksTextField);
Trinn 4: Legge til Button
Var knapp: BitmapButton = new BitmapButton (ButtonImg); button.x = stage.stageWidth /2 - button.width /2; button.y = stage.stageHeight /2 - button.height /2; addChild (knapp); button.addEventListener (MouseEvent .Klikk, onButtonClick);
Trinn 5:. Making the Button gjøre noe
privat funksjon onButtonClick (e: MouseEvent): void {numClicks ++; clicksTextField.text = "knappetrykk:" + numClicks;}
Trinn 6:. Den BitmapButton Constructor
import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Sprite; import flash.events.MouseEvent;
private Var bitmapData: BitmapData; privat konst GRENSE: Antall = 0;
Offentlig funksjon BitmapButton (ImageData: Klasse) {var bilde: Bitmap = new ImageData (); addChild (image); bitmapData = image.bitmapData; addEventListener (MouseEvent.MOUSE_MOVE, onMouseMove); addEventListener (MouseEvent.CLICK, onClick);}
Først oppretter vi en ny Bitmap, heter image, fra bildet klassen. sendes som en parameter til konstruktøren.
Vi deretter legge dette Bitmap som et barn av vår Sprite.
Deretter setter vi verdien av bitmapData til lik bitmapData av vårt image.
Til slutt legger vi KLIKK og MOUSE_MOVE hendelsen lyttere
Trinn 7:. Den MOUSE_MOVE hendelse lytteren
privat funksjon onMouseMove (e: MouseEvent): void {var pixel: uint = bitmapData.getPixel32 (mouseX, mousey); useHandCursor = buttonMode = ((pixel > > > 24) > GRENSE); }
Den getPixel32 () Funksjon
, eller mengden av åpenhet, fra 00 (klar) til FF (ugjennomsiktig).
0xD4 > > > 4
siffer i D4 fire plasser til høyre, og glemmer om noen siffer som ville gå av på slutten av nummeret.
useHandCursor = buttonMode = ((pixel > > > 24) > terskel);
Trinn 8: KLIKK hendelse lytteren
privat funksjon onClick (e: MouseEvent): void {if (! useHandCursor) {e.stopImmediatePropagation (); }}
Konklusjon