Ton problème est que tu ne veux pas comprendre les choses existantes, tu préfères de les refaire, malgré que cela durera beaucoup plus longtemps et le resultat sera pire. std::function est un bon exemple, elle offre tout ce qu'il faut, mais apparemment tu n'as toujours pas compris ce concepte. Nous avons essayé de te dire cela plusieures foix, c'est dommage que tu préfères de ne pas nous écouter.
Ce n'est pas une question que je ne veux pas écouter les conseils des autres et j'ai très bien compris le concept de std::function et de std::bind, mais le gros défaut de ces 2 objects, c'est qu'ils ne permettent pas de faire des tableaux sur des pointeurs de fonction quelconque.
Bref je te défie de faire un wrapper sur un std::function ou bien sur un std::bind. (avec un nombre variable d'arguments)
Avec ton tutoriel si j'ai bien lu on est obligé de faire soit un foncteur (SpriteMover dans ton cas) qui appelle la fonction ou bien de passer un std::bind (ou un std::function) à ta méthode connect pour l'appelé directement.
Ici, pas besoin, une fonction membre statique suffit :
#ifndef MY_APPLI
#define MY_APPLI
#include "SFGL/Core/application.h"
#include "SFGL/Graphics/2D/tile.h"
#include "SFGL/Graphics/2D/map.h"
#include "SFGL/Graphics/2D/ambientLight.h"
#include "SFGL/Core/action.h"
#include "SFGL/Core/object.h"
#define SPEED 0.1
using namespace sfgl;
using namespace sf;
class MyAppli : public Application {
public :
Map* theMap;
MyAppli(sf::RenderWindow &window) : Application (window) {
running = false;
}
static void close (sf::RenderWindow *window) {
window->close();
}
static void keyHeldDown (sf::View *view, sf::Keyboard::Key key) {
if (key == sf::Keyboard::Key::Z) {
view->move (0, -10);
} else if (key == sf::Keyboard::Key::Q) {
view->move (-10, 0);
} else if (key == sf::Keyboard::Key::S) {
view->move (0, 10);
} else if (key == sf::Keyboard::Key::D) {
view->move (10, 0);
}
}
static void mouseInside (Vector2f mousePos) {
BoundingRectangle br (0, 0, 100, 100);
if (br.isPointInside(Vec2f(mousePos.x, mousePos.y))) {
std::cout<<"Mouse inside!"<<std::endl;
}
}
void load() {
TextureManager &tm = getCache().resourceManager<Texture>("TextureManager");
tm.load("tilesets/herbe.png", "GRASS");
tm.load("tilesets/murs.png", "WALLS");
View view = getWindow().getDefaultView();
Vec2f pos (view.getCenter().x - view.getSize().x * 0.5f, view.getCenter().y - view.getSize().y * 0.5f);
BoundingRectangle br (pos.x, pos.y, view.getSize().x, view.getSize().y);
theMap = new Map (100, 50, 30, "Map test");
std::vector<Tile*> tiles;
std::vector<Tile*> walls;
tiles.push_back(new Tile(tm.getResourceByAlias("GRASS"), Vec2f(0, 0), Vec2f(120, 60),IntRect(0, 0, 100, 50), 0));
walls.push_back(new Tile(tm.getResourceByAlias("WALLS"), Vec2f(0, 0), Vec2f(100, 100), IntRect(100, 0, 100, 100), 0));
walls.push_back(new Tile(tm.getResourceByAlias("WALLS"), Vec2f(0, 0), Vec2f(100, 100), IntRect(100, 100, 100, 100), 1));
walls.push_back(new Tile(tm.getResourceByAlias("WALLS"), Vec2f(0, 0), Vec2f(100, 100), IntRect(100, 200, 100, 100), 1));
walls.push_back(new Tile(tm.getResourceByAlias("WALLS"), Vec2f(0, 0), Vec2f(100, 100), IntRect(100, 300, 100, 100), 1));
walls.push_back(new Tile(tm.getResourceByAlias("WALLS"), Vec2f(0, 0), Vec2f(100, 100), IntRect(100, 400, 100, 100), 1));
walls.push_back(new Tile(tm.getResourceByAlias("WALLS"), Vec2f(0, 0), Vec2f(100, 100), IntRect(100, 500, 100, 100), 1));
BoundingRectangle rect(0, 0, 1000, 1000);
theMap->generate_map(tiles, walls, rect);
theMap->checkVisibleEntities(br);
}
void init () {
View view = getWindow().getDefaultView();
Bind<void(sf::RenderWindow*)> slot (&MyAppli::close, &getWindow());
closedAction = new Action<sf::RenderWindow*>(slot);
Bind<void(sf::View*, sf::Keyboard::Key)> slot2 (&MyAppli::keyHeldDown, &view, sf::Keyboard::Key::Unknown);
moveAction = new Action<sf::View*, sf::Keyboard::Key> (slot2, false);
sf::Event endEvent1, endEvent2, endEvent3, endEvent4;
sf::Event event1, event2, event3, event4;
event1.type = sf::Event::KeyPressed;
event1.key.code = sf::Keyboard::Key::Z;
event2.type = sf::Event::KeyPressed;
event2.key.code = sf::Keyboard::Key::Q;
event3.type = sf::Event::KeyPressed;
event3.key.code = sf::Keyboard::Key::S;
event4.type = sf::Event::KeyPressed;
event4.key.code = sf::Keyboard::Key::D;
endEvent1.type = sf::Event::KeyReleased;
endEvent1.key.code = sf::Keyboard::Key::Z;
endEvent2.type = sf::Event::KeyReleased;
endEvent2.key.code = sf::Keyboard::Key::Q;
endEvent3.type = sf::Event::KeyReleased;
endEvent3.key.code = sf::Keyboard::Key::S;
endEvent4.type = sf::Event::KeyReleased;
endEvent4.key.code = sf::Keyboard::Key::D;
moveAction->linkEvents(event1, endEvent1);
moveAction->linkEvents(event2, endEvent2);
moveAction->linkEvents(event3, endEvent3);
moveAction->linkEvents(event4, endEvent4);
System::connect("MouseInside", Function<void> (&MyAppli::mouseInside));
}
void render() {
if (getWindow().isOpen())
{
// clear the window with black color
getWindow().clear(sf::Color::Black);
std::vector<Entity*> entities = theMap->getVisibleEntities("E_GROUND+E_WALL");// draw everything here...
for (unsigned int i = 0; i < entities.size(); i++) {
getWindow().draw(*entities[i]);
}
/*entities = theMap->getVisibleEntities("E_WALL");// draw everything here...
for (unsigned int i = 0; i < entities.size(); i++) {
getWindow().draw(*entities[i]);shadow = new ShadowWall(*light, this);
}*/
// end the current frame
getWindow().display();
}
}
void update () {
// check all the window's events that were triggered since the last iteration of the loop
sf::Event event;
while (getWindow().pollEvent(event))
{
if (event.type == sf::Event::Closed) {
closedAction->pushEvent(event, event.type);
closedAction->process();
running =false;
}
if (event.type == sf::Event::KeyPressed || event.type == sf::Event::KeyReleased) {
moveAction->pushEvent(event, event.type);
View view = getWindow().getView();
moveAction->changeParams(&view, event.key.code);
moveAction->process();
getWindow().setView(view);
}
if (event.type == sf::Event::MouseMoved) {
Vector2f mousePos = Vector2f(event.mouseMove.x, event.mouseMove.y);
System::emit ("MouseInside", Vec2f(mousePos.x, mousePos.y));
}
}
}
void stop() {
running = false;
}
int exec () {
load();
init();
running = true;
while (running) {
render();
update();
}
return EXIT_SUCCESS;
}
~MyAppli () {
}
private:
bool running;
Action<sf::RenderWindow*> *closedAction;
Action<sf::View*, sf::Keyboard::Key> *moveAction;
};
#endif // MY_APPLI
De plus mon système offre la possibilité de gérer ses propres signaux, (Et pas seulement des signaux lié à une action, par exemple, lorsque la souris rentre dans une zone, avec thor, je devrai définir une action pour chaque pixel de la zone)
Ca serait une thème interessante à discuter, mais il faudrait regarder Thor d'une perspective qui ne couvre pas seulement toi, mais une grande partie des utilisateurs d'SFML. Toi, tu argumentes toujours de tes demandes spécifiques (qui sont souvent très bizarres) est tu n'essaye même pas de comprendre les autres.
Je peux juste répéter ce qui a été dit une douzaine des foix: Comprends les conceptes (en ce cas ceux de Thor) et écoute les gens. Il y en a beaucoup qui ont plus d'éxperience que toi, et ils veulent t'aider, mais pour cela il faut être plus ouvert aux conseils.
Tu me fais pensé lorsque je vais me présenté à un entretient d'embauche pour un poste de programmeur ou me répond à chaque fois ceci : (tu n'as pas assez d'expériences donc ont a pris quelqu'un qui a plus d'expérience que toi)
Ou bien lorsqu'on compare mon expérience avec ma personnalité.
De belles conneries...
Bref je n'ai pas envie de discuter plus longtemps ici, car je perds mon temps, j'ai fais un truc qui marche en y ayant passé beaucoup de temps, c'est l'essentiel, je m'en fou complètement d'avoir +/- d'expérience que les autres ou d'être plus renfermé sur moi même. (Heureusement que y'a des gens plus malin qui ne m'ignorent pas juste à cause de ça)
Au pire je pourrai toujours mettre ça vraiment au point par la suite, bref, tu verras quand mon 1er jeux sera sorti et après tu jugeras mais merci de ne pas me juger n'importe comment.
PS : De plus j'ai dû faire de la prédiction de mouvements, une intelligence artificielle, un entity-system, du chargement de ressource via le réseau, bref, beaucoup de chose que thor n'offre pas. (Et j'ai même commencé à dessiner des objets en 3D et à me déplacer dans la scene.)
Mais bon on peut toujours me reproché d'être fort renfermé sur moi même et de réfléchir beaucoup, tu sais..., si je devais stopper tout mes projets à cause de ça, autant tout abandonné tout de suite.
PS 2 : avoir plus d'expérience que moi c'est : maîtriser html, php, css, JEE, javascript et JQuery, .NET, etc..., maîtriser le c/c++, le java, opengl, openssl, les matrices (transformations et projections en 2d et en 3d), la prédiction de mouvements, l'intelligence artificielle, la maintenance informatique, etc...
Il faut donc aussi bien avoir de bonne bases en math qu'en programmation et aussi en Anglais
Et je pourrai encore en rajouter sur la liste car je n'ai pas cité toutes les choses que j'ai faîtes là.
Dès que la version 1 de SFGL est finie je compte même attaquer la physique et les effets avec les shaders pour vraiment être au top niveau programmation. (Et plus tard je devrais surement m'attaquer à l'infographie et au son)
Bref pour te dire que j'ai du gérer mon projet ambitieux tout seul depuis des année maintenant, alors, je suis peux être fot renfermé sur moi même mais pour avoir plus d'expérience que moi il faut déjà en avoir fait de choses et pas se limiter à l'utilisation d'une librairie.