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; } } }
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; } } }