Problema de lógica orientada a objeto em c++

Estou programando em SDL2, porém eu fiz uma classe onde acontece a colisão de objetos, em que no seus parâmetros ele precisa de 2 GameObjects(Um colisor, e o objeto colidido). Na classe GameObject que eu criei, os varios inimigos e até mesmo o jogador são considerados GameObject, com uma variavel chamada “Tipo” que detecta se ele é um Player,Um inimigo, Um inimigo diferenciado,etc. E baseado nisso o GameObject tem suas variações. Porém para as colisões funcionarem eu precisaria chamar a funçao de colidir dentro de um GameObject, e é ai que mora o problema, pois como vou colocar parametros de dois gameobjects que nem existem ainda nessa classe? Eu teria que ir no main.c e programar as colisões de cada um individualmente(o que possivelmente vai gerar muitas linhas de codigo). Seria possivel contornar essa situação?

class GameObject{
	
	public:
		GameObject(SDL_Rect src,SDL_Rect dst,SDL_Texture* textura,int x);
		~GameObject();
		void updateObjeto();
		void setPosition(int x,int y);
		SDL_Rect getRectDst();
		SDL_Rect getRectSrc();
		SDL_Texture* getTexture();
		unsigned short getTipo();
		
	private:
		SDL_Rect destination;
		SDL_Rect source;
		SDL_Texture* texturaObjeto;
		unsigned short tipo;
		void playerUpdate();
        void inimigoUpdate();

};

Aqui é a função de Update caso a classe detecte que se trata de um player

void GameObject::playerUpdate(){
	
	colisao->updateColisao(GameObject* objeto1,GameObject* objeto2);
	
}

Função de colisão em outra classe (ignorem que ainda n programei a colisaokk)

void Collision::updateColisao(GameObject* objeto1, GameObject* objeto2){
	SDL_Rect colisor = objeto1->getRectDst();
	SDL_Rect colidido = objeto2->getRectDst();
}

Por que você precisa do objeto colisão dentro do seu objeto player(em playerUpdate)? É mais fácil você adicionar ao objeto de colisão os objetos que são colidíveis, e em cada GameObject, ter um método para tratar a colisão quando ela ocorre.

Exemplo (semi-pseudocódigo):

class CollisionManager{
  public:
    void adicionaObjetoAListaDeColisao(GameObject *object); // adiciona um GameObject na lista abaixo
    void processarTodasAsColisoes(); // é chamado no update do main pra testar todas as colisões
  private:
    Vector* listaDeObjetosColidiveis; // lista qualquer para armazenar os objetos
    void testarColisao(GameObject A, GameObject B);  // testa a colisao entre 2 objetos
}

CollisionManager::processarTodasAsColisoes(){
  for (para cada objeto AAA em listaDeObjetosColidiveis){
    for (para cada objeto BBB em listaDeObjetosColidiveis){
      if (AAA != BBB) testarColisao(AAA, BBB); 
    }
  }
}

CollisionManager::testarColisao(A, B){
  //aqui você testa a colisão
  if (A está colidindo com B){
    A->metodoDeAParaProcessarAColisao(B);
    B->metodoDeBParaProcessarAColisao(A);
  }
}

No seu main declare uma instância de CollisionManager e, sempre que criar um objeto que pode ter colisão, você adiciona no CollisionManager através do método adicionaObjetoAListaDeColisao(). No loop de update do main, você chama o método processarTodasAsColisoes() da instância do CollisionManager.

Extra: você criou um update para o inimigo e outro pro player dentro de GameObject. No geral, isso não é uma boa ideia. É mais flexível você estender a classe GameObject para classes distintas para cada tipo de GameObject (criando uma classe Player e outra - ou várias - para os Inimigos), e ter métodos único (update e afins) pra cada um.

Abraço.

1 curtida

Valeu cara, eu realmente to um pouco enfurrujado com lógica de programação, até esqueci o fato de poder usar vetores pra solucionar o casokkk, um grande abraço