Untitled

 avatar
unknown
plain_text
a month ago
2.6 kB
3
Indexable
-- Calcula a nova posição e direção do inimigo
novaPosicaoEDirecao :: Float -> (Int, Int) -> Mapa -> (Float, Float) -> Float -> Direcao -> ((Float, Float), Direcao)
novaPosicaoEDirecao dt destino mapa (xAtual, yAtual) velocidade direcaoAtual =
    let celulaAtual = (floor yAtual, floor xAtual) -- Célula onde o inimigo está
        caminho = gerarCaminho celulaAtual destino mapa -- Calcula o caminho
    in case caminho of
        [] -> ((xAtual, yAtual), Parado) -- Sem caminho, o inimigo não se move
        (prox:_) -> 
            let (linhaProx, colunaProx) = prox -- Próxima célula no caminho
                (xProx, yProx) = centroCelula prox -- Centro da próxima célula
                -- Decide a direção do movimento com base na célula de destino
                novaDirecao = calcularDirecao (xAtual, yAtual) (xProx, yProx)
                -- Calcula o próximo movimento com base na velocidade
                vel = velocidade * dt
                (dx, dy) = casoDirecao novaDirecao vel
                novaPos = (xAtual + dx, yAtual + dy)
                -- Garante que o inimigo não ultrapasse o centro da próxima célula
                posFinal = limitarPosicao novaPos (xProx, yProx) novaDirecao
            in (posFinal, novaDirecao)

-- Calcula a direção com base na célula atual e próxima
calcularDirecao :: (Float, Float) -> (Float, Float) -> Direcao
calcularDirecao (xAtual, yAtual) (xProx, yProx)
    | xAtual < xProx = Leste  -- Vai para a direita
    | xAtual > xProx = Oeste  -- Vai para a esquerda
    | yAtual < yProx = Sul    -- Vai para baixo
    | yAtual > yProx = Norte  -- Vai para cima
    | otherwise = Parado     -- Já está no centro da célula

-- Define o movimento com base na direção
casoDirecao :: Direcao -> Float -> (Float, Float)
casoDirecao Leste  vel = (vel, 0)
casoDirecao Oeste  vel = (-vel, 0)
casoDirecao Sul    vel = (0, vel)
casoDirecao Norte  vel = (0, -vel)
casoDirecao Parado _ = (0, 0)

-- Garante que o inimigo não ultrapasse o centro da célula
limitarPosicao :: (Float, Float) -> (Float, Float) -> Direcao -> (Float, Float)
limitarPosicao (xAtual, yAtual) (xProx, yProx) direcao
    | direcao == Leste  && xAtual > xProx = (xProx, yAtual) -- Indo para a direita
    | direcao == Oeste  && xAtual < xProx = (xProx, yAtual) -- Indo para a esquerda
    | direcao == Sul    && yAtual > yProx = (xAtual, yProx) -- Indo para baixo
    | direcao == Norte  && yAtual < yProx = (xAtual, yProx) -- Indo para cima
    | otherwise = (xAtual, yAtual)
Leave a Comment