#1 

02-10-2013 10:51:09

Boar
Membres
Date d'inscription:
Messages: 9
IP: 109.129.49.249
Courriel

Bonjour,

Etant encore un grand débutant avec Irrlicht (de même en POO), et n'arrivant pas à résoudre mon problème, je me suis décidé à venir demander de l'aide, histoire d'y voir un peu plus claire smile

Alors voilà ; Je tente de créer une classe qui me permettra de faire apparaître mes ennemis sur mon terrain, seulement, est-il possible de passer le sceneManager en paramètre ?

Voici mon code, qui ne fonctionne pas, pourriez-vous me dire où est le problème ?

Main.cpp

Code c++ :

 
#include "Bots.h"
...
Bots::Spawn(&sceneManager);
...


Bots.h

Code c++ :

 

 #include <irrlicht.h>

class Bots
{
    public :

    bool Spawn(irr::scene::ISceneManager &sceneManager);



};


Bots.cpp

Code c++ :


#include <irrlicht.h>
#include "Bots.h"

bool Spawn(irr::scene::ISceneManager &sceneManager)
{

    irr::scene::IAnimatedMeshSceneNode* ninja = sceneManager->addAnimatedMeshSceneNode(sceneManager->getMesh("data/Persos/ninja.b3d"));
    ninja->setMaterialFlag(irr::video::EMF_LIGHTING, false);
    ninja->setPosition(irr::core::vector3df(22,5,0));
    ninja->setFrameLoop(159,164);
    ninja->setAnimationSpeed(5);
    ninja->setScale(irr::core::vector3df(0.7,0.7,0.7));
    if(ninja)
        return true;
    else
        return false;
}



D'avance, Merci ! smile


Hors ligne


#2 

02-10-2013 20:57:42

Magun
Administrateurs
Avatar de Magun
Date d'inscription:
Messages: 910
IP: 92.146.238.229
Courriel  Site web

irr::scene::ISceneManager &sceneManager -> irr::scene::ISceneManager *sceneManager
irlicht crée un pointeur vers sont scene manager, et tu intéragis avec lui par ce biais
or tu déclare un référence, suivant l econtext ça peut marcher mais la syntaxe d'acess est différente

Code c++ :


struct struct_sample
{
     ...
};

void byPtr(struct_sample *a)
{
       // 'a' point to 'base' memory location
       // 'a' and 'base' is the same object (a == base) (value of address is same)
        a->some_function();
}
void byRef(struct_sample &a)
{
       // '&a' have the same memory location of 'base'
       // 'a' and 'base' is the same object (&a == base)
       a.some_function();
}
void byCopy(struct_sample a)
{
       // 'a' is modified but not 'base' (&a != base)
       // 'a' and 'base' is not the same object
       a.some_function();
}

int main(..........
{

       struct_sample *base = new struct_sample;
       byPtr(base);
       byRef(*base);
       byCopy(*base);
}


après pour le concept de spawn tu devraient crée une class dédier a cela

Code c++ :


template<typename T>
class Factory
{
       .... make your function to create enemy of type T, register to your manager, .... etc ...
};

class GenericSpawner : public Factory<{class of your base entity}>,
                       public {class of your base entity for setPosition/setRotation/serialize/...}
{
        ... make function to spaw enemy using derived function getPosition/getRotation/...
};


bon après ce n'est peut être pas indispenssable dans un premier temps et il y a de nombreuse autre façon de spécializer ce context

Hors ligne


#3 

03-10-2013 19:25:12

johnplayer
Membres
Avatar de johnplayer
Date d'inscription:
Messages: 431
IP: 83.192.211.57
Courriel

Je dis peut-être une connerie mais pour appeler

Code c++ :

Bots::Spawn(&sceneManager);

il faut que la méthode soit statique, sinon il faut créer une instance de Bots et l'utiliser "normalement".


core i7 4970K @ 4GHz - 32GB ddr3 19200(2400MHz) - ssd samsung 840 evo 250GB - GTX1080Ti (4K) - Cooler master storm stryker blanc.
"L'alcool, c'est comme Activia, c'est actif à l'intérieur et ça se voit à l'extérieur."

Hors ligne


#4 

03-10-2013 19:43:25

Magun
Administrateurs
Avatar de Magun
Date d'inscription:
Messages: 910
IP: 92.146.238.229
Courriel  Site web

en effect je n'avais pas remarquer
mais ça dépend du context si c'est appeler depuis une classe dériver, pas de soucis, ce qui ne semble pas être le cas
trop fixer sur '&' ...

Hors ligne


#5 

04-10-2013 13:38:13

Boar
Membres
Date d'inscription:
Messages: 9
IP: 109.129.49.249
Courriel

Bonjour,

Magun : - J'ai tenté de résoudre le problème en testant avec les structures que tu m'as données, mais toujours rien. C’est très probablement moi qui ne fait pas ça bien ^^'
En fait tout ce que je voudrais faire, c'est gérer le tout en une fois. Que dès que j'appelle ma méthode, un personnage apparaisse à l'endroit déterminé.
Je me doute que pour pouvoir l'ajouter dans le sceneManager, je vais devoir utiliser un pointeur (non ? ).

Johnplayer : - Que veux-tu dire par " il faut créer une instance de Bots et l'utiliser 'normalement' " ?

J'ai conscience d'avoir encore beaucoup de lacunes avec irrlicht, c'est pour ça que j'y travaille ... ^^'

Encore merci


Hors ligne


#6 

04-10-2013 16:52:30

Magun
Administrateurs
Avatar de Magun
Date d'inscription:
Messages: 910
IP: 92.146.238.229
Courriel  Site web

pas de soucis wink
on t'expliquera pas à pas si veut
voire je/on peut te faire une petit architecture de base pour que tu comprenne quelque concept (template/factory/...)
tu doit aussi comprendre que t'est bots(ici scene node) doivent être encapsuler dans une class entity pour que tu puisse géré des donnée personelles, life/power/ammo/...

il veut dire par la que si tu utilise ta finction de cette façon

Code c++ :


Bots::Spawn(sceneManager);


elle doit être défini de cette façon

Code c++ :


class Bots
{
    public :
        static bool Spawn(irr::scene::ISceneManager *sceneManager);
};


sinon si tu garde ta premier déclaration tu ne peut l'utiliser que via une instance (temporaire ou non)

Code c++ :


Bots tmp;
tmp.Spawn(sceneManager);


l'avantage du second c'est de pouvoir stocker le pointeur du scene manager dans la class Bots/Spawn et de ne pas avoir a la spécifier plustard
genre

Code c++ :


Bots tmp(sceneManager);
tmp.Spawn();
tmp.Spawn();
tmp.Spawn();
tmp.Spawn();
....

Hors ligne


#7 

04-10-2013 17:25:02

Boar
Membres
Date d'inscription:
Messages: 9
IP: 109.129.49.249
Courriel

Oui je vois, j'aimerais donc m'orienter sur la seconde façon, seulement le compilateur m'annonce encore des erreurs ;
"|173|error: no matching function for call to 'Bots::Bots(irr::scene::ISceneManager*&)'|"

"|174|error: no matching function for call to 'Bots::Spawn()'|"

Vois-tu d'où ça pourrait venir ?


Hors ligne


#8 

04-10-2013 18:17:24

Magun
Administrateurs
Avatar de Magun
Date d'inscription:
Messages: 910
IP: 92.146.238.229
Courriel  Site web

il te faut modifier la structure de Bots pour que cette syntaxe soit accepter

Code c++ :


class Bots
{
    public:
      Bots(irr::scene::ISceneManager *mgr) : sceneManager(mgr)
      {
      }
      bool Spawn();
    protected:
      irr::scene::ISceneManager *sceneManager;
};


usage:

Code c++ :


#include <irrlicht.h>

int main(...
{
       make your device
      irr::scene::ISceneManager *smgr = device->getSceneManager();

      Bots *factory = new Bots(mgr);

      factory->Spawn();

      while(device->run())
      {
           ...
      }

      device->drop();
      delete factory;
}


ici j'ai alouer une instance de Bots (new) dans le tas que j'affect a factory et elle s'initialise via sont constructeur Bots(irr::scene::ISceneManager*), il est donc nécéssaire de le désalouer une fois qu'il n'est plus nécéssaire (delete)

Hors ligne


#9 

05-10-2013 10:58:39

Boar
Membres
Date d'inscription:
Messages: 9
IP: 109.129.49.249
Courriel

Je dois encore avoir fait une boulette quelque part, car en adaptant ton code au mien, j'ai encore 1 erreur à la ligne "factory -> Spawn()" : Undefined reference to Bots::Spawn()


Hors ligne


#10 

05-10-2013 19:02:30

Magun
Administrateurs
Avatar de Magun
Date d'inscription:
Messages: 910
IP: 37.220.55.160
Courriel  Site web

Code c++ :



#include <irrlicht.h>
#include "Bots.h"

bool Bots::Spawn()
{

    irr::scene::IAnimatedMeshSceneNode* ninja = sceneManager->addAnimatedMeshSceneNode(sceneManager->getMesh("data/Persos/ninja.b3d"));
    if(!ninja) return false;
    ninja->setMaterialFlag(irr::video::EMF_LIGHTING, false);
    ninja->setPosition(irr::core::vector3df(22,5,0));
    ninja->setFrameLoop(159,164);
    ninja->setAnimationSpeed(5);
    ninja->setScale(irr::core::vector3df(0.7,0.7,0.7));
    return true;
}

Hors ligne


#11 

05-10-2013 19:29:20

Boar
Membres
Date d'inscription:
Messages: 9
IP: 109.129.49.249
Courriel

Parfait ! J'ai retourné le truc dans tout les sens, alors que c'était ce "bool Bots::Spawn(){...}" qu'il me manquait dans mon Bots.cpp ! Un GRAND MERCI à toi ! big_smile


Hors ligne


#12 

05-10-2013 19:49:13

Magun
Administrateurs
Avatar de Magun
Date d'inscription:
Messages: 910
IP: 37.220.55.160
Courriel  Site web

pas de soucis smile

Hors ligne


Options Liens officiels Caractéristiques Statistiques Communauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1440 sujets
11337 messages
Dernier membre inscrit: Saidov17
168 invités en ligne
membre en ligne: -
RSS Feed