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 ![]()
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 !
Hors ligne
02-10-2013 20:57:42
- Magun
- Administrateurs

- 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
03-10-2013 19:25:12
- johnplayer
- Membres

- 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
03-10-2013 19:43:25
- Magun
- Administrateurs

- 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
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
04-10-2013 16:52:30
- Magun
- Administrateurs

- Date d'inscription:
- Messages: 910
- IP: 92.146.238.229
- Courriel Site web
pas de soucis ![]()
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
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
04-10-2013 18:17:24
- Magun
- Administrateurs

- 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
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
05-10-2013 19:02:30
- Magun
- Administrateurs

- 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
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 ! ![]()
Hors ligne
05-10-2013 19:49:13
- Magun
- Administrateurs

- Date d'inscription:
- Messages: 910
- IP: 37.220.55.160
- Courriel Site web
pas de soucis ![]()
Hors ligne



