Untitled
unknown
plain_text
a year ago
2.6 kB
6
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)
Editor is loading...
Leave a Comment