#0 

28-05-2007 10:47:21

bubkadk
Membre
Date d'inscription: 12-04-2007
Messages: 25

Salut à tous,

je suis actuellement en train de developper un petit FPS et pour gérer les sauts j'ai trouvé ceci:

Code:

SKeyMap keyMap[9];
     keyMap[0].Action = EKA_MOVE_FORWARD;
     keyMap[0].KeyCode = KEY_UP;
     keyMap[1].Action = EKA_MOVE_FORWARD;
     keyMap[1].KeyCode = KEY_KEY_W;
                           .
                           .
                           .
                           .
     keyMap[8].Action = EKA_JUMP_UP;
     keyMap[8].KeyCode = KEY_SPACE;

p.camera1 = smgr->addCameraSceneNodeFPS(0, 100.0f, 300.0f, -1, keyMap, 9,true,1.0);

Quand j'appuie sur la touche espace, j'ai bien un saut , mais il faut que je reste appuyé sur cette touche pour que le saut semble naturel et soit complet.
En effet quand je relache la barre espace, la camera retombe tout de suite.

J'aimerais savoir si l'un d'entre vous sait comment je peux faire pour activer un saut complet et naturel en appuyant normalement sur la touche espace. (j'ai essayé de reduire la gravité mais cela ne change rien du tout)

je vous en remercie d'avance.

Dernière modification par bubkadk (28-05-2007 10:48:03)

Hors ligne


#1 

28-05-2007 13:23:16

Jerry Kan
Habitué
Date d'inscription: 21-11-2006
Messages: 265

je pense que ca viens essentiellement de la facon dont tu gère ton saut, je pense que tu as une fonction qui calcule la position de la caméra pendant le saut, et qu'elle ne le faut que si espace est enfoncé

c'est pas la solution la plus propre, mais je te propose ca :
quand tu appuis sur espace, tu met a Vrai un booléen et tu lance le saut, (si il est pas deja en cours) ta fonction de calcul des positions successive  est conditionné par cette variable booléenne et le booléen est passé a Faux uniquement quand tu retouche de nouveau le sol

l'idée c'est rendre la fonction de calcul des positions successives indépendante de la touche

Hors ligne


#2 

28-05-2007 14:10:18

bubkadk
Membre
Date d'inscription: 12-04-2007
Messages: 25

ok, je te remercie, je vais essayer.


j'ai trouvé ceci en fouillant un peu sur le forum anglais:

http://irrlicht.sourceforge.net/phpBB2/ … light=jump

j'ai essayé, j'ai du faire 1 ou deux modifs dans le code du constructeur.

Dernière modification par bubkadk (28-05-2007 15:13:27)

Hors ligne


#3 

16-06-2007 15:51:23

Willikus
Abonné
Date d'inscription: 21-10-2006
Messages: 150
Site web

Salut !

Ca fait longtemps que je ne suis pas revenu sur le forum car mon projet pietine   sad

La gestion du saut (que j'avait oublier yikes) me parait une bonne idée pour que je m'y remette.



Si ce n'est pas trop abusé, bubkadk, pourrait tu m'expliquer d'ou vient "EKA_JUMP_UP;"

PS : Si cela fait partie d'Irrlicht 1.3, quelqu'un pourrait me dire quel fonction remplace la fonction PreRender(); de la 1.2 (il me semble que c'est sont nom), qui m'est pour l'instant nécessaire pour l'herbe du GrassNode
C'est bon, j'ai trouvé !



Ensuite, si tu a réussi a faire un truc potable, peut tu me le passer stp... (je sais, ça fait mandiant, mais j'ai passer trop de temps dessus pour m'arreter sur cette apparence)

Merci d'avance

a+
w

Dernière modification par Willikus (16-06-2007 21:45:18)


Athlon 3000+ / 1024Mo PC3200 /8800 GTS

Hors ligne


#4 

17-06-2007 10:55:20

Willikus
Abonné
Date d'inscription: 21-10-2006
Messages: 150
Site web

Salut !

Je sais que ça ne se fait pas de poster deux fois... mais j'ai un peu avancé dans mes maigres recherches...

J'ai essayer d'adapté mon programme a Irrlicht 1.3 et voir le EKA_JUMP_UP, ça se tient mais comme l'a dit bubkadk le saut n'est pas digne d'un FPS...

(De plus, Irrlicht 1.3 est vraiment incompatible : j'ai réussi a adapté le code GrassNode pour que DevCpp compile mais le programme ne peu démarer hmm)

Ensuite j'ai essayer de voir du coté de ton lien mais je n'arrive même pas inclure le .h !!! (je suis nul faut dire)

J'ai cree 2 fichiers CJumpingAnimator .h/.cpp dans le même dossier (et je les est rempli de leurs contenue) et je l'est inclue comme tel :

#include "CJumpingAnimator.h" dans mon code.

Mais après, impossible de compilé avec ce code (livré avec smile ) :

if(GameReceiver.getKeyState(KEY_SPACE) && !g_PhysicsAnim->isFalling())
{
    g_PhysicsAnim->jump(vector3df(0,20,0),vector3df(0,-0.5,0));
}

Il ne connait pas "GameReceiver" (j'ai bien essayer de le remplacer par mon receiver mais nada), "g_PhysicsAnim", "..."
Donc il me manque quelque chose mais je ne vois pas quoi...
J'ai bien essayer de comprendre la suite du poste mais ça ne m'avance pas beaucoup :'(



Merci de m'aider,

a+
w

EDIT : j'ai réussi a débloquer un peu la chose mais maintenant sa plante le programme : voici mon code actuel :

scene::ISceneNodeAnimator *animJ = new scene::CSceneNodeAnimatorJumpingCollisionResponse(smgr2, metaSelector , camera);


Donc rien que ça fait planter le programme.

Ensuite j'ai essayer d'ajouté :
         animJ->jump(vector3df(0,20,0),vector3df(0,-0.5,0));

Mais il me marque que "la classe irr:scene::ISceneNodeAnimator n'a pas de membre se nommant 'jump'"

Possibilité de m'aider sur ce point ? (ou depuis le début si tout est nul)


a+
w

Dernière modification par Willikus (17-06-2007 18:55:19)


Athlon 3000+ / 1024Mo PC3200 /8800 GTS

Hors ligne


#5 

19-06-2007 11:44:25

bubkadk
Membre
Date d'inscription: 12-04-2007
Messages: 25

Salut a tous ,

Le constructeur de la classe CJumpingAnimator est le suivant:

Code:

CSceneNodeAnimatorJumpingCollisionResponse::CSceneNodeAnimatorJumpingCollisionResponse( 
      ISceneManager* scenemanager, 
      ITriangleSelector* world, ISceneNode* object, 
      const core::vector3df& ellipsoidRadius, 
      const core::vector3df& gravityPerSecond, 
      const core::vector3df& ellipsoidTranslation, 
      f32 slidingSpeed, ITimer* Timer) 
: SceneManager(scenemanager), World(world), Object(object), 
   Radius(ellipsoidRadius), Gravity(gravityPerSecond / 1000.0f), CurrGravity(gravityPerSecond / 1000.0f), 
   SlidingSpeed(slidingSpeed), Translation(ellipsoidTranslation) 
{                         
   if (World) 
      World->grab(); 

   if (Object) 
      LastPosition = Object->getPosition(); 

   Falling = false; 

   LastTime = Timer->getTime();  
   FallStartTime = LastTime; 

   RefTriangle.pointA.set(0.0f, 0.0f, 0.0f); 
   RefTriangle.pointB.set(0.0f, 0.0f, 0.0f); 
   RefTriangle.pointC.set(0.0f, 0.0f, 0.0f);
}

Pour la fonction de saut je ne sais pas pourquoi la personne qui a développé ce fichier à intégré un Timer.
J'ai donc mis on commentaire les lignes

Code:

   LastTime = Timer->getTime();  
   FallStartTime = LastTime;

Et ensuite, sur le forum anglais, il y a une petite erreur au niveau de l'instanciation, ce n'est pas

Code:

ISceneNodeAnimator *anim = new CSceneNodeAnimatorJumpingCollisionResponse(smgr, metaSelector, camera);
mais c'est 
CSceneNodeAnimatorJumpingCollisionResponse *anim = new CSceneNodeAnimatorJumpingCollisionResponse(smgr, metaSelector, camera);

Sinon c'est pas logique, on mettait un CSceneNodeAnimatorJumpingCollisionResponse dans un ISceneNodeAnimator, ç ane peut pas marcher.

Normalement aprés ces modifs le programme ne devrait plus planter smile

J'espere qure ça va vous aider.

Hors ligne


#6 

19-06-2007 15:25:03

Willikus
Abonné
Date d'inscription: 21-10-2006
Messages: 150
Site web

Merci beaucoup !!!

La c'est génial : ce code il faudrait le mettre en post-it voir en ressource a télécharger (au droit de l'auteurs naturellement) car il est simple a installé et assez efficace (je dit simple apres l'explication de bubkadk wink)


Non, sans déconner, sa éviterais bien des dégout au nouveau ou peu expérimenté (comme moi) lors de la création de FPS avec Irrlicht !

Encore Merci à Bubkadk !!!


a+
w


Athlon 3000+ / 1024Mo PC3200 /8800 GTS

Hors ligne


#7 

19-06-2007 18:09:58

bubkadk
Membre
Date d'inscription: 12-04-2007
Messages: 25

De rien, c'est toujours un plaisir wink

Hors ligne


#8 

20-06-2007 19:22:44

izguit
Administrateur
Lieu: 127.0.0.1
Date d'inscription: 14-09-2006
Messages: 306
Site web

go section routine bubkadk smile
Ca la remplira un peu


Athlon 64 3000+ // 1Go RAM // Geforce 6600GT 128Mo
Turion 64 X2 // 1Go RAM // ATI X1250

Hors ligne


#9 

21-02-2009 22:54:52

NeoCrysis
Membre
Date d'inscription: 20-02-2009
Messages: 11

Désolé de faire du déterrage de topic mais j'obtiens une erreur en utilisant le code cité au dessus.

Code:

C:\Documents and Settings\Neo\Mes documents\Programmation\c++\irrlicht\demo\CJumpingAnimator.h||In constructor `irr::scene::CSceneNodeAnimatorJumpingCollisionResponse::CSceneNodeAnimatorJumpingCollisionResponse(irr::scene::ISceneManager*, irr::scene::ITriangleSelector*, irr::scene::ISceneNode*, const irr::core::vector3df&, const irr::core::vector3df&, const irr::core::vector3df&, irr::f32, irr::ITimer*)':|
C:\Documents and Settings\Neo\Mes documents\Programmation\c++\irrlicht\demo\CJumpingAnimator.h|76|warning: `irr::scene::CSceneNodeAnimatorJumpingCollisionResponse::SceneManager' will be initialized after|
C:\Documents and Settings\Neo\Mes documents\Programmation\c++\irrlicht\demo\CJumpingAnimator.h|74|warning:   `irr::scene::ITriangleSelector*irr::scene::CSceneNodeAnimatorJumpingCollisionResponse::World'|
C:\Documents and Settings\Neo\Mes documents\Programmation\c++\irrlicht\demo\CJumpingAnimator.cpp|22|warning:   when initialized here|
C:\Documents and Settings\Neo\Mes documents\Programmation\c++\irrlicht\demo\CJumpingAnimator.h|75|warning: `irr::scene::CSceneNodeAnimatorJumpingCollisionResponse::Object' will be initialized after|
C:\Documents and Settings\Neo\Mes documents\Programmation\c++\irrlicht\demo\CJumpingAnimator.h|68|warning:   `irr::core::vector3df irr::scene::CSceneNodeAnimatorJumpingCollisionResponse::Radius'|
C:\Documents and Settings\Neo\Mes documents\Programmation\c++\irrlicht\demo\CJumpingAnimator.cpp|22|warning:   when initialized here|
C:\Documents and Settings\Neo\Mes documents\Programmation\c++\irrlicht\demo\CJumpingAnimator.h|71|warning: `irr::scene::CSceneNodeAnimatorJumpingCollisionResponse::Gravity' will be initialized after|
C:\Documents and Settings\Neo\Mes documents\Programmation\c++\irrlicht\demo\CJumpingAnimator.h|69|warning:   `irr::core::vector3df irr::scene::CSceneNodeAnimatorJumpingCollisionResponse::CurrGravity'|
C:\Documents and Settings\Neo\Mes documents\Programmation\c++\irrlicht\demo\CJumpingAnimator.cpp|22|warning:   when initialized here|
C:\Documents and Settings\Neo\Mes documents\Programmation\c++\irrlicht\demo\CJumpingAnimator.h|81|warning: `irr::scene::CSceneNodeAnimatorJumpingCollisionResponse::SlidingSpeed' will be initialized after|
C:\Documents and Settings\Neo\Mes documents\Programmation\c++\irrlicht\demo\CJumpingAnimator.h|72|warning:   `irr::core::vector3df irr::scene::CSceneNodeAnimatorJumpingCollisionResponse::Translation'|
C:\Documents and Settings\Neo\Mes documents\Programmation\c++\irrlicht\demo\CJumpingAnimator.cpp|22|warning:   when initialized here|
C:\Documents and Settings\Neo\Mes documents\Programmation\c++\irrlicht\demo\demo.cpp||In member function `void Demo::initCamera()':|
C:\Documents and Settings\Neo\Mes documents\Programmation\c++\irrlicht\demo\demo.cpp|118|error: cannot allocate an object of type `irr::scene::CSceneNodeAnimatorJumpingCollisionResponse'|
C:\Documents and Settings\Neo\Mes documents\Programmation\c++\irrlicht\demo\demo.cpp|118|error:   because the following virtual functions are abstract:|
C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\irr\ISceneNodeAnimator.h|46|error:  virtual irr::scene::ISceneNodeAnimator* irr::scene::ISceneNodeAnimator::createClone(irr::scene::ISceneNode*, irr::scene::ISceneManager*)|
C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\irr\ISceneNodeAnimatorCollisionResponse.h|37|error:  virtual bool irr::scene::ISceneNodeAnimatorCollisionResponse::isFalling() const|
C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\irr\ISceneNodeAnimatorCollisionResponse.h|69|error:  virtual void irr::scene::ISceneNodeAnimatorCollisionResponse::jump(irr::f32)|
C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\irr\ISceneNodeAnimatorCollisionResponse.h|78|error:  virtual void irr::scene::ISceneNodeAnimatorCollisionResponse::setEllipsoidTranslation(const irr::core::vector3df&)|
||=== Build finished: 6 errors, 13 warnings ===|

Une idée d'ou cela pourrait provenir ?...

Hors ligne


#10 

22-02-2009 09:32:56

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

Sans vraiment avoir regardé, vu la date des posts originaux, ne serait-ce pas une histoire de d'incompatibilité entre
plusieurs version d'Irrlicht ?


Force et sagesse...

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
1426 sujets
11116 messages
Dernier membre inscrit: Bidule
19 invités en ligne
Aucun membre connecté
RSS Feed