昨日のローレンツ・アトラクタが時限式ブラクラだと言われたので軽くしてみました
でも前の記事は修正しないよ^p^
重くなる原因はベクターを描画し続けているからです
なので20秒ごとにbitmapにうつしてベクターを全消し を繰り返すようにしてみました
でもbitmapにしたら線がつぶれて拡大したとき細かい線が全然見れなくなる
拡大して見るのが好きだったのにー・・・w
ベクターのままで重くならないようにするにはどうすればいいんだろう・・・
誰か教えてくだしぁ
※クリックでstart/stop
Flash Player 10 にしてください
ソース 関係ないとこもちょこちょこ変えててごめんなさいw
package {
import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.TimerEvent;
import flash.display.Sprite;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Stage;
import flash.display.StageScaleMode;
import flash.utils.Timer;
public class Lorenz extends Sprite{
private const P:Number = 10;
private const R:Number = 28;
private const B:Number = 8 / 3;
private const D:Number = 0.01;
private const SCALE:Number = 5;
private const CENTER_X:Number = 150;
private const CENTER_Y:Number = 150;
private var _x:Number = 1;
private var _y:Number = 1;
private var _z:Number = 1;
private var dx:Number;
private var dy:Number;
private var dz:Number;
private var tmpX:Number;
private var tmpY:Number;
private var tmpZ:Number;
private var map:Sprite;
private const color:uint = 0xa4cdf7;
private var circle:Sprite;
private var isRunning:Boolean = false;
private var bitmapData:BitmapData;
private var bitmap:Bitmap
private var timer:Timer;
public function Lorenz() {
bitmapData = new BitmapData(CENTER_X * 2, CENTER_Y * 2);
bitmap = new Bitmap(bitmapData);
stage.addChild(bitmap);
map = new Sprite();
map.graphics.lineStyle(0, color);
map.graphics.moveTo(CENTER_X, CENTER_Y);
stage.addChild(map);
circle = new Sprite();
circle.x = CENTER_X;
circle.y = CENTER_Y;
circle.graphics.beginFill(0x23dc5f);
circle.graphics.drawCircle(0, 0, 5);
circle.graphics.endFill();
stage.addChild(circle);
stage.addEventListener(MouseEvent.CLICK, onClickHandler);
timer = new Timer(20000);
timer.addEventListener(TimerEvent.TIMER, onTick);
timer.start();
}
private function onClickHandler(event:MouseEvent):void {
if (isRunning) {
stage.removeEventListener(Event.ENTER_FRAME, onEnterFrameHandler);
isRunning = false;
} else {
stage.addEventListener(Event.ENTER_FRAME, onEnterFrameHandler);
isRunning = true;
}
}
private function onEnterFrameHandler(event:Event):void {
dx = P * (_y - _x);
dy = _x * (R - _z) - _y;
dz = _x * _y - B * _z;
_x += D * dx;
_y += D * dy;
_z += D * dz;
tmpX = _x * SCALE + CENTER_X;
tmpY = _y * SCALE + CENTER_Y;
tmpZ = _z * SCALE;
map.graphics.lineTo(tmpX, tmpY);
circle.x = tmpX;
circle.y = tmpY;
}
private function onTick(event:TimerEvent):void{
bitmapData.draw(map);
map.graphics.clear();
map.graphics.lineStyle(0, color);
map.graphics.moveTo(circle.x, circle.y);
}
}
}
