Exemplo n.º 1
0
        public void AtualizarPosicao()
        {
            // seleciona os carros que estao na frente
            var carroEmFrente = Caminho.RuaAtual.CarrosNaRua.Where(cr => cr.Posicao >= Posicao && cr != this).OrderBy(cr => cr.Posicao).FirstOrDefault();

            AtualizarVelocidade(carroEmFrente);

            // se não tem carro em frente ou o avanco é menor que a distancia entre os dois carros
            if (carroEmFrente == null || (Velocidade < (carroEmFrente.Posicao - carroEmFrente.Tamanho - Posicao)))
            {
                // avança a posição do carro
                Posicao += Velocidade;

                this.Status = StatusCarroEnum.EmMovimento;
                this.Dados.tempoMovimento += 1;
            }
            // senão, o avanco é maior que a distancia entre o carro e o carro em frente
            else
            {
                // o carro fica um metro atrás do carro da frente
                float novaPosicao = carroEmFrente.Posicao - carroEmFrente.Tamanho - 1f;

                // atualiza a velocidade para a realmente utilizada
                _velocidade = novaPosicao - Posicao;

                // atualiza a posicao
                Posicao = novaPosicao;

                // notifica o impedimento de progresso
                if (ImpedimentoDeProgresso != null)
                {
                    ImpedimentoDeProgresso(this, carroEmFrente);
                }

                if (carroEmFrente.Status == StatusCarroEnum.ParadoSemaforo)
                {
                    this.Status = StatusCarroEnum.ParadoSemaforo;
                    this.Dados.tempoSemaforo += 1;
                    _velocidade = 0;
                }
                else
                {
                    this.Status = StatusCarroEnum.EmMovimento;
                    this.Dados.tempoMovimento += 1;
                }
            }
        }
Exemplo n.º 2
0
        public void Mover()
        {
            if (Caminho.RuaAtual == null || isIniciado == false)
            {
                return;
            }


            if (Posicao <= Caminho.RuaAtual.Tamanho)
            {
                AtualizarPosicao();
            }
            else
            {
                _velocidade = 0;

                if (Caminho.RuaAtual.Semaforo == null || Caminho.RuaAtual.Semaforo.Estado == EstadoSemaforo.Aberto)
                {
                    Rua anterior = Caminho.RuaAtual;

                    if (Caminho.Avancar())
                    {
                        anterior.CarrosNaRua.Remove(this);      // tira o carro da rua anterior
                        Caminho.RuaAtual.CarrosNaRua.Add(this); // coloca o carro na rua atual

                        if (TrocaDeRua != null)
                        {
                            TrocaDeRua(this, anterior, Caminho.RuaAtual);
                        }
                        Posicao = 0;

                        this.Status = StatusCarroEnum.EmMovimento;
                        this.Dados.instantesTrocaRua.Add(TempoDoSistema.Valor);
                    }
                    else
                    {
                        anterior.CarrosNaRua.Remove(this); // tira o carro da rua anterior
                        if (TerminoCaminho != null)
                        {
                            TerminoCaminho(this);
                        }

                        this.Status = StatusCarroEnum.CaminhoConcluido;
                        this.Dados.instanteSaidaSistema = TempoDoSistema.Valor;
                    }
                }
                else
                {
                    // O carro está parado
                    tempoInicio = -1;

                    if (AguardandoSemaforo != null)
                    {
                        AguardandoSemaforo(this);
                    }

                    this.Status = StatusCarroEnum.ParadoSemaforo;
                    this.Dados.tempoSemaforo += 1;
                }
            }
        }