·

Cursos Gerais ·

Linguagens de Programação

Send your question to AI and receive an answer instantly

Ask Question

Preview text

DESCRIÇÃO DA ATIVIDADE Detecção de colisão é uma das ações mais comuns e importantes em jogos eletrônicos O objetivo basicamente é verificar se dois objetos quaisquer colidiram ou seja se a interseção entre eles é diferente de vazio Isso pode ser usado para saber se duas naves colidiram se um monstro bate u numa parede se um personagem pegou um item se um carro bateu em outro etc Para facilitar as coisas muitas vezes os objetos são aproximados por figuras geométricas simples esferas paralelepípedos triângulos retângulos etc Neste contexto imagi ne que você está desenvolvendo um jogo de corrida de carros em 2D como o Top Gear 1992 figura abaixo onde vários carros se movem em uma pista e você precisa detectar colisões entre os carros O objetivo principal deste exercício é implementar a detecç ão de colisão de forma paralela usando threads para que esta tarefa seja realizada o mais rápido possível sem comprometer a experiência dos jogadore s Esta rotina será executada em tempo real a cada frame do jogo e portanto é uma tarefa crítica que deve ser otimizada para consumir o menor tempo possível Não vale o carro vermelho é uma frase que foi usada por nove entre 10 jogadores de Top Gear 1992 Kemco SNES O modelo inspirado na Ferrari Testarossa era o mais rápido do game Instruções Antes de mais nada estude o esqueleto inicial do código que vocês devem utilizar para desenvolver o que pede nesta atividade Muito do que deve ser implementado já está pronto É preciso criar uma represen tação dos carros no jogo Utilize objetos ou alguma estrutura de dados em C array list etc para armazenar os carros que estão no jogo Implemente uma função que verifique se dois carros colidiram ou não Isso pode ser feito por exemplo utilizando retângulos envolvendo os carros comparando suas coordenadas de posição altura e largura dos retângulos veja o exemplo a seguir como no ex emplo a seguir Autor Cristiano Daitx Ribeiro Font e httpsdspaceunipampaedubrbitstreamriu33281Cristiano20Daitx20Ribeiro202018pdf Entretanto faça uma pesquisa sobre outras técnicas de detecção de colisão de objetos 2D e use a estratégia que achar mais adequada para este exercício O trabalho do Cristiano Daitx Ribeiro fala sobr e alguns possíveis algoritmos Crie uma função principal que execute o loop principal do jogo onde os carros se movem no eixo X Os valores de Y podem ser apenas incrementando representando a velocidade do carro Faça uma simulação de corrida A detec ção de colisão deve ser realizada a cada frame cada volta do laço É possível usar uma estrutura de repetição para realizar essa simulação Divida a detecção de colisão entre algumas threads Paralelismo Por exemplo cada thread é responsável por ver ificar a colisão de um par específico de carros Você pode criar uma thread para verificar a colisão entre o carro 1 e o carro 2 outra thread para verificar a colisão entre o carro 1 e o carro 3 e assim por diante No esqueleto de código disponibilizado já está implementada uma ideia inicial Fique à vontade para pensar em algo diferente e modificar Atenção na sua implementação você também pode pensar em usar threads em outras tarefas que julgar pertinente Utilize mecanismos de sincronização se nece ssário for como semáforos para garantir o acesso seguro aos recursos compartilhados como o acesso à lista de carros e variáveis com resultados da detecção de colisão Teste seu código com diferentes cenários de colisão como carros colidindo frontalmen te carros colidindo lateralmente etc Este exercício permitirá que você pratique a programação paralela através da criação de threads use mecanismos de sincronização quando necessário e aplique conceitos de programação paralela no contexto de jogos digitais Além disso você poderá experimentar otimizar o desempenho do seu código explorando como a paralelização e outras técnicas podem ace lerar a detecção de colisões em um jogo ESQUELETO INICIAL DO CÓDIGO PARA A ATIVIDADE using System using SystemThreading Defina a classe Carro para representar os carros no jogo class Carro public int X get set public int Y get set public int Largura get set public int Altura get set Implemente um método para verificar colisão entre dois carros O método abaixo é para vocês testarem se resolve o problema Está disponível no link httpsdevelopermozillaorgptBRdocsGamesTechniques2Dcollisiondetection public bool VerificarColisao Carro outroCarro if X outroCarroX outroCarroLargura Largura outroCarroX outroCarroY outroCarroAltura Y Altura outroCarroY return true return false Classe principal do jogo class Program static readonly object lockObj new object Objeto de sincronização static bool resultado Matriz para armazenar os resultados da detecção de colisão static Carro carros Lista de carros do jogo Método para ser executado em cada thread static void VerificarColisaoThread object indice int idx int in dice for int i idx 1 i carrosLength i if carros idx VerificarColisao carrosi lock lockObj O l ock é um Semáforo impede que 2 ou mais threads acessem a região delimitada pelas chaves ao mesmo tempo Controle de concorrência com sincronização entre as threads resultado idx i true Método principal do jogo static void Jogo Crie uma lista de carros e adicione carros ao jogo Inicialize a matriz de resultados da detecção de colisão Crie um game loop para o jogo simular uma corrida pense como organizar o game loop a criação das threads etc resultado new bool carrosLength for int i 0 i carrosLength i resultadoi new bool carrosLength Crie um array para armazenar as threads Thread threads new Thread carrosLength Inicie as threads para verificar colisão entre os carros for int i 0 i carrosLength i threadsi new Thread VerificarColisaoThread threadsiStarti Aguarde a concl usão de todas as threads for int i 0 i carrosLength i threadsi Join Processe os resultados da detecção de colisão e tome ação apropriada como atualizar o placar ou gerenciar as colisões no jogo Método de entrada do programa static void Main Inicie o jogo Jogo Detecção de Colisão 2D Fonte httpsdevelopermozillaorgpt BRdocsGamesTechniques2Dcollisiondetection Algoritmos para detectar colisões em jogos 2D dependem do tipo de formas que podem colidir por exemplo retângulo para retângulo retângulo para círculo círculo para círculo Geralmen te você terá uma forma genérica simples que abrange a entidade conhecida como hitbox portanto mesmo que a colisão não seja perfeita ela terá boa aparência e terá bom desempenho em várias entidades Este artigo fornece uma revisão das técnicas mais co muns usadas para fornecer detecção de colisão em jogos 2D Caixa delimitadora alinhada por eixo Uma das formas mais simples de detecção de colisão é entre dois retângulos alinhados no eixo ou seja sem rotação O algoritmo funciona garantindo que não haja nenhum espaço entre os 4 lados dos retângulos Qualquer lacuna significa que uma colisão não e xiste Exemplo de Código usando Detecção de Colisão 2D Box Collider Box Collider Exercício Inicial Faça o desenho no papel dos retângulos representados no código observando coordenadas e tamanho veja se tem colisão e depois teste no OnlineGDB Exemplo s x y Collision detected Collision not detected y Exemplo s x y Collision detected Collision not detected y x Algumas Referências httpswwwtoptalcomgamevideo game physics part ii collision detection for solid objects httpsdevelopermozillaorgen USdocsGamesTechniques2Dcollisiondetection 1 1 1