Tremblement Suite à Une Course
#1
Posté 09 septembre 2009 - 12:20
Voilà je cherche a faire un script pour un gros monstre, mais vraiment gros. Je voudrais que lorsque qu'il marche le sol tremble (cellule extérieure). Pour faire trembler le sol je suppose qu'il faut aller voir dans les script de fin du jeu, pour reprendre le passage où la chambre s'effondre non ? Mais y à-t-il un moyen de detecter quand le monstre est en train de marcher, ou bien courir ?
merci
#2
Posté 09 septembre 2009 - 13:28
Vardac Reborn, le 09.09.2009 à 13:19, dit :
Bonjour,
Vague piste déjà explorée (avec succès) sur un PNJ, à vérifier sur une créature :
Des tests "GetSoundPlaying" devraient te permettre de détecter les pas de ta créature :
(remplacer bien entendu les soundID par les bons si la créature en utilise qui lui sont propres)
If ( GetSoundPlaying, "animalLARGEleft" == 1 ) (... gestion de la secousse sismique ...) ElseIf ( GetSoundPlaying, "animalLARGEright" == 1 ) (... pareil ... ) Else (... si une secousse déjà en cours, temporiser une ou deux secondes avant de l'arrêter ...) EndIf
Le script final sera sans doute bien plus compliqué que ça, ce qui est important à garder en vue est que GetSoundPlaying renvoie 1 tant que le son est émis (c'est donc tributaire de sa longueur)
Modifié par abg, 09 septembre 2009 - 13:38.
Coaching de PNJs chez Morrowind Renaissance
#3
Posté 09 septembre 2009 - 15:05
Begin BLA float PZ If ( GetSoundPlaying, "animalLARGEleft" == 1 ) Set PZ to ( player-> GetPos, z+3 ) Player->SetPos, z, PZ ElseIf ( GetSoundPlaying, "animalLARGEright" == 1 ) Set PZ to ( player-> GetPos, z+3 ) Player->SetPos, z, PZ Endif End BLA
Je pense que sa rendrait moins bien qu'une secousse, mais si je ne trouve pas la fonction de la secousse, cela devrais rendre pas mal nan ?
-------------------------------------------------------------------------------------------------------------------
En fait mon idée précédente ne fonctionne pas bien. Fin fonctionne, mais ne rend pas bien. La secousse doit se trouver dans le script du cœur non ? (LorkhanHeart) Et même dans ce script je ne trouve rien qui fait référence à une secousse.
Je copie le script pour ceux qui veulent m'aider à chercher :
Et sinon pour les autres scripts suceptile de la contenir, je n'ai rien trouvé non plus, aussi bien "EndGame" que "DagothDoorDetector" ou encore "Akula_doors", soit tout les script utilisé pour cette aprtie du jeu ...
Modifié par Vardac Reborn, 09 septembre 2009 - 15:06.
#4
Posté 10 septembre 2009 - 01:45
J'ai regardé une vidéo de la destruction du coeur, et il n'y a aucun "tremblement de terre".
C'est juste Akulakhan qui s'éffondre ( animation ), par contre il y a bien un effet sonore type tremblement de terre.
Peut être que ces deux éléments suffisent à donner l'impression d'un tremblement de terre, en tous cas, je n'ai jamais vu de
script le faisant.
Dans le module que je développe, il y a pas mal de séismes. Voici le script que j'utilise ( En gros, même principe que le tien ):
short state short magn set magn to 5 if ( state == 0 ) set posZ to "player"->getpos z set posZ to ( posZ + magn) player->setpos z posZ set state to 1 elseif ( state == 1 ) set posZ to "player"->getpos z set posZ to ( posZ - magn ) player->setpos z posZ set state to 0 endif
Il faut bien sûr une condition timer.
Augmenter la valeur de Magn, revient à augmenter l'amplitude du tremblement ( la magnitude du séisme en gros...)
#5
Posté 10 septembre 2009 - 05:34
Comme je voulais voir la terre trembler, j'ai essayé ton script Von. L'effet est sympathique mais l'utilisation de "SetPos" pour faire ça comporte quelques inconvénients :
- Il faut que le terrain soit plat. Si le PJ est sur un terrain en pente (en extérieur), ça ne fonctionne pas car le moteur du jeu corrige automatiquement les écarts de position sur l'axe z. (Ceci pour compenser l'absence de chevilles et donc le fait que les pieds sont toujours perpendiculaires à l'axe z).
- Si le PJ se déplace, ça ne fonctionne pas non plus car la marche (ou la course) annule le "SetPos z".
- En vue 3ème personne, ça ne fonctionne presque jamais, même sur terrain plat car les réglages de position z sont différents et la correction par le moteur encore plus importante. Je m'en étais déjà aperçu en cherchant à détecter la marche et le saut sans Tribunal.
Je pense qu'il est préférable d'utiliser "RotateWorld". Il ne faut pas l'utiliser sur x ou y à cause des imprécisions qui se cumuleraient et finiraient par pencher le PJ mais on peut sans problème l'utiliser sur z.
Une rotation sur l'axe z est moins logique qu'un déplacement sur le même axe mais l'effet est quand même assez réaliste et ça fonctionne à tous les coups. Sur tous les terrains, quelque soit la vue et même si le PJ se déplace en marchant ou en courant (pour échapper à la créature par exemple ou bien pour éviter les murs qui tombent en cas de tremblement de terre). Le seul moment où ça ne fonctionne pas, c'est en mode "Vanity" (la vue tournante) mais le "SetPos" non plus dans ce cas. (Note : Je n'ai pas essayé si le PJ lévite).
J'ai fait un petit script (Global) de test ci-dessous. J'ai mis un "timer" pour empêcher la continuité du tremblement et simuler des pas mais bien sûr, il faut remplacer cette condition par le "GetSoundPlaying" des pas réels de la créature :
begin test_Scr short state short boum short son float timer if ( menumode == 1 ) return endif set timer to ( timer + GetSecondsPassed ) if ( timer >= 1 ) set timer to 0 set boum to 0 if ( son == 0 ) set son to 1 Playsound fabBossRight else Playsound fabBossLeft set son to 0 endif endif if ( boum < 5 ) if ( state == 0 ) player->RotateWorld z 10 set state to 1 elseif ( state == 1 ) player->RotateWorld z -10 set state to 0 set boum to ( boum + 1 ) endif endif end
PS : Il y a quand même un inconvénient par rapport à "SetPos", c'est que "RotateWorld" n'accepte pas les variables en argument. Donc si on veut par exemple que l'amplitude du tremblement soit de plus en plus importante quand la créature se rapproche, il faut faire plusieurs blocs qui attribuent des valeurs préréglées différentes à "RotateWorld".
#6
Posté 10 septembre 2009 - 09:31
Begin BLA float PZ Short state Short Ampli If ( GetDistance,Player =< 1000 ) Set Ampli to 5 endif If ( GetDistance,Player =< 800 ) Set Ampli to 6 endif If ( GetDistance,Player =< 600 ) Set Ampli to 7 endif If ( GetDistance,Player =< 500 ) Set Ampli to 8 endif If ( GetDistance,Player =< 400 ) Set Ampli to 9 endif If ( GetDistance,Player =< 300 ) Set Ampli to 10 endif If ( GetSoundPlaying, "animalLARGEleft" == 1 ) If ( state == 0 ) player->RotateWorld z (Ampli) set state to 1 Elseif ( state == 1 ) player->RotateWorld z -(Ampli) set state to 0 Endif Endif If ( GetSoundPlaying, "animalLARGERight" == 1 ) If ( state == 0 ) player->RotateWorld z (Ampli) set state to 1 Elseif ( state == 1 ) player->RotateWorld z -(Ampli) set state to 0 Endif Endif End BLA
Un truc du genre me parait pas mal non ? (je n'ai pas encore testé)
Et sinon il n'y aurait pas une fonction pour modifier l'écran de vision du joueur quand il est en 1ère personne ? Pour pouvoir le faire vibrer si le joueur est en première personne, cela rendrait d'autant mieux.
Modifié par Vardac Reborn, 10 septembre 2009 - 09:42.
#7
Posté 10 septembre 2009 - 13:30
Citation
Elendell a pourtant précisé que Rotateworld ne prenait pas les variables en argument.
Citation
- Il faut que le terrain soit plat. Si le PJ est sur un terrain en pente (en extérieur), ça ne fonctionne pas car le moteur du jeu corrige automatiquement les écarts de position sur l'axe z. (Ceci pour compenser l'absence de chevilles et donc le fait que les pieds sont toujours perpendiculaires à l'axe z).
- Si le PJ se déplace, ça ne fonctionne pas non plus car la marche (ou la course) annule le "SetPos z".
- En vue 3ème personne, ça ne fonctionne presque jamais, même sur terrain plat car les réglages de position z sont différents et la correction par le moteur encore plus importante. Je m'en étais déjà aperçu en cherchant à détecter la marche et le saut sans Tribunal.
Je pense qu'il est préférable d'utiliser "RotateWorld". Il ne faut pas l'utiliser sur x ou y à cause des imprécisions qui se cumuleraient et finiraient par pencher le PJ mais on peut sans problème l'utiliser sur z.
En effet, je ne m'en suis par rendu compte car je faisait un "disableplayercontrols" pendant le séisme ( pour simuler le fait que le pj soit surpris, mais aussi par ce que cela fait partie de petites cinématiques ).
Ton idée de Rotateworld sur le pj à l'air bien, mais pourquoi ne pas utiliser rotate ou setAngle (qui lui accepte les variables ) ?
Modifié par Von Zeeple, 10 septembre 2009 - 13:31.
#8
Posté 10 septembre 2009 - 15:55
Von Zeeple, le 10.09.2009 à 14:29, dit :
"Position" n'accepte pas non plus les variables (Le MSfD dit que oui mais je n'ai jamais réussi).
Quand à "Rotate", ça fonctionne curieusement sur le PJ. La rotation s'effectue toujours dans le même sens, que la valeur indiquée soit positive ou négative. Mais, le sens de cette rotation dépend de l'angle z du PJ. Autrement dit, avec "Rotate" on ne peut pas faire d'aller-retour de la rotation. A la place, on aura une rotation par crans dans un seul sens. Et si le PJ a un angle z de 160° la rotation va par exemple se faire vers la droite et s'il a un angle de 200°, elle changera de sens. (Les chiffres que je donne sont pour expliquer le principe mais ne sont pas les angles réels qui déterminent le changement de sens).
A noter que si l'on veut utiliser "RotateWorld" avec une valeur non prédéfinie, on peut utiliser des boucles "While" pour palier à l'impossibilité d'utiliser des variables en argument. C'est ce que j'ai fait pour la rotation du voilier et du PJ, pour que l'amplitude de cette rotation soit en fonction de la position de la barre :
;set rotation to .... if ( barre < 0 while ( gouvern < rotation ) if ( ( rotation - gouvern ) < 1 ) rotate, z, -0.1 player->RotateWorld z -0.1 set gouvern to ( gouvern + 0.1 ) elseif ( ( rotation - gouvern ) < 10 ) rotate, z, -1 player->RotateWorld z -1 set gouvern to ( gouvern + 1 ) elseif ( ( rotation - gouvern ) >= 10 ) rotate, z, -10 player->RotateWorld z -10 set gouvern to ( gouvern + 10 ) endif endwhile elseif ( barre > 0 ) while ( gouvern < rotation ) if ( ( rotation - gouvern ) < 1 ) rotate, z, 0.1 player->RotateWorld z 0.1 set gouvern to ( gouvern + 0.1 ) elseif ( ( rotation - gouvern ) < 10 ) rotate, z, 1 player->RotateWorld z 1 set gouvern to ( gouvern + 1 ) elseif ( ( rotation - gouvern ) >= 10 ) rotate, z, 10 player->RotateWorld z 10 set gouvern to ( gouvern + 10 ) endif endwhile endif set gouvern to 0
Notes :
- C'est possible car les instructions "Rotate" ou "RotateWorld" dans une frame s'ajoutent et ne se remplacent pas. Si tu écris par exemple :
Rotate x 10
Rotate x 30
Rotate x 5
tu obtiendras une rotation sur x à la vitesse de 45 u/s pour cette frame.
- J'ai utilisé "Rotate" pour le voilier car ça fonctionne normalement sur les objets mais "RotateWorld" pour le PJ pour les raisons expliquées ci-dessus.
#9
Posté 11 septembre 2009 - 09:27
0 utilisateur(s) li(sen)t ce sujet
0 membre(s), 0 invité(s), 0 utilisateur(s) anonyme(s)