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:39:05
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 |
Albator003 Invité |
Bonjour a tous voila encore un problème dont je ne vois pas l'erreur . Voila je fais un script pour que quand il est minuit (par exemple ) une cloche sonne 12 foiset pour ca il me faut defenir l'heure alors voila ce que j'ai fais mais evidement ca ne marche pas
Code : void main() { object oSound = GetObjectByTag(""); int hour; hour = GetTimeHour(); if (hour = 0) { DelayCommand(0.0, SoundObjectPlay(oSound)); DelayCommand(2.0, SoundObjectPlay(oSound)); DelayCommand(4.0, SoundObjectPlay(oSound)); DelayCommand(6.0, SoundObjectPlay(oSound)); DelayCommand(8.0, SoundObjectPlay(oSound)); DelayCommand(10.0, SoundObjectPlay(oSound)); DelayCommand(12.0, SoundObjectPlay(oSound)); DelayCommand(14.0, SoundObjectPlay(oSound)); DelayCommand(16.0, SoundObjectPlay(oSound)); DelayCommand(18.0, SoundObjectPlay(oSound)); DelayCommand(20.0, SoundObjectPlay(oSound)); DelayCommand(22.0, SoundObjectPlay(oSound)); } } J'ai verifier le tag et si lobjet est actif est tout et tout et c'est ok il dois y avoir un probleme sur le debut du script si quelq'un voit le probleme merci de me donnerun coup de paluche |
Revenir en haut | |
lendraste Grand Maître Chanteur du Conseil Messages: 1403 Localisation: Quelque part ailleurs |
albator003 a écrit : J'ai verifier le tag et si lobjet est actif est tout et tout et c'est ok il dois y avoir un probleme sur le debut du script si quelq'un voit le probleme merci de me donnerun coup de paluche - Ou as-tu placé le script ? - Est-ce normal que le tag de l'objet sonore soit une chaine de caractère vide ? - Est-ce que tu es sûr qu'il est minuit à un moment donné lors de tes tests ? Mais ce qui me saute aux yeux, si tu as bien copier/coller ton script ici c'est ça : "if (hour = 0)" pour lequel je rappelle que "=" est un opérateur d'affectation et que pour comparer il faut utiliser "==". A part ça, je manque d'idée ou d'information. _________________ 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 | |
Albator003 Invité |
Erreur de débutant C'était les "==" il m'en manquer un lol bon ca va chut on dira que c'est pas de ma faute c'est l'ordi qui n'a pas taper le second merci pour ton aide Iendraste
|
Revenir en haut | |
nunch Grand Sage du Conseil Messages: 966 Localisation: Dans la gueule du Lyon |
Et si tu faisais un boucle pour tes 12 coups de minuit ?
Code : void main() { object oSound = GetObjectByTag(""); int hour; hour = GetTimeHour(); if (hour == 0) { float fCoup = 0; while(fCoup < 12.0) DelayCommand(iCoup*2.0, SoundObjectPlay(oSound)); } } Comme ça tu peux transformer ton script en fonction avec paramètre (le nombre de coups à sonner, ici le "12.0") sans avoir à tout te repalucher à chaque fois. |
Revenir en haut | |
lendraste Grand Maître Chanteur du Conseil Messages: 1403 Localisation: Quelque part ailleurs |
nunch a écrit : Code : Ce script là ne va pas se compiler car "iCoup" n'est pas déclaré. De plus, la condition de sortie "(fCoup<12.0)" ne sera jamais vrai puisque tu n'incrémentes pas fCoup.
void main() { object oSound = GetObjectByTag(""); int hour; hour = GetTimeHour(); if (hour == 0) { float fCoup = 0; while(fCoup < 12.0) DelayCommand(iCoup*2.0, SoundObjectPlay(oSound)); } } L'idée de générer les 12 coups dans une boucle est bonne, mais il faut le faire proprement Ca devrait donner ça : Code : void main() { object oSound = GetObjectByTag(""); int hour; hour = GetTimeHour(); if (hour == 0) { float fCoup = 0; while(fCoup < 12.0) { DelayCommand(fCoup*2.0, SoundObjectPlay(oSound)); fCoup++; } } } Ensuite, je ne sais pas quand est-ce que ce script est déclenché, mais s'il est utilisé astucieusement, on peut carrément faire sonner la cloche en fonction de l'heure. Code : void main() { object oSound = GetObjectByTag(""); int nHour; int nCoup; nHour = GetTimeHour(); if (nHour=0) //Si l'heure est 0 on la déclare à 24 { nHour=24; } if (nHour>12) //Si l'heure est supérieure à 12 le nombre de coup est heure-12 { nCoup=nHour-12; } else { nCoup=nHour; } while(nCoup > 0) { DelayCommand(IntToFloat(13-nCoup)*2.0, SoundObjectPlay(oSound)); //programmer un coup toutes les 2 secondes nCoup--; } } Ceci vaux pour une horloge affichant 12 heures, bien sûr Pour une horloge 24 heures (qui sonnerait 24 fois à minuit), il n'y a qu'une toute petite modification à faire. _________________ 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 | |
nunch Grand Sage du Conseil Messages: 966 Localisation: Dans la gueule du Lyon |
Bon j'ai un peu baclé la chose, j'avoue . Mais je suis complètement abruti par la châleur et je suis entrain de me casser la tête sur le développement d'un driver win2K (qui est un peu ma priorité), alors j'ai du mal à jongler entre tous mes codes en C et ceux de NWN
|
Revenir en haut | |
Albator003 Invité |
Bon alors pour ton script qui est je le rapelle celui la
Code : void main() { object oSound = GetObjectByTag(""); int nHour; int nCoup; nHour = GetTimeHour(); if (nHour=0) //Si l'heure est 0 on la déclare à 24 { nHour=24; } if (nHour>12) //Si l'heure est supérieure à 12 le nombre de coup est heure-12 { nCoup=nHour-12; } else { nCoup=nHour; } while(nCoup > 0) { DelayCommand(IntToFloat(13-nCoup)*2.0, SoundObjectPlay(oSound)); //programmer un coup toutes les 2 secondes nCoup--; } } je n'arrive pas a le faire fonctionné je l'ai pacer sur le Onheartbeat d'une zone et j'ai mis le son sur la map j'ai mis le tag dans le script mais marche pas... alors jai poursui mon idée de base car elle aussi a un probleme... En faite pour avoir les 12 coup j'ai crée 12 son les meme (pourquoi 12 ? parce que si j'en met que 1 les son se jou 6sec l'un apres lautre en faite il faut que le son soit fini pour pouvoir le refaire ce que je trouve long...bref) J'ai mis 12 tag différents pourchaque son et j'ai crée ce script pour l'exemple de minuit Code : void main() { object oSound = GetObjectByTag("clochemal"); object oSound1 = GetObjectByTag("clochemal1"); object oSound2 = GetObjectByTag("clochemal2"); object oSound3 = GetObjectByTag("clochemal3"); object oSound4 = GetObjectByTag("clochemal4"); object oSound5 = GetObjectByTag("clochemal5"); object oSound6 = GetObjectByTag("clochemal6"); object oSound7 = GetObjectByTag("clochemal7"); object oSound8 = GetObjectByTag("clochemal8"); object oSound9 = GetObjectByTag("clochemal9"); object oSound10 = GetObjectByTag("clochemal10"); object oSound11 = GetObjectByTag("clochemal11"); int hour; hour = GetTimeHour(); if (hour == 0) { DelayCommand(0.0, SoundObjectPlay(oSound)); DelayCommand(2.0, SoundObjectPlay(oSound1)); DelayCommand(4.0, SoundObjectPlay(oSound2)); DelayCommand(6.0, SoundObjectPlay(oSound3)); DelayCommand(8.0, SoundObjectPlay(oSound4)); DelayCommand(10.0, SoundObjectPlay(oSound5)); DelayCommand(12.0, SoundObjectPlay(oSound6)); DelayCommand(14.0, SoundObjectPlay(oSound7)); DelayCommand(16.0, SoundObjectPlay(oSound8)); DelayCommand(18.0, SoundObjectPlay(oSound9)); DelayCommand(20.0, SoundObjectPlay(oSound10)); DelayCommand(22.0, SoundObjectPlay(oSound11)); } } Code : void main() { object oSound = GetObjectByTag("clochemal"); object oSound1 = GetObjectByTag("clochemal1"); object oSound2 = GetObjectByTag("clochemal2"); object oSound3 = GetObjectByTag("clochemal3"); object oSound4 = GetObjectByTag("clochemal4"); object oSound5 = GetObjectByTag("clochemal5"); object oSound6 = GetObjectByTag("clochemal6"); object oSound7 = GetObjectByTag("clochemal7"); object oSound8 = GetObjectByTag("clochemal8"); object oSound9 = GetObjectByTag("clochemal9"); object oSound10 = GetObjectByTag("clochemal10"); object oSound11 = GetObjectByTag("clochemal11"); int hour; int minute; hour = GetTimeHour(); minute = GetTimeMinute(); if ((hour == 00) && minute == 00) { DelayCommand(0.0, SoundObjectPlay(oSound)); DelayCommand(2.0, SoundObjectPlay(oSound1)); DelayCommand(4.0, SoundObjectPlay(oSound2)); DelayCommand(6.0, SoundObjectPlay(oSound3)); DelayCommand(8.0, SoundObjectPlay(oSound4)); DelayCommand(10.0, SoundObjectPlay(oSound5)); DelayCommand(12.0, SoundObjectPlay(oSound6)); DelayCommand(14.0, SoundObjectPlay(oSound7)); DelayCommand(16.0, SoundObjectPlay(oSound8)); DelayCommand(18.0, SoundObjectPlay(oSound9)); DelayCommand(20.0, SoundObjectPlay(oSound10)); DelayCommand(22.0, SoundObjectPlay(oSound11)); } } Alors cette fois ca marche plus du tout...Je me demande pourquoi et je vois que sur mon module 2 minute réel represente 1 heure virtuel..je calcule et je vois que en faite le moment ou la minute est a 0 se passe en 2 sec et un script sur le onHeartbeat se declanche toute les 6 sec alors je me dis que il faudrai modifier la vitesse du jeu... je la met donc a 6 min pour que une minute virtuel dur 6 sec et la ca marche!!! mais le truc c'est que ca fais pareil disons que tant que c'est dans les 0hXX il me joue les sons... Comprend pas pourquoi |
Revenir en haut | |
Lavok Légende vivante Messages: 434 Localisation: Sphère planaire |
Il y a peut-être plus simple... Le jeu commence par défaut à 13 heures précises. Sur le OnSpawn de ton horloge, tu mets un délai de 11 heures suivi d'un ExecuteScript() pour que le script s'enclenche à minuit et à la fin du script, tu remets un délai, de 24 heures cette fois. Ce qui fait qu'une fois le premier minuit passé, le script s'enclenche tous les minuits. En théorie, ça devrait marcher, non ?
_________________ ToB : Une seule chose semble certaine : tant que le trône de sang de Bhaal restera vide, le chaos règnera. Moi : Une seule chose semble certaine : tant que la tête de singe de Bush restera vide, le chaos règnera. |
Revenir en haut | |
Albator003 Invité |
Bon j'en ai marre de galéré alors je suis aller faire un tour et j'ai trouvé mon bonheur mais alors attention le script il est long tres long lol enfin bref voila ca marche c'est le principale
Créé un objet invisible et mettez lui se script sur le onHeartbeat Code : //:://///////////////////////////////////////////// //:: Custom User Defined Event //:: FileName: HourBell //::////////////////////////////////////////////// /* OnHeartbeat script for an invisible object The bell tolls every hour counting the time. */ //::////////////////////////////////////////////// //:: Created By: Ayath The Loafer //:: Created On: October 26th 2002 //::////////////////////////////////////////////// void main() { int nHour = GetTimeHour(); //Purely for testing purposes SpeakString(IntToString(nHour)); if (nHour==0 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour) { SetLocalInt(OBJECT_SELF,"Called_Time",0); DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(1.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(2.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(3.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(4.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(5.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(6.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(7.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(8.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(9.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(10.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(11.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); } if (nHour==1 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour) { SetLocalInt(OBJECT_SELF,"Called_Time",1); DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); } if (nHour==2 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour) { SetLocalInt(OBJECT_SELF,"Called_Time",2); DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(1.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); } if (nHour==3 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour) { SetLocalInt(OBJECT_SELF,"Called_Time",3); DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(1.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(2.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); } if (nHour==4 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour) { SetLocalInt(OBJECT_SELF,"Called_Time",4); DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(1.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(2.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(3.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); } if (nHour==5 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour) { SetLocalInt(OBJECT_SELF,"Called_Time",5); DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(1.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(2.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(3.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(4.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); } if (nHour==6 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour) { SetLocalInt(OBJECT_SELF,"Called_Time",6); DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(1.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(2.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(3.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(4.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(5.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); } if (nHour==7 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour) { SetLocalInt(OBJECT_SELF,"Called_Time",7); DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(1.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(2.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(3.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(4.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(5.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(6.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); } if (nHour==8 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour) { SetLocalInt(OBJECT_SELF,"Called_Time",8); DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(1.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(2.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(3.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(4.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(5.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(6.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(7.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); } if (nHour==9 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour) { SetLocalInt(OBJECT_SELF,"Called_Time",9); DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(1.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(2.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(3.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(4.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(5.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(6.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(7.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(8.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); } if (nHour==10 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour) { SetLocalInt(OBJECT_SELF,"Called_Time",10); DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(1.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(2.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(3.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(4.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(5.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(6.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(7.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(8.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(9.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); } if (nHour==11 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour) { SetLocalInt(OBJECT_SELF,"Called_Time",11); DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(1.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(2.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(3.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(4.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(5.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(6.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(7.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(8.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(9.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(10.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); } if (nHour==12 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour) { SetLocalInt(OBJECT_SELF,"Called_Time",12); DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(1.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(2.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(3.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(4.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(5.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(6.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(7.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(8.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(9.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(10.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(11.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); } if (nHour==13 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour) { SetLocalInt(OBJECT_SELF,"Called_Time",13); DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); } if (nHour==14 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour) { SetLocalInt(OBJECT_SELF,"Called_Time",14); DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(1.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); } if (nHour==15 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour) { SetLocalInt(OBJECT_SELF,"Called_Time",15); DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(1.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(2.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); } if (nHour==16 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour) { SetLocalInt(OBJECT_SELF,"Called_Time",16); DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(1.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(2.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(3.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); } if (nHour==17 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour) { SetLocalInt(OBJECT_SELF,"Called_Time",17); DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(1.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(2.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(3.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(4.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); } if (nHour==18 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour) { SetLocalInt(OBJECT_SELF,"Called_Time",18); DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(1.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(2.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(3.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(4.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(5.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); } if (nHour==19 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour) { SetLocalInt(OBJECT_SELF,"Called_Time",19); DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(1.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(2.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(3.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(4.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(5.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(6.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); } if (nHour==20 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour) { SetLocalInt(OBJECT_SELF,"Called_Time",20); DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(1.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(2.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(3.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(4.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(5.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(6.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(7.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); } if (nHour==21 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour) { SetLocalInt(OBJECT_SELF,"Called_Time",21); DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(1.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(2.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(3.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(4.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(5.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(6.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(7.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(8.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); } if (nHour==22 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour) { SetLocalInt(OBJECT_SELF,"Called_Time",22); DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(1.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(2.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(3.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(4.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(5.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(6.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(7.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(8.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(9.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); } if (nHour==23 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour) { SetLocalInt(OBJECT_SELF,"Called_Time",23); DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(1.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(2.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(3.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(4.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(5.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(6.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(7.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(8.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(9.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); DelayCommand(10.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); } } voila tout.... |
Revenir en haut | |
Lavok Légende vivante Messages: 434 Localisation: Sphère planaire |
Houlà... C'est kilométrique... et sur un OnHeartbeat surtout... Je ne comprends pas trop pourquoi tu as changé tout, alors que l'autre système était valable.
_________________ ToB : Une seule chose semble certaine : tant que le trône de sang de Bhaal restera vide, le chaos règnera. Moi : Une seule chose semble certaine : tant que la tête de singe de Bush restera vide, le chaos règnera. |
Revenir en haut | |
Albator003 Invité |
lautre systeme ne marche pas helas....
|
Revenir en haut | |
lendraste Grand Maître Chanteur du Conseil Messages: 1403 Localisation: Quelque part ailleurs |
Bon... il faut que je rappelle la phrase qui précédait mon script :
lendraste a écrit : Ensuite, je ne sais pas quand est-ce que ce script est déclenché, mais s'il est utilisé astucieusement, on peut carrément faire sonner la cloche en fonction de l'heure. Il est évident qu'il ne fallait pas le placer sur le OnHeartbeat, pas plus que le la première version du tien.
Ensuite, voici une nouvelle version du script "kilometrique" que tu nous a donné. Le gars qui a pondu ça ne connaissait manifestement pas les boucles : Code : void main() { int nHour = GetTimeHour(); //Purely for testing purposes SpeakString(IntToString(nHour)); int nLasthour = GetLocalInt(OBJECT_SELF,"Called_Time"); int nCount; if (nHour<>nLasthour) { SetLocalInt(OBJECT_SELF, "Called_Time", nHour); if (nHour==0) { nHour=24; } if (nHour>12) { nHour=nHour-12; } for (nCount=1;nCount<=nHour;nCount++) { DelayCommand(IntToFloat(nCount-1), AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1"))); } } } Si je ne me suis pas trompé, ça fait exactement (et j'insiste sur le exactement) la même chose que le long script que tu nous as donné. Maintenant, il me semble bien que ce n'est pas ce que tu voulais. Si j'ai bien compris, tu souhaitais qu'on entende la cloche dans toutes la zone, car je suppose que tu as créé un objet "son" assez volumineux. Même l'idée de faire 12 objets son, un pour chaque son de cloche, n'est pas idiote si chacun dure trop longtemps à ton goût, mais là encore, l'usage d'une boucle résoud tout en simplicité. Voici une adaptation de ton script avec ma méthode (que tu pourras mettre sur le OnHeartbeat de la zone, je précise cette fois ) : Code : void main() { int nHour = GetTimeHour(); int nLasthour = GetLocalInt(OBJECT_SELF,"LASTHOUR"); int nCount; if (nHour<>nLasthour) //Teste s'il s'agit d'une nouvelle heure { SetLocalInt(OBJECT_SELF, "LASTHOUR", nHour); //sauve la nouvelle heure //ramène l'heure sur 12 heures pour correspondre au nombre de coup de cloche if (nHour==0) { nHour=24; } if (nHour>12) { nHour=nHour-12; } for (nCount=1;nCount<=nHour;nCount++) //Compte le nombre de coup à jouer { DelayCommand(IntToFloat(nCount-1)*2.0, SoundObjectPlay(GetObjectByTag("clochemal"+IntToString(nCount-1)))); //joue le son "clochemalX" ou X est déterminé par le compteur nCount, sur des intervalles de 2 secondes. } } } Cela t'oblige toutefois à changer un petit truc. Ton premier objet son devra porter le tag "clochemal0" et non pas "clochemal". A toute fin utile, je précise que la cloche jouera à l'ouverture du module quelle que soit l'heure sauf s'il est minuit au démarrage. La raison en est que la variable "LASTHOUR" sauvée sur la zone n'est pas initialisée au démarrage du module. _________________ 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 | |
Albator003 Invité |
Merci pour le script helas entre temps j'en est etabli un nouveau... car sur les OnHeartbeat je commence a avoir beaucoup de script alors afin de limiter j'ai utiliser des delay command afin de placer ce script sur un Onspawn j'explique la technique
Deja savoir le delay command a faire Sur les propriété du module allez a avancé et regarder combien de minute se passe en vrai pour une heure virtuel dans mon cas 5 min si votre valeur est différente il vous suffit juste de prendre votre valeur en vrai et la multiplié par 60 (Ex : 60 x 5 = 300 seconde) ceci vous permettera de savoir a combien vous devrez mettre le float de votre DelayCommand de la fin des script pour le 1er script il faut savoir a quelle heure votre module commence dans mon cas il commence à 0h00 1er script : a mettre sur un Onspawn ce script s'appelle cloche Code : void main() { // ici c'est 0h00 donc 12 coup DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2"))); DelayCommand(2.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2"))); DelayCommand(4.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2"))); DelayCommand(6.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2"))); DelayCommand(8.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2"))); DelayCommand(10.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2"))); DelayCommand(12.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2"))); DelayCommand(14.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2"))); DelayCommand(16.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2"))); DelayCommand(18.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2"))); DelayCommand(20.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2"))); DelayCommand(22.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2"))); DelayCommand(300.0,ExecuteScript("cloche1", OBJECT_SELF));// un delay command de 300 secondes afin de passer une heure pour executer un nouveau script (celui de 1 heure du matin si votre float est différent remplacer le evidement } Le script de 1 heure du matin nom du script "cloche1" Code : void main() { DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2"))); DelayCommand(300.0,ExecuteScript("cloche2", OBJECT_SELF));// pareil que tout a l'heure on appelle le script dans 1 heure (pour le jeu) ce script est pour 2 heures du matin } le script de 2 heures du matin (appeler "cloche2") Code : void main() { DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2"))); DelayCommand(2.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2"))); DelayCommand(300.0,ExecuteScript("cloche3", OBJECT_SELF));//toujours pareil on appelle un nouveau script celui de 3 du matin... } Comme vous le voyez au fur est a mesure que l'on apelle un script on rajoute juste une ligne pour donner un coup de plus... repetter la procedure jusqua 11 coup Pour le dernier script celui des 11 coup et oui on s'arrete a 11 il suffit juste de rappeler le 1er script (qui est celui de 12 coup ou de 0h00) le faite de rapeller ce 1er script crée une boucle qui ne se termine jamais puisqu le 1er script apelle les autre .. Voila le dernier script Code : void main() { DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2"))); DelayCommand(2.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2"))); DelayCommand(4.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2"))); DelayCommand(6.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2"))); DelayCommand(8.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2"))); DelayCommand(10.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2"))); DelayCommand(12.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2"))); DelayCommand(14.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2"))); DelayCommand(16.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2"))); DelayCommand(18.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2"))); DelayCommand(20.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2"))); DelayCommand(300.0,ExecuteScript("cloche", OBJECT_SELF));// on apelle le 1er script pour crée une boucle } Je le redis encore une fois ces script sont valable pour une valeur de 5 min/heures si vous avez la valeur par default qui est de 2 min remplacer le dernier delay command (qui est de 300 pour l'exemple) par 2 x 60 c'est a dire 120 voila c'est long a faire mais ca bouffe pas trop de ressource est empeche l'utilisation du Onheartbeat |
Revenir en haut | |
lendraste Grand Maître Chanteur du Conseil Messages: 1403 Localisation: Quelque part ailleurs |
albator003 a écrit : Merci pour le script helas entre temps j'en est etabli un nouveau... car sur les OnHeartbeat je commence a avoir beaucoup de script alors afin de limiter j'ai utiliser des delay command afin de placer ce script sur un Onspawn j'explique la technique Heu... Sans vouloir te vexer, ton obstination à ne pas vouloir utiliser les boucles confine à l'hérésie
De plus, tu te compliques la vie en limitant à l'exécution toutes les 5 minutes, car dans ton cas, si l'heure dans le jeu dure 2 minutes réelles (durée par défaut), il faut changer 12 scripts pour se mettre à jour. Il existe une fonction qui rapporte le nombre de secondes réelles pour une heure dans le jeu (HoursToSeconds) qui tient évidemment compte du paramètre du module concernant la durée des heures. Tes douze scripts peuvent être remplacés par 1 seul, parfaitement transportable d'un module à l'autre, que voici : Code : // Ce script s'appelle "cloche" void main() { int nHour=GetLocalInt(OBJECT_SELF, "HOUR"); int nCount; if (nHour==0) { nHour=24; } if (nHour>12) { nHour=nHour-12; } for (nCount=1;nCount<=nHour;nCount++) { DelayCommand(IntToFloat(nCount-1)*2.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2"))); } nHour++; if (nHour>24) { nHour=1; } SetLocalInt(OBJECT_SELF, "HOUR", nHour); DelayCommand(HoursToSeconds(1),ExecuteScript("cloche", OBJECT_SELF)); } Et bien sûr, dans le OnSpawn de ton "clocher" : Code : main void() { SetLocalInt(OBJECT_SELF, "HOUR", GetTimeHour()); //optionnel si le démarrage n'est pas effectué à minuit, mais marche aussi à minuit ExecuteScript("cloche", OBJECT_SELF); } Avec toujours la contrainte de démarrer ton module pile à minuit, mais si tu laisses la ligne optionnelle que j'ai ajouté, tu peux démarrer au début de n'importe quelle heure. Voilà... C'est pas long, ça bouffe pas de ressources, c'est simple et ça se transporte partout (avec le "clocher" en tout cas) Revenons un moment sur le précédent script en OnHeartbeat qui avait été fait. Il est effectivement plus gourmand en ressource, mais les tâches effectuées sont rapides à exécuter, étant donné qu'on n'exécute le gros du script que si l'heure a changé. Sur un petit module peu chargé, ça ne se verra pas (à moins que tu mettes des "clocher" à tous les coins de rue, ce qui multipliera le nombre de OnHeartbeat). En tout cas, après avoir suivi ce fil de discussion, je m'inquiète beaucoup de la taille que ferait un script qui doit sonner toutes les minutes . L'utilisation des boucles est quasiment indispensable. Qui voudrait utiliser 12 scripts à la place d'un seul ? Qui voudrait écrire 60 lignes à la place d'une seule ? Qui voudrait avoir à changer 60 lignes de script au lieu d'une seule le jour ou le son change ? Ce n'est pas pour dénigrer la solution trouvée, qui a le mérite de fonctionner, mais surtout pour attirer l'attention sur des notions basiques de programmation qui, si elles ne sont pas comprises ou maîtrisées, conduisent à l'élaboration de solution abominablement couteuse en temps de conception (et en cheveux aussi ). Enfin, ce que j'en dis... *soupir* ce n'est jamais qu'un conseil que je crois avisé. _________________ 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 | |
Albator003 Invité |
tu a entierement raison souvent je me prend la tete sur une chose et quand mon idée et de faire comme ca je cherche pas a comprendre je la fais meme si y'a plus simple lol.
Bon y'a surtout que je maitrise pas trop les "int" et Getlocalint ou SetLocalInt alors je tente de tourner mon script selon mes capacité mais bon j'apprend en voyant des script comme le tien je le compare au mien je tente de comprendre et de voir pourquoi Genre ta command IntToFloat ou les "++" ou "--" ca veux dire quoi ca? eclair moi la dessus que je comprend pas ton script entier |
Revenir en haut | |
lendraste Grand Maître Chanteur du Conseil Messages: 1403 Localisation: Quelque part ailleurs |
albator003 a écrit : tu a entierement raison souvent je me prend la tete sur une chose et quand mon idée et de faire comme ca je cherche pas a comprendre je la fais meme si y'a plus simple lol.
Effectivement, je n'ai pas été très loquace sur les commentaires ce coup-ci. Et tu me poses là des questions sur les fondements de la programmation ou presque. Je prendrais un peu de temps pour y répondre demain, car il se fait tard, mais je te ferais un petit cours Bon y'a surtout que je maitrise pas trop les "int" et Getlocalint ou SetLocalInt alors je tente de tourner mon script selon mes capacité mais bon j'apprend en voyant des script comme le tien je le compare au mien je tente de comprendre et de voir pourquoi Genre ta command IntToFloat ou les "++" ou "--" ca veux dire quoi ca? eclair moi la dessus que je comprend pas ton script entier _________________ 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 | |
lendraste Grand Maître Chanteur du Conseil Messages: 1403 Localisation: Quelque part ailleurs |
Bien. Parlons un peu variables et tout le toutim. C'est là le B. A. BA de l'utilisation du langage de script (valable dans pas mal de langage de programmation). La première chose à apprendre et à savoir.
Une variable est un "emplacement" dans lequel nous pouvons "stocker" de l'information. J'emploie "emplacement" et "stocker" qui sont deux mots du langage courant qui me semblent les plus appropriés pour en parler. La position de cet emplacement n'a en soi rien de primordial. Dans la plupart des langages, dit "de haut niveau" (Java, NWNScript, VBScript, JavaScript), on se fiche de savoir ou sera cet emplacement, il nous suffit juste de le connaître. Et pour le connaître et le reconnaître, nous lui donnons un nom. En revanche, dans la plupart des langages, ces emplacements ne sont pas conçus pour accueillir n'importe quelle information. Imaginez des tiroirs dans un grand meubles, chacun faisant 20 cm de haut, vous ne ferez pas passer une sphère de 30cm de diamètre dedans. Autrement dit, il y a une place pour chaque chose et chaque chose à sa place. La notion de "format" ou de "dimensionnement" n'est pas spécifiquement informatique et permet de comprendre que pour ranger une sphère de 30 cm de diamètre dans un tiroir, il faut que celui-ci fasse au moins 30 cm de haut, de large et de profondeur. Contrairement à un entrepôt, la mémoire d'un ordinateur n'est absolument pas découpée en "emplacements" déjà défini et prêt à l'emploi. Il faut, à chaque fois que l'on veux y ranger quelque chose, définir l'emplacement qui lui conviendra. Maintenant la véritable question qui se pose est : pourquoi range-t-on des informations ? Réponse : pour les garder. Ce concept est à rapprocher de celui d'un collectionneur de timbre. Le vrai, celui qui ne va pas acheter ses timbres à La Poste, les regarde passer sur les enveloppes. Un jour, il peut voir sur une enveloppe un timbre qu'il ne possède pas. Deux choix s'offrent à lui. Soit il le prend et l'ajoute à sa collection en le collant dans un album, soit il le laisse passé. Le timbre pourra finir dans une broyeuse ou dans la main d'un autre collectionneur, mais peu importe son avenir, le fait est que le premier collectionneur ne l'aura pas gardé, et donc, ne l'aura pas à sa disposition pour pouvoir le montrer ou le contempler. Dans une mémoire informatique, c'est surtout une question de besoin qui détermine si on doit ou non garder une information, mais si on ne la garde pas, elle cesse d'exister. C'est aussi simple que ça. Ce qui veux dire que si on obtient (d'une manière ou d'une autre) une information, il est important de savoir ce que l'on va en faire. Si nous décidons de la garder, nous avons besoin d'aller plus loin dans cette explication Pour garder une information, il faut donc lui définir un emplacement. Il n'y a que deux chose à connaître pour créer un emplacement pour notre information. En gros nous nous inquiétons de savoir quelle est sa "taille" et/ou sa "forme", puis nous nous évertuons à lui donner un nom, un nom unique qui nous permet de retrouver l'emplacement dans la mémoire. Une sorte d'adresse. Comme un bricoleur minutieux qui range sa visserie dans les petits tiroirs d'un établi et qui étiquette les tiroirs pour pouvoir retrouver facilement ce qu'il cherche sans avoir à regarder dans chacun d'eux, nous mettons nous aussi des "étiquettes" sur nos emplacements d'informations pour les retrouver. On va tout de suite laisser tomber le vocabulaire "profane" que je viens de mettre en place pour employer la terminologie informatique : emplacement -> variable étiquette -> nom de variable dimension, taille, format ou forme -> type de variable information -> valeur ou valeur de la variable Les deux choses les plus importantes lorsque nous définissons un emplacement pour stocker nos informations (donc une variable) sont le nom de la variable et son type. Le type permet de savoir ce qu'elle "peut" contenir. Le nom permet de la retrouver à tout moment. Passons en revue la notion de type. Un type indique à la fois les formes et les dimensions possibles d'une valeur que nous souhaitons stocker dans une variable. Un mot-clé du langage de programmation permet de se représenter les types : int : un entier relatif variant entre -2 147 483 648 et 2 147 483 647. float : un réel entre -3.402823 E38 à 3.402823 E38 string : une chaine de caractère pouvant comporter jusqu'à ... hum... beaucoup de caractères. Je n'ai pas trouvé cette spécification dans NWN (si quelqu'un la connaît). C'est au moins 65535 je pense. Peut-être plus, mais c'est à vérifier. Il y a d'autres types, mais pour comprendre les explications qui vont suivre c'est suffisants. Dans le langage NWNScript, la définition d'une variable s'opère de la façon suivante : <type> <nom_de_variable>[=<valeur_initiale>][, <nom_de_variable[=<valeur_nitiale>]]*; Je me dois d'expliquer un peu la notation que j'utilise. Les symbole "<" et ">" délimite un emplacement pour un élément de syntaxe (que je nomme). Les crochets délimitent une portion optionnelle de la syntaxe et "*" indique que la portion de syntaxe qui précède peut être répétée plusieurs fois. <type> peut donc être égal à int, float et string <nom_de_variable> peut être égal à ce que l'on veux. A noter qu'un nom de variable ne peut pas comporter d'espace. <valeur_initiale> peut prendre différente forme. Il peut s'agir de ce qu'on appelle une valeur constante, mais il peut également s'agir d'une autre variable ou d'une fonction. Dans tous les cas, la valeur initiale doit être du même type que la variable que nous venons de déclarer Voici un exemple d'écriture : Code : int nMonEntier; // Déclare une variable appelée nMonEntier de type int (donc entier naturel) float fMonReel; // Déclare une variable appelée fMonReel de type float (donc un réel) int nExemple=1; // Déclare une variable appelée nExemple de type int et lui donne une valeur initiale de 1 string sMaChaine="Ma chaîne de test"; //Déclare une variable appelée sMaChaine de type string (une chaine de caractère) et lui donne une valeur initiale de "Ma chaîne de test". float fMonSecondReel=2.0; // Déclare une variable appelée fMonSecondReel de type float et lui donne une valeur initiale de 2.0 int nA=0, nB=1, nC=2; // Déclare 3 variable nA, nB et nC de type int en leur donnant chacun les valeurs respectives 0, 1 et 2. A noter que je n'utilise pas n'importe quel nom pour mes noms de variable. Non seulement je tiens à ce qu'ils soient explicites, mais en plus j'inclus dans leur forme un "prefixe". C'est une convention d'écriture entre programmeur. Presque tous les programmeurs du monde savent que s'ils rencontrent une variable dont le nom comporte un "s" minuscule en début de nom, il s'agit d'une chaine de caractère. Et c'est une notation qui est assez pratique. Dans NWN, les prefixe de noms de variable ont été suggéré pas la communauté des développeurs. Pour les 3 types que j'ai évoqué ici sont ceux que j'ai utilisé dans mon exemple. Je répète que c'est une convention, qui, si elle est respectée, facilite la relecture d'un script par un autre développeur. Cela n'est toutefois pas une obligation, mais je conseille vivement de prendre l'habitude de le faire. C'est cette même convention qui nous fait commencer les noms de variable par des minuscules mais suivi immédiatement d'une majuscule (ou plusieurs comme dans mon exemple, pour délimiter les mots qui compose mon nom de variable sachant que je ne peux pas utiliser d'espace). On peut utiliser des chiffres dans un nom de variable, mais jamais dans le premier caractère de ce nom (mais normalement, on oublie cette règle la plupart du temps parce qu'on utilise les préfixes et que ceux-ci font partie du nom et sont forcément en première position). En revanche, l'usage de minuscule ou de majuscule dans un mot clé du langage (comme les types de variables) n'est pas une convention, c'est une obligation. Si vous écrivez "Int" ça n'est pas la même chose que "int" et le compilateur de script ne sera pas d'accord. On notera aussi que la valeur d'une chaine de caractère se délimite par des guillemets. Je précise que dans mon exemple, la valeur "Ma chaîne de test" est une constante. La constante, par oposition à la variable est une valeur qui ne varie pas. Lorsque j'écris une constante dans le code d'un script, cette valeur est figée et définitive. A chaque fois que j'exécute le scripte la valeur de la constante sera la même. Dans mon exemple, la variable de type "chaine de caractère", sMaChaine, prend pour valeur la valeur de la constante "Ma chaîne de test". La Phrase qui précède est l'exacte traduction en français de string sMaChaine="Ma chaîne de test";. On se rappellera que "=" est un symbole d'affectation de valeur que l'on traduit par "prend pour valeur". Les constantes sont l'un des moyens les plus simples de définir la valeur d'une variable (qu'il s'agisse de sa valeur initiale ou de sa valeur dans le cours de l'exécution d'un script). Une règle à ne jamais oublier (mais le compilateur est là pour nous la rappeler), une variable ne peut être "utilisée" qu'à partir du moment ou elle est définie. Une autre règle importante est qu'une variable a toujours une valeur par défaut si on ne lui donne pas de valeur initiale. Ce qui signifie qu'une variable n'est jamais vraiment "vide". Dans mon exemple de déclaration, je ne donne pas de valeur initiale à nMonEntier. Cependant il en a quand même une par défaut et cette valeur est 0. Pour un float c'est 0.0 (attention à la notation avec le ".", je vais expliquer juste après) et pour un string c'est "" (deux guillements avec rien entre les deux. On appelle cette chaine de caractère particulière la "chaine vide"). On aura remarqué que lorsque l'on fixe la valeur initiale d'une variable réelle, la constante utilisée comporte un point, même si la valeur que nous lui donnons ne comporte pas de chiffre significatif après la virgule, ce dernier apparaît (le point représentant la virgule d'une constante numérique dans les langages de programmation). C'est volontaire. Si nous ne faisions pas cela, le compilateur penserait que la valeur constante que nous lui donnons n'est pas un réel mais un entier. Essayer de compiler ça : Code : void main() { int nA = 2.0; } puis ça Code : void main() { float fA = 2; } Dans les deux cas le compilateur va hurler. Il va vous dire que la valeur constante que vous voulez affecter à votre variable n'est pas du bon type. Le compilateur reconnaitra toujours 2.0 comme une constante de type float et 2 comme une constante de type int. La suite de l'histoire est connue, c'est celle de la sphère de 30cm que nous tentons de ranger dans le tiroir de 20cm. Ca rentre pas ! Des petit malins me diront que ce n'est pas normal que 2 ne rentre pas dans un float puisque en mathématique l'ensemble des entiers relatifs est inclu dans l'ensemble des réels. Mais hélas, nous ne faisons pas des mathématiques, mais de l'informatique et la manière dont la mémoire d'un ordinateur et les langages de programmation stockent l'information ne fonctionne que sur le terrain de la stricte égalité des formats. C'est ainsi. Il existe en revanche des manières détournées de faire entrer notre sphère dans notre tiroir. C'est ce qu'on appelle le trans-typage en informatique. C'est à dire une règle qui permet de transformer une information d'un type en un autre. Dans certains langages le transtypage est réalisé à l'aide d'un opérateur (que je ne décrirais pas ici car c'est hors du cadre de ce sujet). En NWNScript, faire du transtypage nécessite d'utiliser des fonctions fournies par le langage. Pour reprendre notre cas de figure ci-dessus, voici comment nous pourrions procéder. Code : void main() { int nA = FloatToInt(2.0); float fA = IntToFloat(2); } Ce morceau de code est d'une débilité profonde. En effet, j'utilise des constantes pour initialiser mes variables. Il me suffirait d'utiliser une constante du type adéquat pour que cela fonctionne. Une écriture équivalente est donc : Code : void main() { int nA = 2; float fA = 2.0; } Mais je voulais montrer l'usage d'une fonction et l'intérêt de fonction de transtypage comme FloatToInt et IntToFloat qui accomplissent donc, respectivement, la conversion d'un float en int et la conversion d'un int en float. J'ai encore long à dire sur les variables et peut de temps pour en parler. Je vais donc laisser le sujet en suspens et voir si certains sont intéressé pour que je continue. Déjà ce premier bout devrait éclairer un peu ta lanterne, Albator (à suivre ou fin, selon les besoins) _________________ 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 | |
WillGMN Acolyte Messages: 34 Localisation: manche |
merci bien , ca me la éclairé ma lanterne .
par contre : comment le transtypage FloatToInt fonctionne ( 2.3 différent 2 ou de 3 ) ce n'est qu'une question rétorique bien sure . |
Revenir en haut | |
Albator003 Invité |
bah la c'est deja plus clair j'ai bien suivi le cour et bien compris
la leçon je vais tout de site me mettre a faire u tutorial ou tester de faire des scripts de ce genre |
Revenir en haut | |
Albator003 Invité |
si j'ai bien comrpis la chose on peux par exemple ecrire ton script comme ca aussi
Code : // Ce script s'appelle "cloche"
void main() { int nHour=GetLocalInt(OBJECT_SELF, "HOUR"); int nCount = 1;//terme changer if (nHour==0) { nHour=24; } if (nHour>12) { nHour=nHour-12; } while (nCount++ <= nHour)//terme changer { DelayCommand(IntToFloat(nCount-1)*2.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2"))); } nHour++; if (nHour>24) { nHour=1; } SetLocalInt(OBJECT_SELF, "HOUR", nHour); DelayCommand(HoursToSeconds(1),ExecuteScript("cloche", OBJECT_SELF)); } ou encore Code : void main()
{ int nHour=GetLocalInt(OBJECT_SELF, "HOUR"); int nCount = 1;//terme changer if (nHour==0) { nHour=24; } if (nHour>12) { nHour=nHour-12; } do //ajout de do { DelayCommand(IntToFloat(nCount-1)*2.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2"))); } while (nCount++ <= nHour)//terme changer nHour++; if (nHour>24) { nHour=1; } SetLocalInt(OBJECT_SELF, "HOUR", nHour); DelayCommand(HoursToSeconds(1),ExecuteScript("cloche", OBJECT_SELF)); } bon ca ne sert a rien de faire ca mais c'est juste pour voir si ca marche aussi... camefaistavaillr un peu certaine fonction que je n'est jamais utilisé dis moi ce que tu pense de ca |
Revenir en haut | |
lendraste Grand Maître Chanteur du Conseil Messages: 1403 Localisation: Quelque part ailleurs |
A vrai dire, je suis en mal de répondre à ton exercice. J'ignore si l'opérateur "++" fonctionne dans NWNScript exactement comme en C ou en Java et je n'ai jamais eu l'occasion de faire le test. Je dirais que, par principe, et parce qu'elle est trop sujete à erreur, je n'utilise jamais la notation que tu as utilisé. Autrement dit je ne mélange pas les incréments et les comparaison sur la même ligne. Si l'opérateur "++" se comporte comme en C ou en Java, voici la réponse que je te ferai.
Le premier des deux scripts va fonctionner. Le second devrait fonctionner aussi mais te donnera un coup de cloche en trop. Je t'explique pourquoi. Dans ton premier cas de figure, tu initialise nCount à 1. Lorsque tu déclares la boucle qui va sonner les coups, tu utilises cette expression "(nCount++ <= nHour)". C'est un cas typique de fénéantise d'informaticien (maladie fréquente dans le milieu ) qui est hélas porteur d'une erreur très classique d'ignorance du fonctionnement d'un opérateur comme "++". Oula, voilà que je cause gras . Reprenons plus lentement. "++" est un opérateurs arithmétique particulier et "<=" est un opérateur de comparaison. "++" a pour effet d'incrémenter de 1 la valeur de la variable qui le précède. Mais "++" n'est réalisé qu'après l'évaluation de l'expression dont il fait partie. Cela signifie que "++" ne sera exécuté qu'après avoir comparé la valeur courante de nCoup. Ca nous arrange dans le premier script. nCoup est égal à 1 lors du premier passage. On le compare à nHour, puis on l'incrémente. Dans le second script, on fait exactement la même chose, mais à la fin de la boucle. Si on a qu'un seul coup à donner (nHour=1), on va passer une première fois dans la boucle (puisqu'il n'y a pas de condition d'entrée) et arrivé au test on va se rendre compte que nCoup<=nHour puisqu'il est toujours égal à 1 à ce stade, donc on va relancer la boucle une autre fois après avoir incrémenté nCoup. J'insiste ! Cela fonctionne ainsi dans le langage C ou le langage Java. Je n'ai pas fait le test en NWNScript. Pour éviter d'avoir à le faire, je peux toujours écrire la boucle ainsi : Code : do { //..instructions de la boucle nCount++; } while (nCount <= nHour) De cette façon, nCount sera bien incrémenté à coup sûr avant le test. De la même façon, en C ou en Java, l'opérateur "++" (ou "--") peut être placé "avant" la variable. Il a exactement le même effet, à l'exception du fait qu'il est appliqué "avant" l'évaluation de l'expression dont il fait partie. En C ou en Java on pourrait donc écrire le second script de la façon suivante : Code : do { //..instructions de la boucle } while (++nCount <= nHour) Mais je le répète, je ne sais pas si l'opérateur "++" (ou "--") de NWNScript autorise cette interprétation. C'est à tester, si tu en as le courage . Déjà, il est facile de s'assurer de la possibilité d'utiliser "++" ou "--" "devant" la variable à incrémenter en essayant de compiler un script utilisant cette notation. Si ça ne marche pas, l'affaire est reglée. Si on peut compiler le script, le test suivant devrait nous permettre d'y voir plus clair (sauver le script sous le nom "testoperateur") : Code : void main() { int nA=0; object oPC=GetFirstPC(); SendMessageToPC(oPC, IntToString(++nA)); SendMessageToPC(oPC, IntToString(nA)); SendMessageToPC(oPC, IntToString(nA++)); SendMessageToPC(oPC, IntToString(nA)); } On peut exécuter ce script en se connectant en solo (joueur) sur le module et en tapant dans la zone de saisie Code : ##DebugMode 1 puis Code : ##dm_runscript testoperateur Normalement, si l'opérateur fonctionne comme en C ou en Java, le résultat est une suite de 4 messages s'affichant comme suit : Code : 1 1 1 2 A tester, tout ça _________________ 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 | |
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