O que devo fazer para impedir que meus monstros saiam das plataformas?

8

Eu tenho uma pergunta que está me deixando louco, porque acho que deve ser bastante fácil encontrar um tutorial sobre ela. Atualmente, estou usando XNA e Farseer para criar um jogo de plataforma simples. Estou prestes a terminar, mas quero que meus monstros sejam mais inteligentes. Nesse caso, isso significa que não quero que meus monstros caiam dos penhascos.

Simplificando, quero algo que verifique a área na frente do meu "monstro" para determinar quando o monstro deve mudar de direção. Vocês poderiam me apontar na direção certa?

O que devo usar, deve existir uma solução simples ou um algoritmo simples para verificar isso, não?

Daniel Figueroa
fonte

Respostas:

17

Eu nunca trabalhei com XNA antes e acho que aparecerão melhores soluções do que as minhas. Mas uma solução alternativa que pode funcionar é que você pode colocar um objeto invisível nos extremos dos penhascos e o monstro pode verificar se há colisão com esse objeto. Se colidir, muda de direção.

gmemario
fonte
2
Simples e elegante, +1
Valmond 18/10/11
Essa é uma boa solução. Farseer suporta " sensores ", então use-os nos penhascos.
bummzack
Eu realmente gosto da sua resposta, então não quero contestá-la. Ele também poderia usar o ladrilho inferior esquerdo / direito (dependendo da direção do movimento) - que é uma solução mais 'óbvia'.
Jonathan Dickinson
11
O principal problema com uma solução como essa é que você precisa colocar um obstáculo para cada penhasco. Se houver poucos no jogo, pode estar tudo bem, mas, caso contrário, pode levar muito tempo e você pode perder alguns penhascos.
AlbeyAmakiir
4
@AlbeyAmakiir Bem, você também pode trocar isso e colocar um sensor na parte inferior à frente do jogador (que se move com o jogador). Assim que esse sensor parar de registrar colisões, você estará em um penhasco.
bummzack
7

Uma maneira ingênua de implementá-lo é usando o raycasting.

Calcule onde seu monstro estará em um pequeno pedaço de tempo (provavelmente um quadro). A partir dessa posição (ou se você quiser ser mais robusto, essa posição +/- a área delimitadora do seu inimigo) faça um radiodifusão. Se ele não atingir algo dentro de um intervalo apropriado (dependendo de onde você inicia seu raycast verticalmente, da altura do personagem, do "tamanho do passo" desejado etc.), você pode descobrir que existe um penhasco onde o personagem deseja estar, e decida alterar as direções adequadamente.

Tetrad
fonte
1

Com a minha IA, eu simplesmente verifico se há uma plataforma abaixo e a direção de sua viagem (sem usar um sistema de tiles, apenas um sistema de colisão groovy). Se não houver - ou se atingir um bloco sólido, ele fica com uma aparência confusa e se vira.

Dessa forma, você pode ter mapas dinâmicos e ainda ter uma IA funcional (termo usado livremente).

ultifinito
fonte
0

Suspeito que você esteja usando um mapa de blocos, caso em que a solução seria fazê-lo com base nos índices de blocos. Você precisa encontrar em qual bloco seu monstro está atualmente, com as seguintes fórmulas:

int tileX = (int)(monster.Position.X / TILE_WIDTH);
int tileY = (int(monster.Position.Y / TILE_HEIGHT);

Depois de conhecê-los, você precisa descobrir em qual direção X você está indo (para verificar os blocos à frente):

int direction = 0;
if (monster.Velocity > 0f)
    direction = 1;
if (monster.Velocity < 0f)
    direction = -1;

Agora você tem uma direção X normalizada para trabalhar.

Em seguida, verifique os blocos para ver se deve mudar de direção:

if (GetTileCollision(tileX + direction, tileY) == TileCollision.Impassable || // going into a wall
    GetTileCollision(tileX + direction, tileY) == TIleCollision.Passable &&
    GetTileCollision(tileX + direction, tileY + 1) == TileCollision.Passable)) // we're going to fall down a block
    ChangeDirection(); // we change direction

Você entende a ideia geral. Certifique-se de retornarTileCollision.Impassable (ou o que for) se os índices do bloco estiverem fora do mapa, para impedir que seu programa caia com um índice inválido e também para impedir que monstros saiam do mapa.

Eu acho que depende realmente da maneira como você lida com os ladrilhos, mas esta é a solução que funcionou para mim.

Com base nos tutoriais de http://www.sgtconker.com/ (embora o site esteja em baixo enquanto eu escrevo isso)

Jesse Emond
fonte
0

Coloque uma caixa na parte externa da plataforma, em uma camada separada, e peça aos monstros que verifiquem isso, para que não caiam, mas o jogador ainda pode.

Darren
fonte
Eu acho que essa é a mesma resposta que Gilson deu.
Richard Marskell - Drackir
ya olhando corretamente é
Darren