\n'; document.write(barra); } } changePage();
|
|
Textos sobre desenvolvimento de jogos em geralDetecção de ColisõesEste página explica alguns conceitos sobre colisões, principalmente em 2 dimensões. Quando 2 ou mais objetos (neste texto denominados de "atores" do jogo, tais uma naves, tanques, tiros, mísseis, etc) "se tocam" (um está sobre o outro), ocorre o que chamamos de "colisão". Isto ocorre, por exemplo, quando um míssel acerta o jogador ou um inimigo, quando jogador e inimigo encostam um no outro, etc. Normalmente quando ocorre colisão há um determinado efeito no jogo (por exemplo, quando um míssel acerta um inimigo, ele é destruído). Para verificar se um ator está colidindo com outro, existem alguns problemas:
1. Como saber se está havendo ou houve colisão (detecção de colisão)? Quanto a questão 1, entre as técnicas utilizadas para detectar colisões estão o teste ponto-a-ponto e o teste através de cálculos matemáticos: Teste ponto-a-ponto: Neste teste, verifica-se se algum ponto da imagem de um ator está colidindo com a imagem de outro ator. Esta verificação é realizada ponto-a-ponto entre as duas imagens (ou seja, se algum ponto de um ator colidir com algum ponto de outro, a colisão é detectada). Este método é bem lento (por exemplo, se a imagem de cada um dos atores for pequena, tendo 32x32 pontos (ou seja 32 pontos na horizontal e 32 pontos na vertical), serão necessárias até 32*32=1024 comparações) e tem a desvantagem de perder a precisão de acordo com o movimento do ator (como será descrito abaixo). Teste através de cálculos matemáticos (utilizando figuras geométricas): O teste de colisão entre os atores é realizado através de testes de colisão entre figuras geométricas. Por exemplo, é como se cada ator tivesse um retângulo interno (ou qualquer outra figura geométrica que for conveniente). Caso o retângulo de um ator colida com o retângulo de outro ator, então a colisão é detectada. Este método é muito mais rápido que o anterior, e tem a vantagem de poder ser calculado com precisão quando o movimento do ator é rápido (como descrito abaixo). Além disto, no jogo geralmente não se precisa da precisão
de colisão dada pelo método de testes ponto-a-ponto, porque
a movimentação do jogo não permite que os jogadores
possam perceber a imprecisão da colisão. Na verdade o importante
é a percepção do jogador, não a precisão
total. Tem que se ver que o jogador percebe ou não uma colisão
que deveria ter Os testes de colisão podem ser melhorados:
Descrição de como testar a colisão entre retângulos: Imagine que cada ator do jogo (cada nave, ou uma nave e um tiro) tem um retângulo interno, com tamanho parecido com o tamanho de dentro o ator. Estes atores estão em movimento. Quando estes retângulos encostarem um no outro, então houve colisão. Supondo:
Para ver se houve colisao, basta verificar se: Caso esta condição for verdadeira, um está sobre o outro (há colisão, ou seja, pelo menos 1 ponto do retângulo "A" está sobre o retângulo "B"). Agora surge um outro problema: o problema do movimento rápido dos objetos. Eventualmente, se as diferenças de velocidade entre os objetos for muito grande, entao "um poderá passar pelo outro" sem colidir (ou seja, sem que a colisão seja detectada). Por exemplo:
Em outras palavras, entre um frame da imagem e o frame seguinte, um objeto pode se deslocar um número razoável de pontos (por exemplo: 50 pontos). Testes até exatos (tais como o teste pixel-a-pixel) podem não serem muito precisos em movimento, porque para serem precisos mesmo teria que haver uma simulacao de todo o movimento. No caso, por exemplo, de o objeto se mover 50 pontos para o lado em um frame, o objeto nao poderia de deslocar diretamente 50 pontos para o lado, mas teria que ser testado cada movimento de um ponto, ou seja, 50 "passos" de simulacao. Utilizando figuras geométricas, você poderia, por exemplo, criar uma fórmula para identificar diretamente se houve colisão de uma figura com a outra, quando a primeira figura se movimenta de um ponto a outro ponto qualquer. A engine GameBase utiliza-se desta técnica para detectar a colisão e fazer o cálculo exato do tempo em que ocorreu a colisão. 1.2. Como calcular as colisões de forma rápida? Os testes de colisão normalmente são realizados entre 2 atores (dois-a-dois). Ou seja, por exemplo:
Em outras palavras, o número de testes é "quase exponencial", ou seja, quanto mais atores testados, muito mais testes serão necessários, o que pode tornar inviável testes de colisão entre muitos atores. A solução para este problema é reduzir o número de testes, quando o número de atores no jogo é grande. Uma das alternativas é "setorizar" o cenário de jogo (a área onde os atores estão), ou seja, dividir todo o cenário em retângulos, e incluir os atores nestes retângulos. E somente testar a colisão entre os atores de mesmos retângulos ou retângulos contíguos. A engine GameBase utiliza-se desta técnica para reduzir o número de testes de colisão.
Autor: Giovani Kliemann, Versão do documento: 11/05/2002
|
| Entre em contato: gamebase@ieg.com.br | Modificada em 13-06-2005 |