Espero que essas divagações tornem minha pergunta clara - eu entenderia totalmente se elas não o fizerem, então, deixe-me saber se é esse o caso e tentarei me esclarecer.
Conheça o BoxPong , um jogo muito simples que criei para me familiarizar com o desenvolvimento de jogos orientados a objetos. Arraste a caixa para controlar a bola e colecionar objetos amarelos.
Fazer o BoxPong me ajudou a formular, entre outras coisas, uma pergunta fundamental: como posso ter objetos que interajam sem precisar "pertencer" um ao outro? Em outras palavras, existe uma maneira de os objetos não serem hierárquicos, mas coexistirem? (Entrarei em mais detalhes abaixo.)
Suspeito que o problema da coexistência de objetos seja comum, então espero que exista uma maneira estabelecida de resolvê-lo. Não quero reinventar a roda quadrada, então acho que a resposta ideal que estou procurando é "aqui está um padrão de design que é comumente usado para resolver seu tipo de problema".
Especialmente em jogos simples como o BoxPong, é claro que há, ou deveria haver, um punhado de objetos coexistindo no mesmo nível. Há uma caixa, há uma bola, há um colecionável. Tudo o que posso expressar em linguagens orientadas a objetos, embora - ou ao que parece - sejam estritas relações HAS-A . Isso é feito através de variáveis-membro. Não posso simplesmente começar balle deixar fazer o que é necessário; preciso que permaneça permanentemente em outro objeto. Eu configurá-lo para que o objeto principal do jogo tem uma caixa, ea caixa por sua vez, tem uma bola, e tem um contador de pontuação. Cada objeto também possui umupdate()método, que calcula posição, direção, etc., e seguirei de maneira semelhante: chamo o método de atualização do objeto principal do jogo, que chama os métodos de atualização de todos os seus filhos, e eles, por sua vez, chamam os métodos de atualização de todos os seus filhos. Esta é a única maneira que eu vejo para criar um jogo orientado a objetos, mas acho que não é o caminho ideal. Afinal, eu não pensaria exatamente na bola como pertencendo à caixa, mas como estando no mesmo nível e interagindo com ela. Suponho que isso possa ser alcançado transformando todos os objetos do jogo em variáveis-membro do objeto principal do jogo, mas não vejo isso resolvendo nada. Quero dizer ... deixando de lado a desordem óbvia, como haveria uma maneira de a bola e a caixa se conhecerem , isto é, interagir?
Há também a questão dos objetos que precisam passar informações entre si. Tenho muita experiência em escrever código para o SNES, onde você tem acesso a praticamente toda a RAM o tempo todo. Digamos que você esteja criando um inimigo personalizado para o Super Mario World e que ele remova todas as moedas de Mario, depois armazene zero para endereçar $ 0DBF, sem problemas. Não há limitações dizendo que os inimigos não podem acessar o status do jogador. Eu acho que fui mimado por essa liberdade, porque com C ++ e coisas semelhantes, muitas vezes me pego imaginando como tornar um valor acessível a alguns outros objetos (ou mesmo globais).
Usando o exemplo do BoxPong, e se eu quisesse que a bola batesse nas bordas da tela? widthe heightsão propriedades da Gameclasse,ballpara ter acesso a eles. Eu poderia passar esses tipos de valores (por meio de construtores ou dos métodos onde eles são necessários), mas isso só me causa más práticas.
Acho que meu principal problema é que preciso que os objetos se conheçam, mas a única maneira de fazer isso é uma hierarquia estrita, o que é feio e impraticável.
Eu ouvi falar de "classes de amigos" em C ++ e meio que sei como elas funcionam, mas se elas são a solução definitiva, então como é que eu não vejo friendpalavras-chave espalhadas por todo projeto C ++ e como é que as conceito não existe em todas as línguas OOP? (O mesmo vale para ponteiros de função, dos quais aprendi recentemente.)
Agradecemos antecipadamente por respostas de qualquer tipo - e, novamente, se houver uma parte que não faça sentido para você, entre em contato.