挑戦してみたのだが。
プログラマのためのFlash遊び方:特集|gihyo.jp … 技術評論社なんてものを見て、「何、ロハでできるんか。ならやってみるか」と挑戦してみたのだが。
一日かけてこの程度である。
http://www.eiji8pou.net/flash/dropgem.htm
なんか四角やらなんやらが降ってくるので、マウスについてくる自分を動かして降ってくるものに接触させると、それが消えます。
本当は、スコアもつけたかったんだけど、そこまで手が回らなかったので。
ふううううう、やっぱActionScript 3.0は、Perlとは全然勝手が違うわー。
DropGem.as
package { import flash.display.Sprite; import flash.events.Event; import flash.utils.Timer; import flash.geom.Point; public class DropGem extends Sprite { public function DropGem():void { stage.scaleMode = "noScale"; stage.align = "TL"; var own:Sprite = new Sprite(); own.graphics.lineStyle(1, 0x000000); own.graphics.beginFill(0xFFFFFF); own.graphics.drawCircle(0, 0, 8); own.graphics.endFill(); addChild(own); own.x = 400; own.y = 300; var ownX:Number = 400; var ownY:Number = 300; var dis:Number; var disX:Number; var disY:Number; var disX2:Number; var disY2:Number; var speed:Number; var circleE:Array = new Array(256); var circleX:Array = new Array(256); var circleY:Array = new Array(256); var circleS:Array = new Array(256); var timer:Timer = new Timer(17, 0); timer.start(); timer.addEventListener("timer", function(event:Event):void { // 落下物を作成 if ( int(Math.random()*6) == 0 ) { // 6分の1の確率で生成。 for ( var i:int = 0; i < 256; i++ ) { // 一度に256個まで。 if ( circleE[i] != null ) { continue; } var s:Sprite = new Sprite(); // 初期化 s.graphics.beginFill(Math.random() * 0x1000000); // 色の決定 var aspect:int = int(Math.random() * 6 + 4); // 面数の決定 var angle:Number = 2 * Math.PI / aspect; s.graphics.moveTo(8, 0); var p:Point; for ( var l:int = 0; l < aspect; l++ ) { p = Point.polar(8, angle * (l+1)); s.graphics.lineTo(p.x, p.y); } s.graphics.endFill(); // 塗りましたよ。 addChild(s); // 落下物を定位置に移動 s.x = Math.random() * 800; s.y = 0; circleE[i] = s; circleX[i] = s.x; circleY[i] = 0; circleS[i] = int(Math.random()*4)+1; break; } } // 自分の位置を移動。 // カーソルと現在位置の距離を取得。 disX = ( stage.mouseX - own.x ); disX2 = disX * disX; disY = ( stage.mouseY - own.y ); disY2 = disY * disY; dis = Math.sqrt( disX2 + disY2 ); speed = dis; if ( dis > 6 ) { speed = 6; } if ( stage.mouseX != own.x ) { own.x += disX * speed / dis; } if ( stage.mouseY != own.y ) { own.y += disY * speed / dis; } // 落下物の位置を移動。 for ( var i:int = 0; i < 256; i++ ) { if ( circleE[i] == null ) { continue; } circleY[i] = circleY[i] + circleS[i]; circleE[i].y = circleY[i]; // もし、一番下まで来たら、消す。 if ( circleY[i] > 600 ) { removeChild(circleE[i]); circleE[i] = null; } } // 接触判定 for ( var i:int = 0; i < 256; i++ ) { if ( circleE[i] == null ) { continue; } disX = ( circleE[i].x - own.x ); disX *= ( circleE[i].x - own.x ); disY = ( circleE[i].y - own.y ); disY *= ( circleE[i].y - own.y ); dis = Math.sqrt( disX + disY ); if ( dis < 16 ) { removeChild(circleE[i]); circleE[i] = null; } } }); } } }