エレベーターグラフ
♥4 |
Line 269 |
Modified 2010-06-22 20:39:39 |
MIT License
archived:2017-03-08 13:26:10
ActionScript3 source code
/**
* Copyright YAZUMA ( http://wonderfl.net/user/YAZUMA )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/zE0C
*/
<?xml version="1.0" encoding="utf-8"?>
<!-- forked from YAZUMA's エレベーター -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" width="712" height="489" minWidth="0" layout="absolute">
<mx:Label text="(floor)" width="42" x="49" y="28" fontFamily="Times New Roman"/>
<mx:LineChart id="chart" showDataTips="true" dataProvider="{chartData}"
height="197" y="53" left="49" horizontalCenter="0" right="49">
<mx:series>
<mx:LineSeries xField="x" yField="value"/>
</mx:series>
</mx:LineChart>
<mx:Label text="Elevator" y="255" fontWeight="bold" horizontalCenter="0" left="329" right="328"/>
<mx:Label text="(number)" width="57" x="45" y="283" fontFamily="Times New Roman"/>
<mx:LineChart id="chart2" showDataTips = "true" dataProvider="{chartData2}"
height="115" y="302" horizontalCenter="-159" left="45" right="363">
<mx:series>
<mx:LineSeries xField="x" yField="value"/>
</mx:series>
</mx:LineChart>
<mx:Label text="Passenger" width="72" x="158" y="418" fontWeight="bold"/>
<mx:ColumnChart id="columnchart1" showDataTips = "true" dataProvider="{chartData3}"
height="115" y="302" horizontalCenter="155" left="359" right="49">
<mx:series>
<mx:ColumnSeries xField="x" yField="value"/>
</mx:series>
</mx:ColumnChart>
<mx:Button label="スタート" click="timer()" top="452" verticalCenter="218" bottom="16" left="275" horizontalCenter="-44" right="363"/>
<mx:Script>
<![CDATA[
import flash.events.TimerEvent;
import flash.utils.Timer;
import mx.charts.LinearAxis;
import mx.charts.events.ChartItemEvent;
import mx.collections.ArrayCollection;
public var now_time:Number = 0; //時間推移
public var now_floor:Number = 1; //現在のフロア
public var must_floor:int = 1; //行き先
public var HEIGHT:Number = 0; //高さ
public var elevator_inner:int = 0; //エレベータ搭乗者数
public var waiter:int = 0; //エレベータに乗り込む人数
public var counter:int = 0; //カウンタ
public var elevator_in:Array = [21];//各階にいく人数 12だと12Fに行く人
public var ele_in:Array = [12];
public var start:Boolean = true; //
public var user:Boolean = false; //使用者がいるかどうか
public var must:Boolean = false; //むかえに行く
public var UpDown:Boolean = false; //上か下か
public var out_fin:Boolean = false;
public var in_fin:Boolean = false;
public var do_out:Boolean = false;
public var do_in:Boolean = false;
public var stop_checker:Boolean = false;
public var in_checker:Boolean = false;
public var out_checker:Boolean = false;
public var through:int = 0;
public var minuteTimer:Timer;
public var timer_start:Boolean = false;
//待ち人
[Bindable] public var wait_person:ArrayCollection = new ArrayCollection(
[ { before: 1, after: 20 } ]);
// チャートのデータ
[Bindable] public var chartData:ArrayCollection = new ArrayCollection(
[ { x: 0, value: 1 } ]);
[Bindable] public var chartData2:ArrayCollection = new ArrayCollection(
[ { x: 0, value: 0 } ]);
[Bindable] public var chartData3:ArrayCollection = new ArrayCollection(
[ { x: 1, value: 0} ] );
public function timer():void{
if(timer_start == false){
for(var ii:int = 0;ii < 101;ii++){
elevator_in[ii] = 0;
}
for(var k:int = 0; k < 12; k++){
ele_in[k] = 0;
}
for(var f:int = 2;f < 21; f++){
chartData3.addItem({x: f, value: 0});
}
timer_start = true;
minuteTimer = new Timer(50); //(関数実行間隔、実行回数)
minuteTimer.addEventListener(TimerEvent.TIMER,elevator_system);
minuteTimer.start();
}else{
minuteTimer.start();
}
}
private function elevator_system(event:TimerEvent):void{
now_floor = (HEIGHT / 3.5) + 1;
now_time += 0.5;
if(now_time % 10 == 0)person_check();
elevator_check();
now_floor = (HEIGHT / 3.5) + 1;
if(chartData.length == 241)chartData.removeItemAt(0);
chartData.addItem({x: now_time,value: now_floor});
if(chartData2.length == 241)chartData2.removeItemAt(0);
chartData2.addItem({x: now_time, value: elevator_inner});
for(var i:int = 0; i < 20; i++){
var item:Object = chartData3.getItemAt(i);
item.value = 0;
chartData3.setItemAt(item, i);
}
for(var i2:int = 1; i2 < wait_person.length; i2++){
var num:int = wait_person.getItemAt(i2).before;
var item2:Object = chartData3.getItemAt(num - 1);
item2.value++;
chartData3.setItemAt(item2, num - 1);
}
}
public function person_check():void{
//Person Coming Soon...
var j:int = Math.floor(Math.random()*(3 - 0 + 1)) + 0;
if(j > 0){
for(var n:int = 0;n < j; n++){
var before_floor:int = Math.floor(Math.random()*(20 - 1 + 1)) + 1;
do{
var after_floor:int = Math.floor(Math.random()*(20 - 1 + 1)) + 1;
}while(before_floor == after_floor);
wait_person.addItem({before: before_floor, after: after_floor});
}
}
}
public function elevator_check():void{
if(start == false){
//エレベータを使う人がいないとき
gotofloor1();
if(wait_person.length > 1)start = true;
}else{
if(user == true){
//エレベータ稼動中,人がエレベータ内にいる状態
if(stop_checker == true){
//止まる,もしくは止まるかどうかの判定
stop_check();
if(must_floor == now_floor){
//user = false;
}
if(elevator_inner == 0)user = false; //エレベータ内の人がいなくなれば、いったん終わり
if(wait_person.length == 1 && elevator_inner == 0)start = false; //さらに待っている人がいなければ1Fへ
}else{
//移動,各階で降りる人または上がる人がいないかチェックする
UPorDOWN();
if(HEIGHT % 3.5 == 0)stop_checker = true;
}
}else{
if(must == false){
//エレベータ待ちの人をチェックする
if(wait_person.length == 1){
//誰もイナイ
start = false;
gotofloor1();
}else{
//誰か使いたい
must_floor = wait_person.getItemAt(1).before;
must = true;
if(must_floor == now_floor){
must = false;
user = true;
stop_checker = true;
}else{
if(must_floor > now_floor)UpDown = true;
else UpDown = false;
must = true;
UPorDOWN();
}
}
}else{
UPorDOWN();
now_floor = (HEIGHT / 3.5) + 1;
if(must_floor == now_floor){
must = false;
user = true;
stop_checker = true;
}
}
}
}
}
public function UPorDOWN():void{
if(UpDown == true)HEIGHT += 0.5;
else if(UpDown == false) HEIGHT -= 0.5;
}
public function gotofloor1():void{
if(HEIGHT > 0)HEIGHT -= 0.5;
}
public function stop_check():void{
//In, Out 統括関数
if(out_checker == false)out_check();
if(do_out == true && out_fin == false)out();
if(in_checker == false && out_fin == true)in_check();
if(do_in == true && out_fin == true)inn();
if(out_fin == true && in_fin == true){
stop_checker = false;
in_checker = false;
out_checker = false;
do_out = false;
do_in = false;
out_fin = false;
in_fin = false;
if(through == 0)UPorDOWN();
else through = 0;
}
}
public function out_check():void{
out_checker = true;
if(elevator_in[now_floor] != 0){
do_out = true;
through++;
}
else out_fin = true;
}
public function out():void{
counter++;
if(counter == 6){
counter = 0;
elevator_inner--;
elevator_in[now_floor]--;
if(elevator_in[now_floor] == 0)out_fin = true;
}
}
public function in_check():void{
var k:int = 0;
in_checker = true;
for(var i:int = 1;i < wait_person.length;i++){
if(elevator_inner == 0){
if(wait_person.getItemAt(1).after > now_floor)UpDown = true;
else UpDown = false;
must_floor = wait_person.getItemAt(i).after;
}
if(elevator_inner < 12 && wait_person.getItemAt(i).before == now_floor){
if(UpDown == true && wait_person.getItemAt(i).after > now_floor){
waiter++;
elevator_inner++;
elevator_in[wait_person.getItemAt(i).after]++;
if(must_floor < wait_person.getItemAt(i).after)must_floor = wait_person.getItemAt(i).after;
ele_in[k]=i;
k++;
in_checker = true;
do_in = true;
through++;
}else if(UpDown == false && wait_person.getItemAt(i).after < now_floor){
waiter++;
elevator_inner++;
elevator_in[wait_person.getItemAt(i).after]++;
if(must_floor > wait_person.getItemAt(i).after)must_floor = wait_person.getItemAt(i).after;
ele_in[k]=i;
k++;
in_checker = true;
do_in = true;
through++;
}
}
}
if(waiter == 0){
in_checker = true;
do_in = false;
in_fin = true;
}else{
//待ち配列から削除する
for(var ii:int = waiter - 1; ii > 0;ii--){
wait_person.removeItemAt(ele_in[ii]);
}
}
}
public function inn():void{
counter++;
if(counter == 4){
counter = 0;
waiter--;
if(waiter == 0)in_fin = true;
}
}
public function timer_stop():void{
minuteTimer.stop();
}
]]>
</mx:Script>
<mx:Button label="ストップ" click="timer_stop()" horizontalCenter="38" right="281" left="357" top="452" verticalCenter="218" bottom="16"/>
<mx:Label x="617" y="255" text="(second)" fontFamily="Times New Roman"/>
<mx:Label x="303" y="418" text="(second)" fontFamily="Times New Roman"/>
<mx:Label x="476" y="418" text="Waiting person" fontWeight="bold"/>
<mx:Label x="627" y="418" text="(floor)" fontFamily="Times New Roman"/>
<mx:Label x="357" y="283" text="(number)" fontFamily="Times New Roman"/>
<mx:Label y="10" text="Elevator Simulator" left="292" horizontalCenter="-4" right="299" fontFamily="Times New Roman" fontWeight="bold" fontSize="18"/>
</mx:Application>