Haxe + CreateJs で ParticleEmitterJS を試してみました
ちょっと前に話題になってた ParticleEmitterJS を Haxe + CreateJs + Sublime Text2 で試してみました。
ParticleEmitterJS については、Clockmaker さんの記事 や にゃあプロジェクトさんの記事 で紹介されています。
で、これを Haxe でやろうとしたところ…
Haxe で ParticleEmitterJS をどうやって使うのかがわからないじゃないですかw
リファレンスをみてみると「extern クラス」を使えと書いてあったので、こりゃめんどいなーと思いながらも extern クラスを作ろうとしたのですが、もうちょっとググってみると…
クラスメソッドのブログで Taiga さんの記事 を見つけました。
こちらに ParticleEmitterJS の extern クラスが用意されていたので、これを参考にしてやってみると…
こんなのができました。
これ、基本的には参考記事に記載されていたコードとそれほど変わらないんですが、今回のテストでは Haxe 3.0 を使用しているため、Haxe の js の API が多少変更になっています。 http://haxe.org/manual/haxe3/migration
今回のサンプルに影響した API の変更は、js.Lib にあった window が js.Browser へ変更、js.Dom にあった Image が js.html へ変更でした。
記事中のサンプルから上記 API を変更してパーティクルの設定を変えてみた下記のコードが今回のサンプルのコードになります。
package; import createjs.easeljs.Stage; import createjs.easeljs.Point; import createjs.easeljs.Ticker; import createjs.ParticleEmitterType; import createjs.ParticleEmitter; import createjs.ParticleEmitterState; import js.Browser; import js.html.Image; class Main { private var stage:Stage; private var particleImage:Image; private var emitter:ParticleEmitter; private var rad:Float = 0; public static function main():Void { new Main(); } public function new() { Browser.window.onload = initHandler; } private function initHandler(_):Void { particleImage = untyped __js__("new Image()"); particleImage.onload = initCanvas; particleImage.src = "images/particle_base.png"; } private function initCanvas(_):Void { stage = new Stage(cast Browser.document.getElementById("canvas")); stage.compositeOperation = "lighter"; handleResize(null); Browser.window.onresize = handleResize; Ticker.setFPS(60); Ticker.useRAF = true; Ticker.addListener(update); var canvas:Dynamic = stage.canvas; addParticleEmitter(canvas.width * 0.5, canvas.height * 0.5); } private function addParticleEmitter( x, y ):Void { emitter = new ParticleEmitter( particleImage ); emitter.position = new Point( x, y ); emitter.emitterType = createjs.ParticleEmitterType.Emit; emitter.emissionRate = 100; emitter.maxParticles = 150; emitter.life = 600; emitter.lifeVar = 0; emitter.speed = 80; emitter.speedVar = 0; emitter.positionVarX = 0; emitter.positionVarY = 0; emitter.accelerationX = 0; emitter.accelerationY = 0; emitter.radialAcceleration = 0; emitter.radialAccelerationVar = 0; emitter.tangentalAcceleration = 0; emitter.tangentalAccelerationVar = 0; emitter.angle = 0; emitter.angleVar = 90; emitter.startSpin = 0; emitter.startSpinVar = 0; emitter.endSpin = null; emitter.endSpinVar = null; emitter.startColor = [127, 255, 255]; emitter.startColorVar = [127, 127, 127]; emitter.startOpacity = 1; emitter.endColor = null; emitter.endColorVar = null; emitter.endOpacity = null; emitter.startSize = 75; emitter.startSizeVar = 0; emitter.endSize = 20; emitter.endSizeVar = 0; stage.addChild( emitter ); } private var r:Float = 0; private var n:Int = 1; private function update():Void { stage.update(); var window:Dynamic = Browser.window; var cx:Float = window.innerWidth * 0.5; var cy:Float = window.innerHeight * 0.5; var dx:Float = Math.sin(rad) * r + cx; var dy:Float = Math.cos(rad) * r + cy; if( emitter != null ) { emitter.position = new Point( dx, dy ); } rad += 0.05; if( r < 10 ) { if( n < 0 ) n = 1; } if( r > 300 ) { if( n > 0 ) n = -1; } r += n * ( 1 - r * 0.001 ); } private function handleResize(_):Void { var canvas:Dynamic = stage.canvas; var window:Dynamic = Browser.window; canvas.width = window.innerWidth; canvas.height = window.innerHeight; if(emitter != null) { emitter.position = new Point(canvas.width * 0.5, canvas.height * 0.5); } } }
というわけで…
今回学んだことは「js の外部ライブラリを使いたい場合、extern クラスをつくらないといけないってのがちょっとめんどくさそう」でしたw