#0 

02-10-2013 12:51:09

Boar
Petit nouveau
Date d'inscription: 02-10-2013
Messages: 9

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

Dernière modification par Boar (02-10-2013 14:11:02)

Hors ligne


#1 

02-10-2013 22:57:42

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 908
Corrections: 2
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


#2 

03-10-2013 21:25:12

johnplayer
Habitué
Date d'inscription: 30-09-2007
Messages: 431

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


#3 

03-10-2013 21:43:25

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 908
Corrections: 2
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


#4 

04-10-2013 15:38:13

Boar
Petit nouveau
Date d'inscription: 02-10-2013
Messages: 9

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


#5 

04-10-2013 18:52:30

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 908
Corrections: 2
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


#6 

04-10-2013 19:25:02

Boar
Petit nouveau
Date d'inscription: 02-10-2013
Messages: 9

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


#7 

04-10-2013 20:17:24

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 908
Corrections: 2
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


#8 

05-10-2013 12:58:39

Boar
Petit nouveau
Date d'inscription: 02-10-2013
Messages: 9

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


#9 

05-10-2013 21:02:30

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 908
Corrections: 2
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


#10 

05-10-2013 21:29:20

Boar
Petit nouveau
Date d'inscription: 02-10-2013
Messages: 9

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


#11 

05-10-2013 21:49:13

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 908
Corrections: 2
Site web

pas de soucis smile

Hors ligne


Options Liens officiels Caractéristiques Statistiques Communauté
Corrections
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
881 membres
1427 sujets
11117 messages
Dernier membre inscrit: Bidule
22 invités en ligne
Aucun membre connecté
RSS Feed