Muito bem, amigos, finalmente consegui retomar esta série com algo interessante. Visto que "Pong 4 Linux" não é nem de longe "interessante", e o nosso próximo projeto que já está "estourando a bolsa" – Sendo este o NABA –, é que eu comecei, de maneira independente, a criar uma engine para criação de qualquer tipo de jogo com menos passos do que normalmente necessário. O objetivo é criar um "Game-Maker-like" para Linux, visto que essa coisa não existe. Mesmo que sem interface...
Então eu comecei a pensar numa coisa... colisões.
Veja bem, todo jogo é baseado em colisões. Bom, nem todo. Alguns jogos podem ser abstraídos em função de outro tipo de coisa que não colisões. Mas esses são casos especiais. Em primeira instância, o que temos é um monte de objetos que interagem uns com os outros. E aí que mora o problema.
Dependendo de sua estrutura, um jogo "complexo" – em contraposição a jogos "simples" como Pong, Breakout e Tetris, que podem ser mais facilmente otimizados – é composto de muitos e muitos objetos. Pegue Super Mario Bros, por exemplo. Mario, cada inimigo, cada bloco quebrável, cada bola de fogo, é um objeto de jogo. E daí vê-se que existem algumas dezenas de objetos interagindo por fase. E agora é que entra a parte computacional do raciocínio.
Cada objeto verifica se colide com outro e realiza as instruções programadas para aquela colisão em especial. E isto se repete para cada outro objeto do jogo. E cada objeto em particular realiza essa rotina de verificação de colisões. Só em termos de comparações, isto dá n(n+1) instruções por ciclo. Para um jogo com algumas dezenas de objetos, isto dá algumas centenas de instruções. E se você não entende muito de computação, eu digo: é muito. É demais. E, em um jogo, desempenho é tudo.
Então a questão é: como fazer um sistema de colisões de uso geral? Até o momento, a melhor otimização que consegui foi realizar apenas metade das verificações de colisão(ou seja: a colisão de A com B é verificada, mas não de B com A), visto que a colisão é, por assim dizer, uma operação comutativa. Ainda assim pode ser muito.
Assim, aceitamos sugestões. No mais, apenas um exercício mental para programadores. Afinal, o que é mais divertido do que pensar em abstrações algorítmicas? ;)

Bruno Pedrassani
23/05/2008 13:57
Cara, não entendi o problema de desempenho. Você não precisa verificar todas as colisões. Você simplesmente avisa qual colisão vai ocorrer, e computa aquela somente.
Link para este comentário | ResponderTalvez eu não tenha entendido qual o verdadeiro problema...
"Toupeira Profissional"
23/05/2008 17:34
E como saber quais vão ocorrer e quais não? Infelizmente o programa não tem a "visão de tela" que nós temos logo a única maneira de ele saber se "A" colide com alguém é verificar se o retângulo de "A" se intercepta com cada um dos retângulos dos outros objetos. O que gera n(n-1) comparações para todos os objetos do jogo. E cada comparação ocupa um ciclo de processador, o que pode gerar problemas de desempenho somadas às rotinas de desenho e etc...
Ou isso, ou então eu não entendi o teu raciocínio. Link para este comentário | Responder
Bruno Pedrassani
25/05/2008 19:38
Bah! Entendi o problema.
Link para este comentário | ResponderTrabalhe com subdivisões do espaço. Não sei como as coisas se movimentam no seu jogo, mas você não precisa todas as comparações pra achar a colisão.
Com subdivisões você pode inclusive manter alguns "candidatos" a colidir.
Tratei esse tipo de problema em algum semestre na faculdade, vou ver se lembro exatamente da solução pra tentar te ajudar.
Abraço
"Toupeira Profissional"
25/05/2008 22:55
Taí, essa é uma boa idéia, talvez. Mas ainda não sei se seria a ideal...
Link para este comentário | ResponderAcho que estou sendo perfeccionista demais, também. Quando chegar a hora é que a gente vê, certo? :D
cardoso
25/05/2008 03:43
Muito tempo atrás, em uma galáxia distante eu escrevi um tutorial de colisões em Flash, no tempo em que o ActionScript não tinha nada. Pura matemática, ficou bonito pacas. Será que acho no archive.org?
Link para este comentário | ResponderToupeira Profissional
25/05/2008 11:38
Poxa, seria ótimo, mesmo! Não achei no archive.org, então se encontrar manda o link aí, que acho que seria muito útil! :D
Link para este comentário | ResponderIsaias Malta
25/05/2008 09:00
Achei o problema fascinante, mas vejo que há uma questão de paradigma subjacente: o monitoramento de colisões que você descreve é ponto a ponto, portanto pertence às dimensões aritméticas, ou seja, àquelas com zero depois da vírgula. Quando imaginei o seu problema, preferi encará-lo do ponto de vista de janelas de possibilidades e isto significa ver o problema sob uma dimensão fracionada, ou fractal. Dados dois corpos móveis em trajetória livre num espaço bidimensional finito, qual seria a melhor forma de PREVER uma colisão sem ter que renunciar necessariamente ao monitoramento da trajetória de um deles?
Link para este comentário | ResponderOra, só consigo ver este problema aplicando a matemática probabilística, a mesma usada nos modelos atmosféricos: lá eles se defrontam com o mesmíssimo problema da colisões e com o problema crônico da demanda de cálculos infinitps numa capacidade de processamento finita.
Acredito então que a coisa vista sob um paradigma fractal muda radicalmente porque você não trabalha mais com o monitoramento em tempo real, mas o faz através de "fatias" que vão determinar a tua resolução, ou seja, por cortes ou amostragens que vão alimentar as variáveis das tuas equações probabilísticas. Erros e acertos ao se trabalhar com janelas vão ser determinados pelo balanceamento da tua resolução: a janela tem que ser estabelecida para que, de um lado não seja tão estreita que tenda ao processamento infinito e por outro, não seja tão ampla para que simultaneamente à desejável otimização de processamento, não aumente exponencialmente a possibilidade de erros.
Simples não?
Ahh, acredito que essa abordagem também seja utilizada no monitoramento e correção de órbita de satélites com trajetória "danificada". Quando você não tem combustível (processamento) suficiente para produzir o empuxo direto de correção orbital, da caótica para a desejável, você lança o teu satélite num rumo inesperado, previamente calculado através de uma janela de possibilidades, usando uma quantidade mínima do precioso combustível. Enfim, jogos, satélites e modelos meteorológicos se debruçam sobre os mesmos problemas.
Toupeira Profissional
25/05/2008 11:40
A diferença é que na meteorologia e no monitoramento de satélites, um erro de alguns centímetros faz pouca diferença, logo as heurísticas funcionam. Infelizmente não é possível errar por alguns pixels nesse caso, ou teríamos uma não-colisão sendo tratada como colisão.
Link para este comentário | ResponderTá complicado, mas talvez o raciocínio caminhe por aí, mesmo...
Igor Kura
02/07/2008 10:56
Amigos...gostaria de abrir um novo tópico, sei que sou bem intruso...mas percebi nesse forum o quanto vocês manjam de programação direcionadas para jogos..uma area que pretendo atuar mesmo...estou no segundo semestre na universidade, ou seja meu conhecimento é bem limitado perto do de vocês, mas levo muito a serio meus objetivos e talvez seja por isso que esteja aqui pedindo ajuda de vocês...mesmo estando bem no inicio da Universidade, pretendo trabalhar desde de cedo meu TCC, porque quero realmente fazer um trabalho intenso de pesquisa que tenha uma evolução durante todo o curso. Para isso eu preciso de um grande desafio algo que exija muita pesquisa e trabalho...por isso venho a vocês pedir parte dos seus conhecimentos pra me dizer a maior problematica , uma grande dificuldade que a programação de jogos encontra! Isso seria meu objeto de estudo desde já!!!Obrigado a compreensão de todos...grande abraço
Link para este comentário | Responder"Toupeira Profissional"
02/07/2008 19:36
Amigo, sinto muito te decepcionar, mas...
Link para este comentário | Responder1) Isto não é um fórum. Não mesmo.
2) Nós não nos especializamos em programação voltada pra jogos. Infelizmente, não.
3) Você já pensou em ler o texto? Isso é o mais perto de um desafio da programação de jogos que você vai encontrar aqui...