Untitled
-- 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