Salut à tous,
je suis actuellement en train de developper un petit FPS et pour gérer les sauts j'ai trouvé ceci:
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
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
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
Salut !
Ca fait longtemps que je ne suis pas revenu sur le forum car mon projet pietine
La gestion du saut (que j'avait oublier ) 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)
Hors ligne
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 )
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 ) :
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 :
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)
Hors ligne
Salut a tous ,
Le constructeur de la classe CJumpingAnimator est le suivant:
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
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
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
J'espere qure ça va vous aider.
Hors ligne
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 )
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
Hors ligne
De rien, c'est toujours un plaisir
Hors ligne
go section routine bubkadk
Ca la remplira un peu
Hors ligne
Désolé de faire du déterrage de topic mais j'obtiens une erreur en utilisant le code cité au dessus.
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
Sans vraiment avoir regardé, vu la date des posts originaux, ne serait-ce pas une histoire de d'incompatibilité entre
plusieurs version d'Irrlicht ?
Hors ligne