/** * written by Andreas Meisel */ var oBitmap:Bitmap; var oBitmapData, oBufBitmapData:BitmapData; var screenArray,colorArray:Array; colorArray=new Array(256); var thisWidth:int=this.stage.stageWidth; var thisHeight:int=this.stage.stageHeight; var ready:Boolean=false; var intCount:int=2; var glDirection:Boolean=true; //initialisiere Palette function initColors(){ var i:uint=0; //von rot nach lila var rnd:Number=Math.random(); if(rnd<=0.5){ for(i=0;i<64;i++){ colorArray[i]=0xFFFF0000+4*i; } //von lila nach blau for(i=0;i<64;i++){ colorArray[i+64]=0xFFFF00FF-4*i*256*256; } //von blau nach grün for(i=0;i<64;i++){ colorArray[i+128]=0xFF0000FF-4*i+4*i*256; } //von rot nach grün for(i=0;i<64;i++){ colorArray[i+192]=0xFF00FF00-4*i*256+4*i*256*256; } }else{ //blau nach weiß for(i=0;i<128;i++){ colorArray[i]=0xFF0000FF+2*i*256+2*i*256*256 } //weiß nach blau for(i=128;i<256;i++){ colorArray[i]=0xFFFFFFFF-2*(i-128)*256-2*(i-128)*256*256 } } } //sucht sich die Farben aus colorArray und schreibt sie in die Bitmap function onScreen(myBitmapData:BitmapData,myBitmapData2:BitmapData){ var index:int=0; for(var myY:int=0;myY0;i--){ colorArray[i]=colorArray[i-1]; } colorArray[0]=buf; }else{ buf=colorArray[0]; for(i=0;i<255;i++){ colorArray[i]=colorArray[i+1]; } colorArray[255]=buf; } } //zeichnet das Plasma function drawPlasma(myBitmapData:BitmapData,myBitmapData2:BitmapData){ var c1:int=Math.round(Math.random()*255); var c2:int=Math.round(Math.random()*255); var c3:int=Math.round(Math.random()*255); var c4:int=Math.round(Math.random()*255); initColors(); screenArray=new Array(this.stage.stageWidth*this.stage.stageHeight); screenArray[0]=c1;//links oben screenArray[thisWidth-1]=c2;//rechts oben screenArray[(thisHeight-1)*thisWidth+thisWidth-1]=c3;//rechts unten screenArray[(thisHeight-1)*thisWidth]=c4; //links unten calculateGrid(0,0,thisWidth-1,thisHeight-1,c1,c2,c3,c4); onScreen(myBitmapData,myBitmapData2); ready=true; } function Displace(num:Number):Number { var max:Number = num / (thisWidth+thisHeight) * 3; return (Math.random() - 0.5) * max*255; } //midpoint displacement Algorithmus function calculateGrid(minX:int,minY:int,maxX:int,maxY:int,c1:int,c2:int,c3:int,c4:int){ var newX:int=(maxX+minX)/2; var newY:int=(maxY+minY)/2; var Middle:int = (c1 + c2 + c3 + c4) / 4 + Displace(newX-minX + newY-minY); //Randomly displace the midpoint! var Edge1:int = (c1 + c2) / 2; //Calculate the edges by averaging the two corners of each edge. var Edge2:int = (c2 + c3) / 2; var Edge3:int = (c3 + c4) / 2; var Edge4:int = (c4 + c1) / 2; if (Middle < 0) { Middle = 0; } else if (Middle > 255) { Middle = 255; } screenArray[newX+minY*thisWidth]=Edge1; screenArray[maxX+newY*thisWidth]=Edge2; screenArray[newX+maxY*thisWidth]=Edge3; screenArray[minX+newY*thisWidth]=Edge4; screenArray[newX+newY*thisWidth]=Middle; if(maxX-minX>3 || maxY-minY>3){ calculateGrid(minX, minY, newX, newY, c1, Edge1, Middle, Edge4); calculateGrid(newX, minY, maxX, newY, Edge1, c2, Edge2, Middle); calculateGrid(newX, newY, maxX, maxY, Middle, Edge2, c3, Edge3); calculateGrid(minX, newY, newX, maxY, Edge4, Middle, Edge3, c4); } } //wenn Bidschirmgröße geändert->neu zeichnen, nicht relevant für konstante Größe im Browser function resizeIt(event:Event){ ready=false; thisWidth=this.stage.stageWidth; thisHeight=this.stage.stageHeight; removeChild(oBitmap); oBitmapData=new BitmapData(this.stage.stageWidth,this.stage.stageHeight,true,0xFFFF0000); oBufBitmapData=new BitmapData(this.stage.stageWidth,this.stage.stageHeight,true,0xFFFFFFFF); oBitmapData.draw(this); oBitmap=new Bitmap(oBitmapData); addChild(oBitmap); drawPlasma(oBitmapData,oBufBitmapData); } //wenn plasma gezeichnet, rotier die Palette function doEvent(event:Event){ if(ready){ for(var i:int=1;i<=intCount;i++){ rotatePalette(glDirection); } oBitmapData.paletteMap(oBufBitmapData,new Rectangle(0,0,thisWidth,thisHeight),new Point(0,0),null,null,colorArray,null); } } //Beim Klick nochmal neu zeichnen function onClick(event:MouseEvent){ ready=false; drawPlasma(oBitmapData,oBufBitmapData); } //Keyboard-Events function hacked(event:KeyboardEvent){ switch(event.keyCode){ case Keyboard.SPACE: ready=false; drawPlasma(oBitmapData,oBufBitmapData); break; case Keyboard.UP: glDirection=true; break; case Keyboard.DOWN: glDirection=false; break; case Keyboard.RIGHT: intCount++; if(intCount>10) intCount=10; break; case Keyboard.LEFT: intCount--; if(intCount<0)intCount=0; break; } } //2 Puffer für die Bitmap, auf einem wird gezeichnetm auf dem anderen wird das Ergebnis geschrieben oBitmapData=new BitmapData(this.stage.stageWidth,this.stage.stageHeight,true,0xFFFF0000); oBufBitmapData=new BitmapData(this.stage.stageWidth,this.stage.stageHeight,true,0xFFFFFFFF); oBitmap=new Bitmap(oBitmapData); addChild(oBitmap); drawPlasma(oBitmapData,oBufBitmapData); stage.align = StageAlign.TOP_LEFT; this.stage.addEventListener(Event.RESIZE, resizeIt); addEventListener(Event.ENTER_FRAME,doEvent); stage.addEventListener(MouseEvent.CLICK,onClick); stage.addEventListener(KeyboardEvent.KEY_DOWN,hacked);