forked from: ランダムに降ってきて敷き詰める。forked from:forked from: 四角を敷き詰める。
/**
* Copyright lepere ( http://wonderfl.net/user/lepere )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/7l0W
*/
// forked from meika_kouri's ランダムに降ってきて敷き詰める。forked from:forked from: 四角を敷き詰める。
// forked from meika_kouri's 上から降ってきて敷き詰める。forked from: 四角を敷き詰める。
// forked from meika_kouri's 四角を敷き詰める。
package {
import flash.events.Event;
import flash.display.Graphics;
import flash.display.Shape;
import flash.display.Sprite;
public class FlashTest extends Sprite {
private var kosuuTate:uint = 15; //いまさらながら縦横の個数を変えやすくしてみる
private var kosuuYoko:uint = kosuuTate; //もちろんここを別にすると長方形に敷き詰まる
private var sceneNo:uint = 0; //何列目を落としたか
private var squeres:Vector.<Shape> = new Vector.<Shape>();
private var line:Number = 20; //一辺の幅
private var centerX:Number = stage.stageWidth / 2;
private var centerY:Number = stage.stageHeight / 2;
private var harfTate:Number = ((kosuuTate - 1)/ 2); //縦の個数の半分
private var harfYoko:Number = ((kosuuYoko - 1)/ 2); //横の(同上)
//private var i:uint = 0; //一個ずつ落とす用
public function FlashTest() {
//同じ四角をVectorに入れて位置をずらす
for(var i:uint = 0; i < kosuuTate; i++){
for(var j:uint = 0; j < kosuuYoko; j++){
var nowIndex:uint = i * kosuuYoko + j; //左上から横優先
squeres[nowIndex] = drawSquere(line);
//画面中央基準なのでカウンタから横の数の半分引く
squeres[nowIndex].x = centerX + (harfYoko - j) * (line + 5);
squeres[nowIndex].y = -line * (Math.random() * 5 + 1); //画面の上に置いておく
/*マイナス一辺の長さを掛けているのは、より自然なランダムっぽさ(?)にするため。
/ カッコ内の係数はお好みで変更可だが、加算部分を削ると初期配置が画面内に入ることがあるので注意*/
addChild(squeres[nowIndex]);
}
}
addEventListener(Event.ENTER_FRAME, Drop);
}
private function Drop(e:Event):void{
if(sceneNo >= kosuuTate) { //全部落ちていたら外す
removeEventListener(Event.ENTER_FRAME, Drop);
return;}
var target:uint = kosuuTate - sceneNo - 1; //落とす列
var targetBase:uint = target * kosuuYoko; //落とす列の最初の四角の番号
for(var i:uint = 0; i < kosuuYoko; i++){//まとめて一列落とす
squeres[targetBase + i].y += 30; //毎フレーム5落とす
//目標地点に着いてたらそこに置いておく
if(squeres[targetBase + i].y > centerY + (target - harfTate) * (line + 5)){
squeres[targetBase + i].y = centerY + (target - harfTate) * (line + 5);
//i++;//一個ずつ落とす時用。でもランダムな初期配置の意義が薄れそう
}
}
//全部位置が決まってれば列を変える
var isPut:Vector.<Boolean> = new Vector.<Boolean>();
for(var j:uint = 0; j < kosuuYoko; j++){
if(squeres[targetBase + j].y == centerY + (target - harfTate) * (line + 5)){
isPut[j] = true;
}else{
isPut[j] = false;
}
}
for(j = 0; j < kosuuYoko; j++){
if(!isPut[j])return; //一個でも目標地点に着いてないならここで終わり
}
sceneNo++; //ここまで来たら段を変える
//i = 0;//一個ずつの時は忘れずリセット
}
//中央を基準点にした四角Shape。
private function drawSquere(line:Number):Shape{
var harfLine:Number = line / 1.5;
var squere:Shape = new Shape();
var g:Graphics = squere.graphics;
g.beginFill(0x00FFFF);
g.moveTo(-harfLine, -harfLine);
g.lineTo(harfLine, -harfLine);
g.lineTo(harfLine, harfLine);
g.lineTo(-harfLine, harfLine);
g.lineTo(-harfLine, -harfLine);
return squere;
}
}
}