forked from: かぜぇになびくわよぉ〜
いろんなところがいいかげん。
// forked from RoundRoom's かぜぇになびくわよぉ〜
// いろんなところがいいかげん。
package {
import flash.display.StageQuality;
import flash.display.Sprite;
import flash.display.BitmapData;
import flash.geom.Point;
import flash.events.Event;
[SWF(backgroundColor="0")]
public class Grass extends Sprite {
private var container:Sprite; // 草の入れ物
// 草の設定。
private var leng:uint = 135;
private var thickness:Number = .07;
private var color_array:Array = [];
private var rand_array:Array = [];
private var fieldWidth:uint = 350;
private var fieldHeight:uint = 300;
private var centerX:Number = fieldWidth / 2;
private var centerY:Number = fieldHeight / 2;
private var space:uint = 15;// 草の間隔
private var w:uint = fieldWidth / space;;
private var h:uint= fieldHeight / space;;
// 風用のperlinNoise
private var perlin_bmd:BitmapData;
private var seed:int = Math.round(Math.random() * 100);
private var speed:int = 1; // 風の早さ
private var offsetPoint:Point = new Point(speed, 0);
private var damping:Number = -0.000005; // 風の強さ調整用
//
private var focusLength:uint = 500;
private var angX:Number = 0;
private var angY:Number = 0;
public function Grass() {
stage.quality = StageQuality.MEDIUM;
perlin_bmd = new BitmapData(w, h);
for (var r:uint = 0; r < h; r++) {
color_array[r] = [];
rand_array[r] = [];
for (var c:uint = 0; c < w; c++) {
color_array[r][c] = RGBtoHEX(Math.round(Math.random() * 34), Math.round(Math.random() * 128) + 102, Math.round(Math.random() * 68));
var randX:Number = Math.random() * (space / 1.5) - (space / 1.5);
var randZ:Number = Math.random() * (space / 1.5) - (space / 1.5);
rand_array[r][c] = {x:randX, z:randZ};
}
}
container = new Sprite();
container.x = stage.stageWidth / 2;
container.y = stage.stageHeight / 2 + leng / 2;
container.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
addChild(container);
}
private function enterFrameHandler(eventObject:Event):void {
// perlinNoiseのスクロール
offsetPoint.offset(speed, 0);
perlin_bmd.perlinNoise(w / 2, h / 2, 1, seed, false, false, 1, true, [offsetPoint]);
container.graphics.clear();
angX = (mouseX - 200) / 5 * -1;
angY = (mouseY - 200) ;
// ↑回りすぎないように適当に調整
for (var r:uint = 0; r < h; r++) {
for (var c:uint = 0; c < w; c++) {
drawGrass(c, 0, r);
}
}
}
// 草の描画
private function drawGrass(xp:uint, yp:uint, zp:int):void {
var power:Number = perlin_bmd.getPixel(xp, zp) * damping;
var controlX:Number = Math.sin(DegToRad(power / 4)) * leng / 4;
var controlY:Number = Math.cos(DegToRad(power / 4)) * leng / 1.4 * -1;
var topX:Number = Math.sin(DegToRad(power)) * leng + xp * space;
var topY:Number = Math.cos(DegToRad(power)) * leng * -1;
var posZ:int = zp * space - centerY;
var point1:Object = perspective(rotationXY(angX, angY, {x:xp * space - centerX, y:yp, z:posZ}));
var point2:Object = perspective(rotationXY(angX, angY, {x:controlX + xp * space - centerX, y:controlY - power / 10, z:posZ}));
var point3:Object = perspective(rotationXY(angX, angY, {x:topX - centerX, y:topY, z:posZ}));
var point4:Object = perspective(rotationXY(angX, angY, {x:controlX / 2 + xp * space - centerX, y:controlY, z:posZ}));
var point5:Object = perspective(rotationXY(angX, angY, {x:leng * thickness + xp * space - centerX, y:yp, z:posZ}));
container.graphics.beginFill(color_array[zp][xp], 100);
container.graphics.moveTo(point1["x"] + rand_array[zp][xp]["x"], point1["y"] + rand_array[zp][xp]["z"]);
container.graphics.curveTo(point2["x"] + rand_array[zp][xp]["x"], point2["y"] + rand_array[zp][xp]["z"], point3["x"] + rand_array[zp][xp]["x"], point3["y"] + rand_array[zp][xp]["z"]);
container.graphics.curveTo(point4["x"] + rand_array[zp][xp]["x"], point4["y"] + rand_array[zp][xp]["z"], point5["x"] + rand_array[zp][xp]["x"], point5["y"] + rand_array[zp][xp]["z"]);
container.graphics.lineTo(point1["x"] + rand_array[zp][xp]["x"], point1["y"] + rand_array[zp][xp]["z"]);
container.graphics.endFill();
}
private function RGBtoHEX(r:uint, g:uint, b:uint):int { return (r << 16 | g << 8 | b); }
private function DegToRad(nDegree:Number):Number { return (nDegree * Math.PI / 180); }
private function perspective(points:Object):Object {
var temp:Object = {x:0, y:0};
var nZ:Number = focusLength / (focusLength - points.z);
temp.x = points.x * nZ;
temp.y = points.y * nZ;
return temp;
}
private function rotationXY(x:Number, y:Number, points:Object):Object {
var temp:Object = points;
var rX:Number = DegToRad(x);
var rY:Number = DegToRad(y);
var nY:Number, nX:Number, nZ:Number;
nZ = temp.z;
nY = temp.y;
temp.z = nZ * Math.cos(rY) - nY * Math.sin(rY);
temp.y = nY * Math.cos(rY) + nZ * Math.sin(rY);
nX = temp.x;
nZ = temp.z;
temp.x = nX * Math.cos(rX) - nZ * Math.sin(rX);
temp.z = nZ * Math.cos(rX) + nX * Math.sin(rX);
return temp;
}
}
}