Creating generativ kunst med HYPE
Del
Del
Del
Del
Dette Cyber mandag Envato Tuts + kurs vil bli redusert til bare $ 3. Ikke gå glipp av.
Dette innlegget er en del av en serie som heter You Do The Math.Simulate prosjektil Motion med Action 3.0Playing Rundt med Elastic Kollisjoner
I løpet av denne opplæringen vi skal knytte matematikk og design sammen. Vi vil utforske Branden Hall og Joshua Davis 'HYPE rammer og skape generativ kunst fra kode.
Endelig resultat Forhåndsvisning
La oss ta en titt på den endelige Resultatet vi skal jobbe mot:
Trinn 1:. Prosjektstruktur
Før dykking hodet langt inn koden la oss ta et kort øyeblikk for å gjøre oss kjent med prosjektfiler
Inne kilden .zip filen du vil finne en mappe for hver betydelig skritt, slik at du kan se nøyaktig hvilke endringer som er gjort. Dessuten vil du finne en mappe som heter Base, lage en kopi av denne mappen som dette er vil tjene som utgangspunkt.
Inne i Base mappen vi har en bin Neste opp, må vi ta tak i siste versjon av HYPE rammeverket fra sitt hjem på www.hypeframework.org. Når nedlastingen er fullført, åpne ZIP-filen. Du vil finne to SWC-filer som heter hype-framework.swc Hotell og hype-extended.swc Disse SWC-filer er egentlig en samling av kildefiler for rammene, alt sammen i én fil for enkel. Det siste trinnet er nødvendig for å få alt opp og kjører er å fortelle Flash for å lete etter de to nye SWC-filer når vi kompilere filmen, ellers vil det kaste en hel haug med feil vår måte, ikke hyggelig! Åpne Main.fla Trykk på "Bla gjennom for å SWC" File-knappen og fortsett å legge begge SWC-filer til Flash-fil. Når dette er fullført er det på tide å begynne å legge noen kode Åpne opp Main.as kildefilen i din valgte editor. Legg til følgende private eiendommer og initHype () metode: I de neste skrittene vi skal se på hver av disse objektene vi har lagt som private eiendommer, starter med clipContainer Sprite. Som vår design kommer til å ha over hundre objekter all flytte rundt på skjermen på en gang, vi kommer til å trenge noe å huse dem alle - bare å legge dem til Stage vil bli problematisk lenger ned linjen. Svaret er å opprette en vanlig AS3 Sprite til å fungere som en forelder Den første virkelige delen av HYPE, de BitmapCanvas kan betraktes som en Sprite eller enda bedre, en Bitmap /BitmapData til som vi skal male våre objekter, hver ramme, som en malere lerret. Vi skaper det like under clipContainer kode og definere det med en bredde og høyde for å matche scenen. Vi legger det til Stage men også fortelle det til startCapture (clipContainer, sant), dette rett og slett forteller BitmapCanvas å ta et øyeblikksbilde av clipContainer hver ramme. For nå skjønt, holde dette kommentert ut Twitter /** * initiering av Hype medlemmene vi skal bruke og konfigurasjon før * å kjøre animasjonen * /private funksjon initHype (): void {//den clipContainer brukes som en forelder for alle våre gjenstander clipContainer = new Sprite (); addChild (clipContainer); //Tenk på BitmapCanvas som et tomrom vi vil "maling" //hver ramme med nye bildedata bitmapCanvas = nye BitmapCanvas (stage.stageWidth, stage.stageHeight); //bitmapCanvas.startCapture(clipContainer, true); addChild (bitmapCanvas); }} Hvis du har jobbet med spill har du sannsynligvis kommet over begrepet en ObjectPool. Som å lage nye objekter er for mye av en hit på prosessoren skaper vi en pool av en spesifisert mengde gjenstander før spillet eller programmet starter. Vi vil deretter bruke objektene fra dette bassenget og ved å kjøre ut ville vi resirkulere og gjenbruke dem alle igjen, som unngår å skape nye objekter. Dette er ofte brukt for kuler /lasere i spill og den samme logikken brukes i HYPE. Hvis du tar en titt på Main.fla biblioteket i Flash vil du se Jeg har opprettet en MovieClip kalt circleShape og gitt det Linkage Identifier av circleShape slik at vi kan lage flere kopier av dette objektet med kode; Dette er hva vår ObjectPool vil Hus Legg til ObjectPool under BitmapCanvas kode, slik:. Twitter /** * initiering av Hype medlemmene vi skal bruke og konfigurasjon før * å kjøre animasjonen * /privat funksjon initHype (): void {//den clipContainer brukes som en forelder for alle våre gjenstander clipContainer = new Sprite (); addChild (clipContainer); //Tenk på BitmapCanvas som et tomrom vi vil "maling" //hver ramme med nye bildedata bitmapCanvas = nye BitmapCanvas (stage.stageWidth, stage.stageHeight); //bitmapCanvas.startCapture(clipContainer, true); addChild (bitmapCanvas); //Oppretter en samling av 10 objekter og lagre dem i en ObjectPool //for bruk i animasjonen objectPool = new ObjectPool (circleShape, 10); } Nå har vi vår kjernespillere oppsett, den clipContainer, de BitmapCanvas og ObjectPool med sine 10 klipp, er det på tide å begynne gjøre ting flytte For å få et element fra ObjectPool vi kan bruke objectPool.request (.); som vil gi oss en circleShape MovieClip fra Flash Library å arbeide med. ObjectPool gir oss også objectPool.onRequestObject () metode som er en praktisk måte å tildele egenskapene til et klipp hver gang vi be om en. Legg til følgende under der du instansiert den ObjectPool: Med det nye koden lagt til, hver gang vi ber om et objekt fra bassenget ved hjelp objectPool.request () det vil skape en circleShape. Legg det til clipContainer og plasser den tilfeldig på skjermen. Du kan teste dette ved å endre konstruktøren å se ut som følgende: Twitter /** * Konstruktør * /public funksjonen main () {//inits Hype rammeverket initHype (); objectPool.request (); } Hvis alt gikk bra du bør ha et enkelt, ensom sirkel på skjermen Husker du vi setter ObjectPool størrelse til 10? Vel, vi kommer til å øke innsatsen og øke dette til 100 gjenstander ved å endre følgende: Vi kan endre tidligere anmodning uttalelse til å lyde som requestAll () slik: Twitter /** * Konstruktør * /public funksjonen main () {//inits Hype rammeverket initHype (); objectPool.requestAll (); } Nå bør vi ha 100 sirkler spredt over skjermen område Nå har vi våre 100 circleShapes fordelt rundt på skjermen er det på tide å gjøre vår design kommer til liv ved å legge til bevegelse. La oss begynne med å påføre en FixedVibration til alfa og skala egenskapene til hvert klipp. Vi kan bruke ObjectPools onRequestObject metode for å gjennomføre det som vist: La oss ta en nærmere titt på de FixedVibration stedene vi opprettet. Hver FixedVibration objekt skaper vi tar 7 parametre, henholdsvis de er som følger:. Så hvordan alle disse passer sammen? La oss se på hvordan skalaen eiendommen er berørt av FixedVibration. Det har gitt minimums- og maksimumsverdier på 0,05 og 0,8, er Spring verdi ganske høy på 0,9 og Hjelpemiddel er ganske lav på 0,05 noe som gjør det skalere uberegnelig og rask. Ha en leke seg med disse verdiene for å få en føler for hvordan de påvirker bevegelsen Når vi teste våre Flash-fil vi skal få noe som dette. Svært lik til FixedVibration, vil VariableVibration justere en egenskap av et objekt med en verdi som svinger. Forskjellen er at VariableVibration ikke er lineær som navnet antyder. Endre koden som følger for å plassere klippene til midten av scenen, bare denne gangen vil vi bruke en VariableVibration til x og y-verdier for å begynne å se noen bevegelse La oss ta en nærmere titt på de VariableVibration stedene vi opprettet. Hver VariableVibration objekt skaper vi tar bare fem parametere, henholdsvis de er som følger:. Vår Flash-fil skal se omtrent slik ut når publisert:. Det begynner å se bra ut, men vi kan gjøre mye bedre! Husk at bitmapCanvas.startCapture () linje jeg ba deg holde uncommented vei tilbake i trinn 6? Gå videre og uncomment det deretter teste filmen igjen Dette er mer som det Et veldig enkelt triks å legge til en spiralbevegelse er å legge til en annen vibrasjon til klippets rotasjon eiendom som så: Før test av dette hoppet over til Flash og åpne circleShape MovieClip i biblioteket Som vist, dra sirkelen bare. off fra sentrum i alle retninger. Jo lenger du flytter den fra sentrum, vil flere spiraler vises i design når du publiserer: Et problem med vår nåværende animasjon er at når klipsene flytte ut av skjermen, de svært sjelden kommer tilbake. Vi kan løse dette lille problemet ved å opprette en ExitShapeTrigger. En ExitShapeTrigger er et område som trygt for klippet. Når klippet forlater dette området må vi utføre noen form for funksjon, for eksempel ber om en ny klipp fra ObjectPool Vi definerer en ExitShapeTrigger som følger:. Dette vil skape en ExitShapeTrigger med følgende parametre: Etter fra ExitShape vi introdusert i det siste trinnet, vi skaI å bare redigere onExitShape metoden slik at når et klipp flyttes ut av vinduet, vil vi slette det og be om en ny en fra ObjectPool. Inntil nå har vi jobbet med anmodning ( ) og requestAll () metoder for ObjectPool, når vi ønsker å slette den gamle vi bruker utgivelsen (klipp) metode: HYPE har muligheten til å raskt og enkelt legge til filtre som uskarphet og glød til objekter. For å legge til et snev mer pizzazz til design vi kommer til å legge en BlurFilter til prosjektet bruker FilterCanvasRhythm: Listen kode oppretter en FilterCanvasRhythm som tar et filter som parameter og bruker den til de bitmapCanvas vi erklært tidligere Test prosjektet, er det virkelig begynner å komme sammen nå Vi kan enkelt legge til en litt dybde til sammensetningen ved å legge til flere figurer i blandingen. Snarere enn å måtte opprette og administrere flere ObjectPools, kan vi legge til rammer til den opprinnelige circleShape vi brukt og tilfeldig velge hvilken ramme å spille. Prøv dette nå, redigere circleShape objektet i Flash Biblioteket. Opprett en ny Keyframe, velge en ny farge og tegne en ny form. Gå videre og lage noen nøkkelbilder av dine egne, i neste trinn skal vi se på å implementere dem med kode. Dette er vår nye form: .. sammenlignet med vår gamle form: Med vår circleShape nå sportslige et par nye nøkkelbilder kan vi bare sette inn denne eneste linje med kode for å velge en ramme som skal brukes hver gang vi kaller objectPool.request (): Som en rask notat, tilfeldig ramme koden ovenfor vil veksle mellom rammer 1, 2 og 3. Du må kanskje justere dette til mengden av rammer i circleShape. Det er på tide å teste filmen og sole seg i blanding av funky mønstre og farger som HYPE rammeverket tar koden din og blander det inn i et stykke generativ kunst Heres den endelige kode for referanse: Denne omtrent brytes opp innføre HYPE rammeverk, tusen takk for tiden din. Jeg håper du likte det, og husker vi bare skrapet overflaten av noen av de fantastiske effekter som kan gjøres med rammeverket. Vennligst sjekk ut HYPE rammeverket hjemmeside www.hypeframework.org for noen fantastiske eksempler på rammen og hvordan andre har tatt det til neste nivå med Away3D /Papervision integrering!
mappen der vår SWF vil bli offentliggjort. En src
mappen som inneholder vår Actionscript 3 og Flash-filer, og til slutt en lib
mappe hvor vi vil lagre HYPE ramme sin SWC-filer
Trinn 2.: Får HYPE
. Kopierer begge disse til din Base \\ lib mappen.
Trinn 3: Legge SWCS til Flash
inne i Base \\ src
mappen, og velg Fil, Publish Settings. Velg fanen Flash som vist, i det nye vinduet som åpnes velger du Library Path kategorien.
Trinn 4: Init HYPE
public class Hoved strekker MovieClip {//private eiendommer private Var bitmapCanvas: BitmapCanvas; private Var clipContainer: Sprite; private Var objectPool: ObjectPool; /** * Konstruktør * /public funksjonen main () {//inits Hype rammeverket initHype (); } /** * Initiering av Hype medlemmene vi skal bruke og konfigurasjon før * å kjøre animasjonen * /private funksjon initHype (): void {//den clipContainer brukes som en forelder for alle våre gjenstander clipContainer = new Sprite (); addChild (clipContainer); }}
Trinn 5:. De BitmapCanvas
Trinn 6: ObjectPool
Trinn 7: Opprette objekter ved hjelp ObjectPool.request ();
//skape en samling av 10 objekter og lagre dem i en ObjectPool //for bruk i animasjonen objectPool = new ObjectPool (circleShape, 10); //Hver gang vi ber om en ny form fra bassenget //vil det utføre følgende objectPool.onRequestObject = function (klipp: MovieClip): void {clip.x = Math.random () * stage.stageWidth; clip.y = Math.random () * stage.stageHeight; clipContainer.addChild (klipp); }
Trinn 8: Se resultatet
Trinn 9:. Ber om alle objekter samtidig
//skape en samling av 10 objekter og lagre dem i en ObjectPool //for bruk i animasjonen objectPool = new ObjectPool (circleShape , 100);
Trinn 10:. Legge FixedVibrations
//skape en samling av 10 objekter og lagre dem i en ObjectPool //for bruk i animasjonen objectPool = new ObjectPool (circleShape, 100); //Hver gang vi ber om en ny form fra bassenget //vil det utføre følgende objectPool.onRequestObject = function (klipp: MovieClip): void {clip.x = Math.random () * stage.stageWidth; clip.y = Math.random () * stage.stageHeight; //Legge en FixedVibration til alfa og skala egenskapene til hver circleShape når ba Var alphaVib: FixedVibration = new FixedVibration (klipp, "alpha", 0,9, 0,05, 0,5, 1,5, false); Var scaleVib: FixedVibration = new FixedVibration (klipp, "scale", 0,9, 0,05, 0,05, 0,8, false); alphaVib.start (); scaleVib.start (); clipContainer.addChild (klipp); }
Eiendommen å bruke FixedVibration til, denne gangen vi jobber med alfa og skalaegenskaper.
Den tredje parameteren er våren den FixedVibration, jo høyere tall jo mer "spenstig" bevegelsen. En verdi mellom 0 og 1 vil fungere best.
Endelig er relativ siste parameter, misligholde denne til false.
Trinn 11: Legge til en VariableVibration
//hver gang vi ber om en ny form fra bassenget //vil det utføre følgende objectPool.onRequestObject = function (klipp: MovieClip): void {clip.x = stage.stageWidth /2; clip.y = stage.stageHeight /2; //Legge en VariableVibration for x /y bevegelse av hver circleShape Var XVIb: VariableVibration = new VariableVibration (klipp, "x", 0,97, 0,03, 40); Var yVib: VariableVibration = new VariableVibration (klipp, "y", 0,97, 0,03, 40); xVib.start (); yVib.start (); //Legge en FixedVibration til alfa og skala egenskapene til hver circleShape når ba Var alphaVib: FixedVibration = new FixedVibration (klipp, "alpha", 0,9, 0,05, 0,5, 1,5, false); Var scaleVib: FixedVibration = new FixedVibration (klipp, "scale", 0,9, 0,05, 0,05, 0,8, false); alphaVib.start (); scaleVib.start (); clipContainer.addChild (klipp); }
eiendom å bruke VariableVibration til, denne gangen vi jobber med x og y egenskaper.
Den tredje parameteren er våren vibrasjonen.
Neste er opp Brukervennlighet vibrasjons .
Den siste parameteren er Range av verdier som er produsert. Jo høyere tall, jo mer uberegnelig effekten
Trinn 12: Legge Noen Wow
Trinn 13:.! En rask Trick for Rotation
//hver gang vi ber om en ny form fra bassenget //vil det utføre følgende objectPool.onRequestObject = function (klipp: MovieClip) : void {clip.x = stage.stageWidth /2; clip.y = stage.stageHeight /2; //Legge en VariableVibration for x /y bevegelse av hver circleShape Var XVIb: VariableVibration = new VariableVibration (klipp, "x", 0,97, 0,03, 40); Var yVib: VariableVibration = new VariableVibration (klipp, "y", 0,97, 0,03, 40); xVib.start (); yVib.start (); //Legge en FixedVibration til alfa og skala egenskapene til hver circleShape når ba Var alphaVib: FixedVibration = new FixedVibration (klipp, "alpha", 0,9, 0,05, 0,5, 1,5, false); Var scaleVib: FixedVibration = new FixedVibration (klipp, "scale", 0,9, 0,05, 0,05, 0,8, false); alphaVib.start (); scaleVib.start (); //Legge en FixedVibration til rotasjonen av circleShape Var rotationVib: FixedVibration = new FixedVibration (klipp, "rotasjon", 0,9, 0,05, 0, 360, false); rotationVib.start (); clipContainer.addChild (klipp); }
Trinn 14: A Quick Trick for Rotation
Trinn 15: ExitShapes
//Hver gang vi ber om en ny form fra bassenget //vil det utføre følgende objectPool.onRequestObject = function (klipp: MovieClip): void {clip.x = stage.stageWidth /2; clip.y = stage.stageHeight /2; //Legge en VariableVibration for x /y bevegelse av hver circleShape Var XVIb: VariableVibration = new VariableVibration (klipp, "x", 0,97, 0,03, 40); Var yVib: VariableVibration = new VariableVibration (klipp, "y", 0,97, 0,03, 40); xVib.start (); yVib.start (); //Legge en FixedVibration til alfa og skala egenskapene til hver circleShape når ba Var alphaVib: FixedVibration = new FixedVibration (klipp, "alpha", 0,9, 0,05, 0,5, 1,5, false); Var scaleVib: FixedVibration = new FixedVibration (klipp, "scale", 0,9, 0,05, 0,05, 0,8, false); alphaVib.start (); scaleVib.start (); //Legge en FixedVibration til rotasjonen av circleShape Var rotationVib: FixedVibration = new FixedVibration (klipp, "rotasjon", 0,9, 0,05, 0, 360, false); rotationVib.start (); //Definere en ExitShape Var exit: ExitShapeTrigger = new ExitShapeTrigger (onExitShape, klipp, exitShape, true); exit.start (); clipContainer.addChild (klipp); } //Recycle objekter privat funksjon onExitShape (klipp: MovieClip): void {trace ("! CircleShape venstre på skjermen"); }
Metoden for å utløse når hendelsen har skjedd
MovieClip å teste om det er ute av gitt. området.
MovieClip brukes til å definere trygt område, har du kanskje allerede lagt merke til at vi allerede har skapt dette, heter det exitShape og plassert den på scenen i Flash.
Den siste parameteren er Enter Når flagget, bare sette denne til true for nå
Trinn 16:. ObjectPool Slipp
//recycle objekter privat funksjon onExitShape (klipp: MovieClip): void {//fjerne fra ObjectPool og clipContainer objectPool.release (klipp); clipContainer.removeChild (klipp); //Få et nytt klipp fra ObjectPool objectPool.request (); }
Trinn 17: Legge til en Blur
//tenk på BitmapCanvas som et tomrom vi vil "maling" //hver ramme med ny bildedata bitmapCanvas = nye BitmapCanvas (stage.stageWidth, stage.stageHeight); bitmapCanvas.startCapture (clipContainer, true); addChild (bitmapCanvas); //Legger til en blur Var uskarphet: FilterCanvasRhythm = new FilterCanvasRhythm ([ny BlurFilter (1.1, 1.1, 1)], bitmapCanvas); blur.start (TimeType.TIME, 100); //Opprette en samling av objekter og lagre dem i en ObjectPool //for bruk i animasjonen objectPool = new ObjectPool (circleShape, 100);
Trinn 18:.! Legge Noen Diversity
Trinn 19: Velge Random Rammer for circleShape
//hver gang vi ber om en ny form fra bassenget //det vil utføre følgende objectPool .onRequestObject = function (klipp: MovieClip): void {clip.x = stage.stageWidth /2; clip.y = stage.stageHeight /2; //Velge en tilfeldig ramme clip.gotoAndStop (Math.ceil (Math.random () * 3)); //Legge en VariableVibration for x /y bevegelse av hver circleShape Var XVIb: VariableVibration = new VariableVibration (klipp, "x", 0,97, 0,03, 40); Var yVib: VariableVibration = new VariableVibration (klipp, "y", 0,97, 0,03, 40); xVib.start (); yVib.start (); //Legge en FixedVibration til alfa og skala egenskapene til hver circleShape når ba Var alphaVib: FixedVibration = new FixedVibration (klipp, "alpha", 0,9, 0,05, 0,5, 1,5, false); Var scaleVib: FixedVibration = new FixedVibration (klipp, "scale", 0,9, 0,05, 0,05, 0,8, false); alphaVib.start (); scaleVib.start (); //Legge en FixedVibration til rotasjonen av circleShape Var rotationVib: FixedVibration = new FixedVibration (klipp, "rotasjon", 0,9, 0,05, 0, 360, false); rotationVib.start (); //Definere en ExitShape Var exit: ExitShapeTrigger = new ExitShapeTrigger (onExitShape, klipp, exitShape, true); exit.start (); clipContainer.addChild (klipp); }
Trinn 20 .: Finish
pakke {import hype.extended.behavior.FixedVibration; import flash.display.Sprite; import flash.display.MovieClip; import flash.filters.BlurFilter; import hype.extended.behavior.VariableVibration; import hype.extended.rhythm.FilterCanvasRhythm; import hype.extended.trigger.ExitShapeTrigger; import hype.framework.core.ObjectPool; import hype.framework.core.TimeType; import hype.framework.display.BitmapCanvas; /** * En tutorial for å introdusere HYPE. En visuell ramme * av Branden Hall og Joshua David for å skape * generative /iterativ design med kode. * *author Anton Mills *version 06.02.2011 * /public class Hoved strekker MovieClip {//private eiendommer private Var bitmapCanvas: BitmapCanvas; private Var clipContainer: Sprite; private Var objectPool: ObjectPool; /** * Konstruktør * /public funksjonen main () {//inits Hype rammeverket initHype (); //Begynne sekvens objectPool.requestAll (); } /** * Initiering av Hype medlemmene vi skal bruke og konfigurasjon før * å kjøre animasjonen * /private funksjon initHype (): void {//den clipContainer brukes som en forelder for alle våre sprites clipContainer = new Sprite (); addChild (clipContainer); //Tenk på BitmapCanvas som et tomrom vi vil "maling" //hver ramme med nye bildedata bitmapCanvas = nye BitmapCanvas (stage.stageWidth, stage.stageHeight); bitmapCanvas.startCapture (clipContainer, true); addChild (bitmapCanvas); //Legger til en blur Var uskarphet: FilterCanvasRhythm = new FilterCanvasRhythm ([ny BlurFilter (1.1, 1.1, 1)], bitmapCanvas); blur.start (TimeType.TIME, 100); //Opprette en samling av objekter og lagre dem i en ObjectPool //for bruk i animasjonen objectPool = new ObjectPool (circleShape, 100); //Hver gang vi ber om en ny form fra bassenget //vil det utføre følgende objectPool.onRequestObject = function (klipp: MovieClip): void {clip.x = stage.stageWidth /2; clip.y = stage.stageHeight /2; //Velge en tilfeldig ramme clip.gotoAndStop (Math.ceil (Math.random () * 3)); //Legge en VariableVibration for x /y bevegelse av hver circleShape Var XVIb: VariableVibration = new VariableVibration (klipp, "x", 0,97, 0,03, 40); Var yVib: VariableVibration = new VariableVibration (klipp, "y", 0,97, 0,03, 40); xVib.start (); yVib.start (); //Legge en FixedVibration til alfa og skala egenskapene til hver circleShape når ba Var alphaVib: FixedVibration = new FixedVibration (klipp, "alpha", 0,9, 0,05, 0,5, 1,5, false); Var scaleVib: FixedVibration = new FixedVibration (klipp, "scale", 0,9, 0,05, 0,05, 0,8, false); alphaVib.start (); scaleVib.start (); //Legge en FixedVibration til rotasjonen av circleShape Var rotationVib: FixedVibration = new FixedVibration (klipp, "rotasjon", 0,9, 0,05, 0, 360, false); rotationVib.start (); //Definere en ExitShape Var exit: ExitShapeTrigger = new ExitShapeTrigger (onExitShape, klipp, exitShape, true); exit.start (); clipContainer.addChild (klipp); }; } //Recycle objekter privat funksjon onExitShape (klipp: MovieClip): void {objectPool.release (klipp); clipContainer.removeChild (klipp); objectPool.request (); }}}
Konklusjon
flere skudd ressurser på Activetuts +
Kode en Chaotic Sammensetning Inspirert av Joshua Davis fra Bruno Crociquia
Introduksjon til HYPE Actionscript 3.0 Framework av Tom Green
Quick Tips: Slik eksporterer Flash til PNG med HYPE av Daniel Apt
Lag en Hypnotiserende Music Visualizer med HYPE av Franci Zidar