Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: X3R4CK3R en 8 Agosto 2012, 19:56 pm



Título: [SFML 2.0] Threading or Objects.Update() ?
Publicado por: X3R4CK3R en 8 Agosto 2012, 19:56 pm
Buenas, estoy desarrollando en SFML2.0 una clase "Objects" la cual heredan las clases "TextBox", "Button", etc... Supongo que queda clara la idea.

Cada clase heredera tiene su propio método "Update", el cual se encarga de comprobar si el objeto se ha seleccionado, pulsado, etc. En resumen, permite interactuar con el objeto en lugar de que éste sea estático.

El caso es que he estado pensando si ésta es la mejor forma de hacer objetos interactivos o hay alguna más práctica y/o eficiente. Había pensado en crear un hilo en la inicialización del objeto y que éste se encargue de actualizar el mismo, pero no se si es recomendable crear un hilo para cada objeto, ¿sería eficiente tener una aplicación con 100 hilos? :silbar: supongo que no... pero dejo la duda en el aire a ver si alguien me la puediese resolver.

Dejo el code principal:

Código
  1. void Game::Run()
  2. {
  3.    vector<Objects*> objects;
  4.  
  5.    objects.push_back(new TextBox(100,100,400,32,1));
  6.    objects.push_back(new TextBox(100,160,400,32,0));
  7.    objects.push_back(new Button(100,200,160,32,"Registro"));
  8.    objects.push_back(new Button(340,200,160,32,"Login"));
  9.  
  10.    while(window.isOpen())
  11.    {
  12.        while(window.pollEvent(event))
  13.        {
  14.            if(sf::Keyboard::isKeyPressed(sf::Keyboard::Escape)) window.close();
  15.            for(int i=0; i<objects.size(); i++)
  16.                if(dynamic_cast<TextBox*>(objects[i])!=NULL)
  17.                    if(event.type == sf::Event::TextEntered)
  18.                        objects[i]->TextEntered(static_cast<char>(event.text.unicode));
  19.        }
  20.  
  21.        window.clear(sf::Color(240,240,240));
  22.  
  23.        for(int i=0; i<objects.size(); i++)
  24.        {
  25.            window.draw(objects[i]->GetSpr());
  26.  
  27.            if(dynamic_cast<TextBox*>(objects[i])!=NULL)
  28.                objects[i]->Update(window,event);
  29.        }
  30.  
  31.        window.display();
  32.    }
  33.    exit(0);
  34. }

La cosa es que no me gusta eso de tener que llamar al método update, me gustaría simplemente inicializar el objeto y no tener que tocar nada más desde fuera, a excepción de window.draw(objects->GetSpr()), y como solución solo se me ocurre recurrir al Multi-Threading, pero tampoco me parece lo mejor...

Resumiendo, quiero que al inicializar un objeto éste se actualice de forma automática.

En fin, espero haberme explicado bien y me gustaría saber como lo haríais vosotros, qué forma os parece más eficiente y si se os ocurre alguna otra forma de suprimir el método Update de mi anterior code.

Saludos y gracias de antemano ;)