Aller au contenu


Tremblement Suite à Une Course


  • Veuillez vous connecter pour répondre
8 réponses à ce sujet

#1 Vardac Reborn

Vardac Reborn

Posté 09 septembre 2009 - 12:20

Bonjour

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 abg

abg

    L'ABG pour les civilisés


Posté 09 septembre 2009 - 13:28

Voir le messageVardac Reborn, le 09.09.2009 à 13:19, dit :

Mais y à-t-il un moyen de detecter quand le monstre est en train de marcher, ou bien courir ?

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.

Antoninus Bibulus Glaber
Coaching de PNJs chez Morrowind Renaissance

#3 Vardac Reborn

Vardac Reborn

Posté 09 septembre 2009 - 15:05

Ok merci bien Abg, je vais essayer cela, en revanche, j'ai beau chercher je ne trouve pas le script qui fait une secousse sismique, mais je me demande si en revanche je ne pourais pas faire bouger le Player, du genre :

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 :

Spoiler

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 Von Zeeple

Von Zeeple

    Grille pain Dwemer


Posté 10 septembre 2009 - 01:45

Bonsoir,

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...)
Le Steampunk, c'est bon, mangez en  !

#5 elendell

elendell

    Mécano Dell'Arte


Posté 10 septembre 2009 - 05:34

Bonjour,

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 Vardac Reborn

Vardac Reborn

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 Von Zeeple

Von Zeeple

    Grille pain Dwemer


Posté 10 septembre 2009 - 13:30

Citation

player->RotateWorld z -(Ampli)

Elendell a pourtant précisé que Rotateworld ne prenait pas les variables en argument.

Citation

ç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.

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.

Le Steampunk, c'est bon, mangez en  !

#8 elendell

elendell

    Mécano Dell'Arte


Posté 10 septembre 2009 - 15:55

Bonjour Von,

Voir le messageVon Zeeple, le 10.09.2009 à 14:29, dit :

Ton idée de Rotateworld sur le pj à l'air bien, mais pourquoi ne pas utiliser rotate ou setAngle (qui lui accepte les variables ) ?
"SetAngle" ne fonctionne pas sur les acteurs et créatures. Ça m'en a d'ailleurs bien fait baver et obligé à chercher des solutions différentes pour les détecteurs de collision du voilier.

"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 Vardac Reborn

Vardac Reborn

Posté 11 septembre 2009 - 09:27

Salut les gas ! Bon je vous dis un grand merci pour votre aide car j'ai testé le script et il marche à la perfection ! Merci beaucoup =D




0 utilisateur(s) li(sen)t ce sujet

0 membre(s), 0 invité(s), 0 utilisateur(s) anonyme(s)