April 2009
Flash AS3, Box2D und PV3D
Fortsetzung, Teil 3
Die Welle
Hierfür schreiben wir uns eine eigene Effektklasse, die wir dann dann jeweils an die Bewegung der einzelnen Sphären haften können. Für den eigentlichen Effekt benötigen wir lediglich ein kleines Set an Filtern und BitmapData-Operationen. Als da wären:
- ColorMatrixFilter
- ConvolutionFilter
- BlurFilter
- paletteMap
Ausgestattet mit diesem Arsenal, können wir dann bereits anständige Wellen machen.
var n:int = 256;var c:int;while (n--) {c = int( (Math.sin(n / 256 * Math.PI * 6) + 1) * 0x7f);this.waveArr.push((c << 16) | (c << 8) | c);}this.phongArr = setupPhongMap( 0xffffff, 20, 0x00aaff, 0x00000 );}private function setupPhongMap(specular:uint = 0xffffff,intense:int = 50,diffuse:uint=0x808080, ambient:uint=0x000000 ):Array {var colour:Array = [];var specR:int = (specular >> 16) & 0xff;var specG:int = (specular >> 8) & 0xff;var specB:int = specular & 0xff;var diffR:int = (diffuse >> 16) & 0xff;var diffG:int = (diffuse >> 8) & 0xff;var diffB:int = diffuse & 0xff;var ambR:int = (ambient >> 16) & 0xff;var ambG:int = (ambient >> 8) & 0xff;var ambB:int = ambient & 0xff;var i:int = 256;var iMax:Number;var iVal:Number;while (i--) {iMax = Math.pow(Math.cos(i / 256 * Math.PI / 2), intense);iVal = 1 - (i / 256);colour.push( (Math.min(0xff, ambR + iVal * diffR + iMax * specR) << 16)|(Math.min(0xff, ambG + iVal * diffG + iMax * specG) << 8) |(Math.min(0xff, ambB + iVal * diffB + iMax * specB)));}return colour;}public function onUpdateFrame(radius:Number,vx:Number,vy:Number,sleep:Boolean = false ):void {if ( !sleep ) {this.rootNode.scaleX = this.rootNode.scaleY = radius * .009;if ( vx < 250 ) {vx -= 20;} else {vx += 3;}if ( vy < 200 ) {vy -= 20;}this.rectShape.x = vx;this.rectShape.y = vy;this.canvas.draw(this.rootNode, new Matrix(1 / bmpScale, 0, 0, 1 / bmpScale, vx/30, vy/30));this.alpha_cnt = 20;for each(var flt:BitmapFilter in this.filterArr) {this.canvas.applyFilter(this.canvas, this.canvas.rect, pnt, flt);}this.waveMap.draw(this.canvas);this.waveMap.paletteMap(this.waveMap, this.waveMap.rect, pnt, this.waveArr, RANGE, RANGE);var n:int = 1;while (n--){ this.waveArr.push(this.waveArr.shift())}this.waveMap.applyFilter(this.waveMap, this.waveMap.rect, pnt, this.bvl);this.waveMap.paletteMap(this.waveMap, this.waveMap.rect, pnt, this.phongArr, RANGE, RANGE);} else {if ( alpha_cnt < alpha_range ) {this.canvas.colorTransform(this.canvas.rect, new ColorTransform(0,0,0,0,0,0,0,-this.alpha_cnt ) );this.waveMap.draw(this.canvas);this.waveMap.paletteMap(this.waveMap,this.waveMap.rect,pnt,this.waveArr,RANGE, RANGE);this.waveMap.applyFilter(this.waveMap, this.waveMap.rect,pnt, this.bvl);this.waveMap.paletteMap(this.waveMap, this.waveMap.rect, pnt, this.phongArr, RANGE, RANGE);this.alpha_cnt += 20;}}}}}
eines der wenigen Tutorials, die zeigen, wie man in einer 3D-Flash-Umgebung 2D-Physik verwenden kann.
Allerdings für Beginner so gut wie wertlos, weil: mangelhaft dokumentiert.
Vielleicht sollte hier doch mal etwas Zeit für das Kommentieren der einzelnen Codeblöcke aufgewandt werden. Dann wird auch verständlich, was du eigentlich vorhast.
lg, Fred #zitieren

































