La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
FAQ
Rechercher
Liste des Membres
Groupes d'utilisateurs
S'enregistrer Se connecter pour vérifier ses messages privés Connexion
S'enregistrer Se connecter pour vérifier ses messages privés Connexion
La date/heure actuelle est 23/11/2024 21:18:50
La Bibliothèque de Neverwinter Nights Index du Forum »
La Bibliothèque Binaire du NWScript - Neverwinter Nights
Voir le sujet précédent ¤ Voir le sujet suivant | |
---|---|
Auteur | Message |
Elanam Alarune Novice Messages: 19 Localisation: Dans les Bas Fonds de Kemper, là où les korrigans dansent la gigue |
Bonjour !
Je suis nouveau sur ce forum et débutant en scriptage. J'ai un problème dont la solution est peut-être évidente mais cela fait un moment que je cherche et je n'ai toujours pas trouvé. J'aimerais pouvoir calculer la durée que met un personnage pour aller d'un point A à un point B. J'ai évidemment pensé à durée = vitesse*distance en prenant comme poin t de départ la fonction GetTimeSecond. Le problème c'est que je ne sais pas non plus calculer la vitesse du personnage ! La fonction GetMovementRate ne me calcule pas la vitesse en mètre/seconde . S'il vous plaît, aidez-mooooiii !!! _________________ Nous sommes des héros, Bouh ! Les rodeurs et les hamsters, partout, content nos exploits ! |
Revenir en haut | |
Longbow Grand Sage du Conseil Messages: 638 Localisation: Orléans |
Hum, hum...
Premiers éléments de réponse comme disent les journaleux... grâce au Lexicon. La fontion GetMovementRate(object) peut te permettre de connaître la vitesse d'une créature. 1e colonne en marchant, la seconde en courant (en mètre/ round). PC Movement: 2.00, 4.00 Immobile: 0.00, 0.00 Very Slow: 0.75, 1.50 Slow: 1.25, 2.50 Normal: 1.75, 3.50 Fast: 2.25, 4.50 Very Fast: 2.75, 5.50 DM Fast: 5.50, 11.00 Rq: attention aux potions et autres incantations pour augmenter la vitesse (EffectMovementSpeedIncrease) _________________ Rex illeteratus Quasi Asinus Coronatus Jean de Salisbury |
Revenir en haut | |
Elanam Alarune Novice Messages: 19 Localisation: Dans les Bas Fonds de Kemper, là où les korrigans dansent la gigue |
Tout d'abord merci d'avoir répondu
ok, ça j'ai vu. Mais, la fonction GetMovementRate me donne un integer qui correspond à la vitesse du PC. Il ne me donne donc pas vraiment la vitesse du PC, mais seulement un code : 0 = PC speed, 1=immobile, etc... Peut-être suis-je un peut bête mais je ne vois donc pas comment m'en servir pour calculer le temps que le PC met à aller à un point A à un point B. Si tu vois ce que je veux dire ... _________________ Nous sommes des héros, Bouh ! Les rodeurs et les hamsters, partout, content nos exploits ! |
Revenir en haut | |
Longbow Grand Sage du Conseil Messages: 638 Localisation: Orléans |
Hum, hum...
Je ne suis pas un matheux et encore moins fort à la course en sac, mais une équivalence pourrait peut-être faire l'affaire... du genre: NWScript :
void main() { int iRate = GetMovementRate(GetFirstPC()); float fVitesse; float fDist = GetDistanceBetween(GetObjectByTag("Ptd'arrivee"),GetFirstPC()); if (iRate == 0) {fVitesse = 2.0;} else if (iRate == 1) {fVitesse = 0.0;} else if (iRate == 2) {fVitesse = 0.75;} // Etc... float fTotal = fVitesse*fDist; string SResult = FloatToString (fTotal); SendMessageToPC(GetFirstPC(), "" + SResult); } Ca compile, mais je n'ai aucune certitude de la justesse de ce magma de float et d"interger... _________________ Rex illeteratus Quasi Asinus Coronatus Jean de Salisbury |
Revenir en haut | |
lendraste Grand Maître Chanteur du Conseil Messages: 1403 Localisation: Quelque part ailleurs |
Elanam Alarune a écrit : Peut-être suis-je un peut bête mais je ne vois donc pas comment m'en servir pour calculer le temps que le PC met à aller à un point A à un point B.
Ca me paraît un peu ambigu tel que tu l'as présenté. Est-ce le temps que le personnage "mettra" à le faire, donc un calcul théorique, ou le temps qu'il "a mis", donc factuel, qui t'intéresse ?
Si tu vois ce que je veux dire ... Dans le premier cas, la réponse de Longbow me semble convenable. Dans le second, il y a de l'idée avec GetTimeSecond, mais tu t'es arrêté un peu vite. GetTimeSecond te donne seulement le nombre de seconde écoulé dans la minute courante. Il te faut GetTimeMinute et GetTimeHour pour avoir une heure précise de départ et encore faut-il que le personnage parte du point A et arrive au point B le même jour. Si son départ et son arrivée son à cheval sur 2 jours il te faudra aussi tenir compte de la date, donc GetCalendarDay, GetCalendarMonth et GetCalendarYear dans le même temps. La technique de base consiste à noter la date et l'heure de départ au moment où il quitte le point A. Le OnExit d'un déclencheur peut faire l'affaire. Ensuite, dans le OnEnter du déclencheur d'arrivée, tu récoltes l'heure d'arrivée et tu réalises une soustraction. Voici le code à placer sur les deux déclencheurs en question : NWScript :
void main() { object oCreature = GetExitingObject(); int nSecond = GetTimeSecond(); int nMinute = GetTimeMinute(); int nHour = GetTimeHour(); int nDay = GetCalendarDay(); int nMonth = GetCalendarMonth(); int nYear = GetCalendarYear(); int nTotalSecond = nSecond + nMinute * 60 + FloatToInt(HoursToSeconds(nHour)); int nTotalDay = nYear * 12 * 28 + nMonth * 28 + nDay; SetLocalInt(oCreature, "START_SECOND", nTotalSecond); SetLocalInt(oCreature, "START_DAY", nTotalDay); } void main() { object oCreature = GetEnteringObject(); int nSecond = GetTimeSecond(); int nMinute = GetTimeMinute(); int nHour = GetTimeHour(); int nDay = GetCalendarDay(); int nMonth = GetCalendarMonth(); int nYear = GetCalendarYear(); int nTotalSecond = nSecond + nMinute * 60 + FloatToInt(HoursToSeconds(nHour)); int nTotalDay = nYear * 12 * 28 + nMonth * 28 + nDay; int nSTotalSecond = GetLocalInt(oCreature, "START_SECOND"); int nSTotalDay = GetLocalInt(oCreature, "START_DAY"); int nDiffDay = nTotalDay - nSTotalDay; int nTotalDiff = nDiffDay * FloatToInt(HoursToSeconds(24)) + nTotalSecond - nSTotalSecond; SendMessageToPC(oCreature, "Vous avez mis " + IntToString(nTotalDiff) + ""); } Un petit peu de commentaire : La séparation du calcul des jours et des secondes écoulées dans le jour est volontaire. En effet, calculer le nombre absolu de seconde écoulée dans le module par rapport à l'an 0 du calendrier du module mène le plus souvent à un dépassement de capacité des entiers comme des float (les entiers à cause d'un dépassement du maximum, les floats à cause des approximations). En calculant la difference du nombre de jour, nous réduisons le risque de dépassement. A moins de vouloir les millisecondes (car c'est possible), ce résultat à la seconde prêt se basant sur l'écoulement du temps dans le module tiendra compte des arrêts de jeu (mise en pause, sauvegarde et arrêt du jeu pour une reprise ultérieure, etc..). On peut bien sur améliorer la chose... Par exemple en s'efforçant de ne prendre qu'une seule valeur de départ, car dans l'état actuel, le PJ pourrait revenir dans le déclencheur de départ pour en ressortir et ainsi reprendre un temps de départ. Les scripts n'ont pas été testés, ils comportent peut-être des erreurs. _________________ Lendraste de Loreval Qui cherche la Vérité cherche celui qui la détient, car elle n'existe pas à l'état naturel. La cité des mensonges - 1 |
Revenir en haut | |
Elanam Alarune Novice Messages: 19 Localisation: Dans les Bas Fonds de Kemper, là où les korrigans dansent la gigue |
Ehm ...
En effet, en me relisant, j'ai bien vu que ce n'était pas très clair, aussi je m'en excuse. En fait, ce que je cherche, c'est davantage la solution apportée par Longbow que celle apportée par lendraste. Ce script doit me permettre de calculer la distance à parcourir et non celle déjà parcourue afin de l'inclure dans une cinématique. La solution de Longbow en fait marche très bien à ceci près que dans la cinématique (j'utilise la fonction GestaltCameraMove qui est plus que très utile quand on n'a pas compris comment marchaient celles de base) il met faut une durée en seconde et pas en round, d'où certaines modifications. Voilà mon script : NWScript :
//:///////////////////////// ///////////////////// //:: Name cadf_discuskmiag //:: Copyright (c) 2001 Bioware Corp. //:///////////////////////// //////////////////// /* Le plus gros du script pour la cinematique dans la salle d'invocation du Centre Adminiistratif. */ //:///////////////////////// //////////////////// //:: Created By: Elanam Alarune //:: Created On: //:///////////////////////// //////////////////// #include "ressourcevariabl" #include "in_g_cameramove" void main() { object oPC = GetEnteringObject (); if (!GetIsPC(oPC)) return; object oArrive; GestaltStopCameraMoves (oPC); DelayCommand (1.0, AssignCommand (oAgegnor, SpeakString ("Ah, Conseillat, vous voila enfin ! Nous n'attendions plus que vous."))); DelayCommand (2.5, AssignCommand (oKmissit, SpeakString (""))); DelayCommand (4.0, AssignCommand (oAgegnor, SpeakString (""))); DelayCommand (4.5, AssignCommand (oKmissit, ActionMoveToObject (GetObjectByTag ("camdbut1"),FALSE))); DelayCommand (4.5, AssignCommand (oAgegnor, ActionMoveToObject (GetObjectByTag ("camdbut3"),FALSE))); DelayCommand (4.5, AssignCommand (oDrUn, ActionSit (GetObjectByTag ("bancressoitcul3")))); DelayCommand (6.0, AssignCommand (oPC, ActionMoveToObject (GetObjectByTag ("camdbut4")))); DelayCommand (10.0, AssignCommand (oPC, ActionMoveToObject (GetObjectByTag ("camdbut7")))); DelayCommand (6.5, AssignCommand(oKmissit, SetFacingPoint(GetPosition(GetObjectByTag ("camdbut2"))))); DelayCommand (6.5, AssignCommand(oAgegnor, SetFacingPoint(GetPosition(GetObjectByTag("camdbut2"))))); // calcul de la duree du deplacement du PC au point oArrive oArrive = GetObjectByTag ("camdbut4"); int iRatePC = GetMovementRate(oPC); float fVitesse; float fDistAB = GetDistanceBetween((oArrive),oPC); //calcul de la vitesse du PC quand il marche if (iRatePC == 0) {fVitesse = 2.0;} else if (iRatePC == 1) {fVitesse = 0.0;} else if (iRatePC == 2) {fVitesse = 0.75;} else if (iRatePC == 3) {fVitesse = 1.25;} else if (iRatePC == 4) {fVitesse = 1.75;} else if (iRatePC == 5) {fVitesse = 2.25;} else if (iRatePC == 6) {fVitesse = 2.75;} else if (iRatePC ==7) //je ne savais pas quoi mettre : 7 = creature defaut {return ; } else if (iRatePC == 8) {fVitesse = 5.25;} //calcul de la duree float fVitesseMparS = fVitesse/6; float fDuree = fVitesseMparS*fDistAB; //calcul de la duree avec EffectMovementSpeedDecrease (50) sur le PC : probleme = trop rapide float fDureeRalentieInter = (fVitesse/2)/6; float fDureeRalenti = fDureeRalentieInter*fDistAB; //mouvements de la camera en prenant comme donnee "duree" la duree calculee juste au-dessus en prenant compte EffectMovementSpeedDecrease (50). //la camera tourne 180 degres avant que le PC n'atteigne le point oArrive. //En remplacant fDureeRalenti par fDuree, le timing est bon. GestaltCameraMove (6.0, 90.0, 3.0, 100.0, 180.0, 3.0, 100.0, fDureeRalenti, 30.0, oPC); } Explications : Je n'ai pas inséré ma bibliothèque qui ne contient que les définitions des variables utilisées au début du script et qui ne nous interessent pas. Comme vous pouvez le voir, j'ai voulu intégrer dans le calcul le fait que j'avais lancé auparavant sur le PC EffectMovementSpeedDecrease (50) afin qu'il n'aille pas trop vite et qu'il ne dépasse les autres (ici, le joueur est le caméraman, la fonction SetCutsceneMode et l'invisibilité du joueur sont annoncé dans un autre script. Le problème c'est que je ne sais pas à quel nombre est appliqué le EffectMovementSpeedDecrease (50). Ici, j'ai fait comme s'il était appliqué à la vitesse en mètres par round. Mais avec ce script, la caméra atteint 1801 degrés avant que le joueur n'arrive au point oArrive. SI je calcule en fonction de fDuree, la camera est cette-fois ci trop lente par rapport au PC. Est-ce une erreur de calcul? Avez-vous une idée ? _________________ Nous sommes des héros, Bouh ! Les rodeurs et les hamsters, partout, content nos exploits ! |
Revenir en haut | |
k0rvet Ecuyer Messages: 67 |
Salut à tous!!
Ce thread est très intéressant, bien que je ne comprenne pas grand chose à la GestaltCamera. Enfin c'est pas le problème. Je me permets de poster pour avoir un éclaircissement sur le "calcul de la vitesse du PC quand il marche". Au sujet de la fonction GetMovementRate(). Tu passes comme argument dedans oPC et tu as bien pris soin au début du script de faire en sorte que ca soit uniquement un PJ. Dans ce cas, GetMovementRate renverra systématiquement 0. Lexicon a écrit : Remarks
Tu te retrouvera donc a chaque fois avec un movement rate de 2.00/4.00 respectivement pour la marche et la course. Je pense donc que la partie "calcule de la vitesse du PC quand il marche" est superflue because elle ne varie jamais.
This cannot be used to determine if a PC (Or any other creature) is walking or running as a PC always returns a value of 0. Maintenant si tu force ton PJ à marcher, tu connaitra tout de suite son movement rate (2.00) et tous les calculs deviennent plus simple non? D'autre part, EffectMovementSpeedDecrease(50) a pour effet de diviser par deux l'allure de marche et de course du PJ, on se retrouve donc avec 1.00/2.00 en movement rate. Tout ca, bien sur, en supposant que le PJ n'ai aucun effet de rapidité ni de lenteur. J'espère avoir été clair, avoir bien saisi ou tu voulais en venir et surtout avoir fait avancé le shmilblick. _________________ Moi j'dis ca, mais bon j'dis rien hein? ..:: Les Chroniques de la Terre du Milieu ::.. |
Revenir en haut | |
Elanam Alarune Novice Messages: 19 Localisation: Dans les Bas Fonds de Kemper, là où les korrigans dansent la gigue |
Salut à toi kOrvet et prend place avec nous!
Ton idée était certes bonne pour le script présent mais je souhaiterais tout de même pouvoir l'utiliser dans le cas général, c'est-à-dire, dans le cas où le PC n'est pas le joueur. J'ai écris dans ce script toutes les étapes nécessaires pour être sûr de les retrouver plus tard sans avoir à me recreser la tête parce que j'aurais oublié comment faire. Bref, tout ça pour dire que je sais que dans le cas présent, beaucoup de choses sont inutiles mais qu'il vaut mieux avoir toutes les données sous les yeux pour trouver une réponse à mon problème De plus j'ai expliqué que j'ai dans mon script divisé la vitesse par 2 pour prendre en compte le EffectMovementSpeedDecrease (50) mais que le mouvement de caméra était trop rapide . Merci quand même d'avoir essayé de résoudre le problème et si tu as d'autrees idées ... Bon, en fait, j'ai remarqué que j'avais fait une bête erreur de mathématique. En effet le calcul de la durée n'est pas Durée = Vitesse * Distance mais plutôt Durée = Distance/Vitesse. Cours de math de 4ème (au moins) Autre chose (décidemment), j'ai remarqué que le PC courait pour aller du pint de départ à celui d'arrivé. J'ai pris mon Lexicon en main et constatai qu'avec ActionMoveToObject, le PC (joueur) courait toujours et que pour le faire marcher, il fallait utiliiser ActionMoveToLocation. Ceci arrangé dans mon script, je me suis rendu compte que ça ne marchait toujours pas. J'ai vérifié que mon PC était bien ralenti et là je me suis rendu compte que non ,il n'était pas ralenti. Mon EffetMouvementSpeedDecrease ne voulait plus fonctionner. Je l'ai alors essayé dans un autre script en ne mettant que cette fonction, et là tout fonctionnait !?!! Je ne vois pas où j'ai fait une erreur alors si vous avez une idée ... NWScript : //:///////////////////////// ///////////////////// //:: Name cadf_discuskmiag //:: Copyright (c) 2001 Bioware Corp. //:///////////////////////// //////////////////// /* Le plus gros du script pour la cinematique dans la salle d'invocation du Centre Adminiistratif. */ //:///////////////////////// //////////////////// //:: Created By: Elanam Alarune //:: Created On: //:///////////////////////// //////////////////// #include "ressourcevariabl" #include "in_g_cameramove" void main() { object oPC = GetEnteringObject (); if (!GetIsPC(oPC)) return; object oArrive; //voici mon fameux EffectMovementSpeedDecrease (50). Ou est l'erreur ? effect eCameralenti = EffectMovementSpeedDecrease (50); AssignCommand(oPC, ApplyEffectToObject (DURATION_TYPE_PERMANENT, eCameralenti, oPC)); DelayCommand (1.0, AssignCommand (oAgegnor, SpeakString ("Ah, Conseillat, vous voila enfin ! Nous n'attendions plus que vous."))); DelayCommand (2.5, AssignCommand (oKmissit, SpeakString (""))); DelayCommand (4.0, AssignCommand (oAgegnor, SpeakString (""))); DelayCommand (4.5, AssignCommand (oKmissit, ActionMoveToObject (GetObjectByTag ("camdbut1"),FALSE))); DelayCommand (4.5, AssignCommand (oAgegnor, ActionMoveToObject (GetObjectByTag ("camdbut3"),FALSE))); DelayCommand (4.5, AssignCommand (oDrUn, ActionSit (GetObjectByTag ("bancressoitcul3")))); DelayCommand (6.0, AssignCommand (oPC, ActionMoveToLocation (GetLocation (GetObjectByTag ("camdbut4"))))); DelayCommand (10.0, AssignCommand (oPC, ActionMoveToLocation (GetLocation (GetObjectByTag ("camdbut7"))))); DelayCommand (6.5, AssignCommand(oKmissit, SetFacingPoint(GetPosition(GetObjectByTag ("camdbut2"))))); DelayCommand (6.5, AssignCommand(oAgegnor, SetFacingPoint(GetPosition(GetObjectByTag("camdbut2"))))); // calcul de la duree du deplacement du PC au point oArrive oArrive = GetObjectByTag ("camdbut4"); int iRatePC = GetMovementRate(oPC); float fVitesse; float fDistAB = GetDistanceBetween((oArrive),oPC); //calcul de la vitesse du PC quand il marche if (iRatePC == 0) {fVitesse = 2.0;} else if (iRatePC == 1) {fVitesse = 0.0;} else if (iRatePC == 2) {fVitesse = 0.75;} else if (iRatePC == 3) {fVitesse = 1.25;} else if (iRatePC == 4) {fVitesse = 1.75;} else if (iRatePC == 5) {fVitesse = 2.25;} else if (iRatePC == 6) {fVitesse = 2.75;} else if (iRatePC ==7) //je ne savais pas quoi mettre : 7 = creature defaut {return ; } else if (iRatePC == 8) {fVitesse = 5.25;} //calcul de la duree float fVitesseMparS = fVitesse/6; float fDuree = fDistAB/fVitesse; //calcul de la duree avec EffectMovementSpeedDecrease (50) sur le PC float fDureeRalenti = fDuree*2 ; //mouvements de camera GestaltCameraMove (6.0, 90.0, 3.0, 100.0, 180.0, 3.0, 100.0, fDureeRalenti, 30.0, oPC); } _________________ Nous sommes des héros, Bouh ! Les rodeurs et les hamsters, partout, content nos exploits ! |
Revenir en haut | |
Elanam Alarune Novice Messages: 19 Localisation: Dans les Bas Fonds de Kemper, là où les korrigans dansent la gigue |
Salut !
Bon, j'ai découvert le problème dans mon script qui faisait que mon PC n'était pas ralenti. C'est tout simplement que la fonction EffectSpeedDecrease ne fonctionne pas en mode cutscene. J'ai pensé mettre mon effet ralenti avant d'entrer en mode cutscene et là, surprise ! ça marchait toujours pas. En fait je me suis rappelé qu'en mode cutscene le PC était intouchable. Par contre à la fin de la cutscene comme je n'avais pas enlevé l'effet sur le PC, il était bien ralenti ! Connaissez-vous une autre fonction permettant de ralentir le PC même pendant une cutscene ? Merci d'avance. _________________ Nous sommes des héros, Bouh ! Les rodeurs et les hamsters, partout, content nos exploits ! |
Revenir en haut | |
k0rvet Ecuyer Messages: 67 |
Juste une idée comme ca, en passant.
Ca me fait penser à ce qui arrive avec un SetCommandable(). Il faut glisser les actions dans la queue d'action du PJ à l'aide de DelayCommand avant d'enclencher le SetCommandable. Et si c'était un peu la même chose? Je ne suis pas familier du système Gestalt mais il semblerais que ce soit l'appel à ces fonctions qui déclenchent la cutscene à proprement parler (le fait que le PJ ne soit plus "touchable"). Dans ce cas, je mettrais un DelayCommand de 0.1 sur le GestaltCameraMove. Ca laisserai le temps à l'effet de lenteur de se lancer effectivement sur le PJ avant d'entammer la cutscene. Enfin c'est une supposition hein? *espère* _________________ Moi j'dis ca, mais bon j'dis rien hein? ..:: Les Chroniques de la Terre du Milieu ::.. |
Revenir en haut | |
Elanam Alarune Novice Messages: 19 Localisation: Dans les Bas Fonds de Kemper, là où les korrigans dansent la gigue |
Ouais, pas con, mais en fait c'est la commande SetCutsceneMode (qui n'est pas une commande de Gestalt) qui fait foirer l' EffectMovementSpeed. Je viens de voir que je l'ai pas mis dans le script plus haut mais qu'il est annoncé dans un autre événement avant.
Le GestaltCameraMove (très bon moyen de faire de faire des cinématiques mis au point par John Bye ; désolé pour la pub:lol) ne fait que déplacer la caméra mais ne fait pas passer le jeu en mode cutscene, c'est à toi de le rajouter. Je sais tu pouvais pas deviner, j'aurais pu être un peu plus précis ... En fait j'y avais déjà pensé, et j'ai mis DelayCommand (0.1) avant mon SetCutsceneMode. Résultat (comme je l'expliquait plus haut ) : le PC n'est pas ralenti pendant le mode cutscene mais l'est avant et après !!! Je te remercie de te creuser les méninges sur mon problèmes mais si tu pouvais passer une ou deux nuits blanches dessus encore, ça pourrait m'arranger ... Aller, encore un peu d'effort, je sens qu'on approche de la solution. _________________ Nous sommes des héros, Bouh ! Les rodeurs et les hamsters, partout, content nos exploits ! |
Revenir en haut | |
La Bibliothèque de Neverwinter Nights Index du Forum »
La Bibliothèque Binaire du NWScript - Neverwinter Nights
Page 1 sur 1 ¤
Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum