La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
La date/heure actuelle est 22/09/2024 23:22:39


  Page 1 sur 1 ¤

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
julia
Novice
Inscrit le: 14 Avr 2004
Messages: 6
Répondre en citant
Posté le : 14/04/2004 23:49:20 Sujet du message : cut scene: probleme action queued et autres soucis....

bonjour,

j ai codee pour rire, une cut scene avec des Delays Command et rencontre de nombreux problemes
notemment avec la fonction CreateObject.Certain post ici m ont permis de resoudre les plus importants .

Cependant il reste que:

1)la fonction PlaySound ne veut semble t il pas onctionner (j ai crue comprendre qu elle etait consideree comme une action...)

2)j ai une erreur divided par zero en utilisant les ajustes reputation et determin combat round

3)le CreateObject (toujours lui )ne marche pas avec les DelayCommand (..mais ca je viens de resoudre en utilisant une fction CutCreate dans mes inc de librairie ...)

4)enfin devant tout ces problemes je me resouds a passer aux queues d actions comme le preconise un des adm de ce forum en or:

Cependant rien ne fonctionne!

voila comment je m y prends
Ce message est un spoiler, et risque de vous informer de choses que vous auriez dû apprendre par vous même (fin d'un jeu, film, etc). À vos risques et périls (ludiques), vous pouvez le voir en cliquant sur cet avertissement.
Spoiler :
(comme une bille sans aucun doute):


j ai placee un "trigger" avec dans son OnEnter le script correspondant a la CutScene
qui sera declenché si et seulmnt si un PC (perso joueur) entre dedans... avec des delay command cela marche sans probleme... avec les queues d action je ne comprends pas ce qui cloche...

voici le script:


NWScript :

//personnage dans la scne a cote du trigger
object oPNJ_Illith = GetObjectByTag("illithid");

//le joueur qui entre
object oPC=GetEnteringObject();

void main(){

    if (!GetIsPC(oPC)){
        return; //si c est pas un Pc on sort...
    }

AssignCommand(oPC, ClearAllActions(TRUE));
AssignCommand(oPC,ActionDoCommand(SetCutsceneMode( oPC, TRUE )));


AssignCommand(oPNJ_Illith,ActionSpeakString("hahaha"));
AssignCommand(oPNJ_Illith,PlaySound("vs_fseductf_haha "));

//voir meme: ? AssignCommand(oPNJ_Illith,Acti onDoCommand(PlaySound(" vs_fseductf_haha ")));
AssignCommand(oPC,ActionDoCommand(SetCutsceneMode( oPC, FALSE )));
}

Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.


donc pas de declenchemnt de la cut scene et encore moins de PlaySound par contre l ActionSpeakString fonctionne!!!(merci a lui!)
ai je bien tout compris?:

NWScript :Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.


Normalemnt AssignDoCommand devrait mettre dans la queue d action de l oPc la command de demmarage du mode CutScene ..? oui? non?..

j ai meme fait sans trop d espoir:

ActionDoCommand(SetCutSceneMode( oPC, TRUE ));


voici le 2eme code de cette cut scene fait avec des delay command:

NWScript :


void CutSpeak( object oPC,float fDelay, string sDialog ){

  DelayCommand( fDelay, AssignCommand( oPC, SpeakString( sDialog ) ) );
}


void CutAdjustReputation(float fDelay,object oTarget,object oSource,int nAdjustement ){

  DelayCommand(fDelay,AdjustReputation(oTarget,oSource,nAdjustement));

}

void CallDetermineCombatRound(object oPC){

  AssignCommand(oPC,DetermineCombatRound());
}


void CutDetermineCombatRound(float fDelay,object oPC){

DelayCommand(fDelay,CallDetermineCombatRound(oPC));
}


void main(){
    if (!GetIsPC(oPC)){
        return;
    }
  AssignCommand(oPC, ClearAllActions(TRUE));
  CutMode(oPC,TRUE,0.0);//
  CutSpeak(oPNJ_Illith,4.0,"hahaha");
  AssignCommand(oPNJ_Illith, DelayCommand(11.0, PlaySound(" vs_fx0feisf_haha ") ));//marche pas

  // pour une de ses 2 lignes error de division par zero
  CutAdjustReputation(12.5,oPC,oPNJ_Illith,-100);//error
  DelayCommand(13.0,DetermineCombatRound() );//ou ici...

  CutMode(oPC,FALSE,20.0);
}

Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.




desolee d etre si bavarde donc merci d avance pour ceux/celles qui ont eu la patience de lire jusqu ici...
grand merci a ceux/celles qui me donneront un lien qui reponds a mes problemes .

thks
J.

ps:
Ce message est un spoiler, et risque de vous informer de choses que vous auriez dû apprendre par vous même (fin d'un jeu, film, etc). À vos risques et périls (ludiques), vous pouvez le voir en cliquant sur cet avertissement.
Spoiler :
c est pas moi qui viens de tuer le mechant balor!prefere m enfuir en roulant comme les grosses billes
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
lendraste
Grand Maître Chanteur du Conseil
Inscrit le: 20 Fév 2003
Messages: 1403
Localisation: Quelque part ailleurs
Répondre en citant
Posté le : 15/04/2004 07:51:23 Sujet du message :

Bienvenue à toi,

D'expérience, je te dirais une chose à propos de ta décision d'utiliser les queues d'action : elle est bonne ! Smile
Bon, j'avoue que je suis de parti pris, mais depuis ces derniers mois j'envisage avec beaucoup moins d'entrain les solutions DelayCommand, et même, je les évite. Les problèmes que tu rencontres avec la queue d'action sont relativement simple à comprendre. Voici mes observations :
- PlaySound n'est justement pas une action. C'est sensé jouer un son sur le "client", ce qui signifie, sur le poste du joueur. En l'affectant à un PNJ, il n'a aucun effet. En l'affectant à la queue d'action d'un PJ il attendra que la queue d'action du PJ soit vide avant de le jouer (dixit le Lexicon).
- je ne réagirais pas sur ton problème de "divide by zero". Je ne connais pas assez bien les fonctions de réputation et le DetermineCombatRound.
- Le mode CutScene doit fonctionner de la manière dont tu l'utilises. Mais tu affectes le CutScene On et le CutScene Off sur la queue d'action du PJ coup sur coup (vu que les autres actions sont placées sur la queue d'action du PNJ), donc, comme les queues d'actions de 2 créatures ne sont absolument pas synchrone (une autre manière de dire que les actions du PJ n'attendront pas, pour être jouée, les actions du PNJ), et qu'en outre, l'action SpeakString est instantannée, le mode CutScene s'active et se désactive sans que tu aies le temps de le voir.

L'idée de l'utilisation d'une queue d'action pour une CutScene est de faire en sorte qu'une seule queue d'action soit sollicitée pour "piloter" la CutScene. Le plus simple pour une CutScene est d'utiliser la queue d'action du PJ en toute circonstance. Si l'on doit faire jouer des actions indépendantes aux PNJs, on peut les synchroniser à l'aide de la queue d'action pilote, ou bien l'on doit tenir compte du temps que mettront ces actions à s'exécuter. Voici une solution possible par rapport à l'exemple que tu donnes :
NWScript :

void main()
{
  //personnage dans la scne a cote du trigger
  object oPNJ_Illith = GetObjectByTag("illithid");

  //le joueur qui entre
  object oPC=GetEnteringObject();

  if (!GetIsPC(oPC))
  {
    return; //si c est pas un Pc on sort...
  }

  AssignCommand(oPC, ClearAllActions(TRUE));
  AssignCommand(oPC, ActionDoCommand(SetCutsceneMode( oPC, TRUE )));
 
  AssignCommand(oPC, ActionWait(2.0)); // Un petit temps d'attente
  AssignCommand(oPC, ActionDoCommand(AssignCommand(oPNJ_Illith, ActionSpeakString("hahaha"))));
  AssignCommand(oPC, ActionDoCommand(PlaySound("vs_fseductf_haha ")));
  AssignCommand(oPC, ActionWait(1.0)); // Encore un petit temps d'attente
  AssignCommand(oPC, ActionDoCommand(SetCutsceneMode( oPC, FALSE )));
}
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.


Il vaux mieux faire des déclarations locales (dans la fonction) pour les variables (les déclarations globales sont réservées, la plupart du temps, pour les constantes). C'est la raison pour laquelle j'ai introduit oPNJ_Illith et oPC dans la fonction.

Ensuite, un problème se pose dans ma solution si la queue d'action du PNJ n'est pas vide (pour une raison X), car l'action de jouer un SpeakString ne s'accomplira alors qu'à la fin. Mais il faut noter que cela ne stoppe nullement la queue d'action du PJ. En effet, la queue d'action déroule en continue les évènements sans s'arrêter, l'un de ses évènements est d'introduire une ActionSpeakString dans la queue d'action du PNJ mais on en attendra pas le résultat pour continuer. Les ActionWait sont là pour se donner le temps de vérifier que l'enchaînement fonctionne effectivement comme on l'attends. Pour vérifier chaque étape, on peut même introduire (à titre de débuggage) un ActionSpeakString sur le PJ pour qu'il nomme chaque prochaine action. Ca aide bien souvent à déterminer ce qui coince.
Pour en revenir à l'affectation de l'ActionSpeakString détourné pour le PNJ, on peut procéder de manière plus sûre en appelant une fonction qui se chargera de vider la queue d'action du PNJ et de lui affecter le ActionSpeakString. Cette fonction serait appelée alors de la même manière par un ActionDoCommand de telle sorte que seule des actions soient affectée à la queue d'action du PJ qui sert de pilote.

J'émets des réserves sur l'appel de la fonction PlaySound, car je n'ai jamais cherché à savoir si on pouvait la convertir en action par ActionDoCommand. Je serais tenté de dire que c'est possible, mais je n'ai pas testé.

Fais-moi savoir si cela fonctionne un peu mieux et surtout si le principe est plus clair maintenant ?
_________________
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 Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger Numéro ICQ Ignorer l'utilisateur
 
julia
Novice
Inscrit le: 14 Avr 2004
Messages: 6
Répondre en citant
Posté le : 15/04/2004 16:12:54 Sujet du message : suite..

je me posais justement la question de savoir comment synchroniser les QuedAction des autres PNJ

ton post y reponds de facon clair et plus que satisfaisante,et du meme coup me fait comprendre
pourquoi rien ne fonctionnait correctement.

je reformule pour voir si j ai bien tout piger

Les 2 solutions pour etre synchro sont donc :

1)utiliser la queue "pilote" et d assigner les command d action des autre PNJ dans cette queue
lorsque c est possible.

2)les retarder avec un ActionWait en calculant le temps necessaire a leur apparition voir meme
pour certaine fonction un DelayCommand...ce qui nous ramenerais en fait au question de timer ...

le DelayCommand pour ma part je n en ferai pas une "bete noire" car j ai tout de meme obtenue
avec cette methode une cutscene tout a fait satisfaisante de 2 minutes.
De plus j ai regardee comment BioWare scriptait une scene et ils utilise une librairie basé sur
les DelayCommand...cependant je suppose qu en mode solo pour la campagne,les utiliser posent sans
doute moins de probleme qu en mode multijoueur...

avant test:

il y a cependant l idee que le point fort de faire un timer reside precisement dans la maniere de
gerer le temps comme on le desire(enfin normalment)ce qui me semble moins precis avec les
QuedAction ,a moins de pouvoir calculer le temps que prennent chaque action...ce qui semble peu
possible de tte maniere pour certaine command comme: ActionAttack


apres test:

1er impression
hum cela fonctionne mais cela m embete de ne pas avoir le controle de la gestion du temps...avec
les delay command on pouvait justemnt dire ma scene fait tant de temps quoi qu il advienne..(enfin normalmnt! lol)


AssignCommand(oPC, ActionDoCommand(AssignCommand(oPNJ_Illith, ActionSpeakString("hahaha"))));

cette ligne est tres bien!on met dans la file pilote la command assigncomand
je n ai pas encore tester le vidage des files d action des pnj car l exemple est trop simple pour
l instant ..mais sans doute se sera utile pour une scene plus complexe.

la commande playsound se met bien dans la file d attente...mais sans les actionWaits aucune
chance de rien avoir.

vais essayer de faire scene plus complexe et de faire une petite lib


ps: pour les declarations de variable globale /locale c est une mauvaise habitude que j ai prise...et en effet il semble plus logique de declarer les local dans la fonction.J en prends
aussi bonne notes...


reps: en dernier lieu, merci pour toutes tes remarques precisions et autre post sur le forum tres enrichissant...a conseiller a quiconque veut progresser.
J.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Montrer les messages depuis :
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


Sauter vers:
FAQ | Rechercher | Liste des Membres | Groupes d'utilisateurs | S'enregistrer | Profil | Se connecter pour vérifier ses messages privés | Connexion
Powered by phpBB 2.* [m] © 2001, 2002 phpBB Group
Theme rewritten in beautiful XHTML code by Baldurien.
Thème "La Bibliothèque de Neverwinter" crée par Kruger
Traduction par : phpBB-fr.com
Page generated in 45.582ms