Esempio n. 1
0
        /**
         * 自身を目的地とされた場合、移動者に対して指示を出します。
         * 外にいる場合、自身まで移動させます。到着した場合、入場列に並ばせます。
         * プラットフォームから出たい移動者は _step() で処理します (改札数のキャパシティ制約を受けるため)
         */
        public override void Handle(Human subject)
        {
            // コンコースに入ったが、目的地が変わり出場することになった
            if (parent.Concourse.Contains(subject))
            {
                parent.Concourse.Remove(subject);
                parent.OutQueue.AddLast(subject);
                subject.State = Human.StateType.WAIT_EXIT_GATE;
                return;
            }

            // 待機列にいるならば人を待たせる
            if (parent.OutQueue.Contains(subject) || parent.InQueue.Contains(subject))
            {
                return;
            }

            // 地面を歩いているならば、自身に向かって移動させる
            if (subject.Seek(parent.transform.position))
            {
                // 到着したならば、入場待機列に移動させる
                parent.InQueue.AddLast(subject);
                listener.Fire(EventType.MODIFIED, parent.BelongsTo);
                subject.State = Human.StateType.WAIT_ENTER_GATE;
            }
            else
            {
                subject.State = Human.StateType.MOVE;
            }
        }
Esempio n. 2
0
 protected bool TryRide()
 {
     // 満員
     if (train.Passengers.Count >= train.Capacity)
     {
         return(false);
     }
     while (InQueue.Count > 0)
     {
         var h = InQueue.First.Value;
         InQueue.RemoveFirst();
         if (h.Next == org)
         {
             // ホームの利用客を電車に乗せる
             h.Complete();
             h.State = Human.StateType.ON_TRAIN;
             org.Queue.Remove(h);
             h.OnDeptTask = null;
             h.Ride(org);
             train.Passengers.Add(h);
             // 電車が満員になったら通知
             if (train.Passengers.Count == train.Capacity)
             {
                 listener.Fire(EventType.MODIFIED, train);
             }
             wait += 1 / train.Mobility;
             listener.Fire(EventType.RIDDEN, train);
             return(true);
         }
         // 上記が else になるのは、発車待ち時に経路が変わったとき。
         // このとき Platform が Human#deptTask を参照しキューの入れ替えを行っている
         // そのためここでは 何もしない
     }
     return(false);
 }
Esempio n. 3
0
    public Station NewInstance(Vector3 initPos)
    {
        var obj = Instantiate(template);

        obj.isTemplate = false;
        obj.GetComponent <SpriteRenderer>().enabled = true;
        obj.transform.position = initPos;
        obj.Under = factory.NewGate(obj);
        listener.Fire(EventType.CREATED, obj);
        return(obj);
    }
Esempio n. 4
0
    public RailNode NewInstance(Vector3 pos)
    {
        var obj = Instantiate(template);

        obj.isTemplate         = false;
        obj.transform.position = pos;
        if (IsView)
        {
            obj.transform.localScale = new Vector3(0.1f, 0.1f, 0.1f);
            obj.GetComponent <MeshRenderer>().enabled        = true;
            obj.GetComponent <MeshRenderer>().material.color = Color.green;
        }
        listener.Fire(EventType.CREATED, obj);
        return(obj);
    }
Esempio n. 5
0
 public RailLine(ModelStorage db, ModelListener lis)
 {
     storage  = db;
     listener = lis;
     storage.Add(this);
     listener.Fire(EventType.CREATED, this);
 }
Esempio n. 6
0
 private void Start()
 {
     if (isTemplate)
     {
         listener.Add <RailEdge>(EventType.CREATED, re => storage.Add(re));
         listener.Add <RailEdge>(EventType.DELETED, re => storage.Remove(re));
     }
     else
     {
         listener.Add <RailEdge>(EventType.MODIFIED, this, (_) =>
         {
             listener.Fire(EventType.MODIFIED, ForwardPart);
             listener.Fire(EventType.MODIFIED, BackPart);
         });
     }
 }
Esempio n. 7
0
 public virtual void Remove()
 {
     storage.Remove(this);
     listener.Fire(EventType.DELETED, this);
 }
Esempio n. 8
0
 public void fire()
 {
     listener.Fire(EventType.CREATED, this);
 }
Esempio n. 9
0
 public void Remove()
 {
     storage.Remove(this);
     listener.Fire <RailLine>(EventType.DELETED, this);
 }
Esempio n. 10
0
 public void Remove()
 {
     listener.Fire(EventType.DELETED, this);
     Destroy(gameObject);
 }