Hola, como andan ? espero que bien :p
Estoy desarrollando un mini motor en SFML, y llegue al punto que quiero administrar las colisiones. Nunca vi otros engines de juegos 2D por lo que no tengo ni idea desde que clase o en que parte del código seria mas elegante poner las verificaciones de colisiones.
Dejo el link al código completo en github https://github.com/0Wind-UpBird/Run-Ball-Run-2
Por ejemplo, yo defino escenarios que agrupan los sprites, y los sprites de cualquier escenario pueden solicitar al escenario (cualquiera definido) los datos de alguno de los sprites que lo componen.
En el juego, yo tengo gráficamente algo así actualmente:
http://k32.kn3.net/taringa/1/5/9/3/6/2/13/casiquecasimiro/BE2.jpg
y no se, si es mejor luego de la captura de eventos, sea desde la clase Pelota la que pregunte "Choque con la plataforma negra ?" o que sea la plataforma negra "Choque con la pelota?"
void CApp::loopGame()
{
while ((*window).isOpen())
{
this->clock.restart();
this->catchEvent();
this->clearScreen();
this->draw();
this->displayWindows();
this->currentTimeInLoop = this->clock.getElapsedTime();
}
}
void CApp::catchEvent()
{
sf::Event evento;
this->updateBeforeEvent();
while ((*window).pollEvent(evento))
{
this->updateEvent(evento);
}
//aca ejecutaria el updateAfterEvent de cada sprite de la escena actual
this->updateAfterEvent();
}
y en cada sprite, cual seria el correcto ?
void Pelota::updateAfterEvent()
{
//choque con la plataform ?
}
void Plataforma::updateAfterEvent()
{
//choque con la pelota ?
}
o si es mejor idea, implementar propio al escenario, "algo" a lo que se le indique previamente "Verifica si todos estos sprites chocan, y si chocan, avísales del choque a estos sprites."
void CApp::loopGame()
{
while ((*window).isOpen())
{
this->clock.restart();
this->catchEvent();
this->clearScreen();
this->draw();
this->displayWindows();
this->currentTimeInLoop = this->clock.getElapsedTime();
}
}
void CApp::catchEvent()
{
sf::Event evento;
this->updateBeforeEvent();
while ((*window).pollEvent(evento))
{
this->updateEvent(evento);
}
//Cordinador es mi clase que agrupa y cordina los escenarios, cuando termina uno, cual sigue, etc...
this->cordinador->getEscenario()->VerificarTodasLasColiciones();
this->updateAfterEvent();
}
}
y tener previamente en el escenario juego
#include "EscenaJuego.h"
CEscenaJuego::CEscenaJuego(void)
{
this->key = ESCENA_JUEGO;
}
CEscenaJuego::~CEscenaJuego(void)
{
}
bool CEscenaJuego::isEndEscena(sf::Event)
{
return false;
}
std::string CEscenaJuego::getKeyOfNextEscena()
{
std::string str = "";
return str;
}
void CEscenaJuego::InicializarColisiones()
{
//el mensaje de aviso del choque daría info del mismo, como cordenada del choque, sprites involucrados, etc...
this->MenejadorDeColisiones->AgregarVerficiacion(Array_De_Objetos_A_Verificar, Array_de_Objetos_A_Avisar_en_Caso_de_Choque);
this->MenejadorDeColisiones->AgregarVerficiacion(Array_De_Objetos_A_Verificar, Array_de_Objetos_A_Avisar_en_Caso_de_Choque);
this->MenejadorDeColisiones->AgregarVerficiacion(Array_De_Objetos_A_Verificar, Array_de_Objetos_A_Avisar_en_Caso_de_Choque);
}
Desde ya muchas gracias y felices fiestas :p