Système de detection vraiment très simplifié en event

Voir le sujet précédent Voir le sujet suivant Aller en bas

Système de detection vraiment très simplifié en event

Message par Larcange le Mer 21 Juil - 0:31

Coucou! Voilà, beaucoup d'entre nous ont déjà eu à faire au script View Range qui permet de faire sous rmxp un système de champs de detection du héros par raport à un event afin de déclencher un interrupteur local.
Pour mon projet Why,j 'avais des soucis, puisque le jeu ne doit absoluement pas laguer, et que le système de detection consomme quand même un peu de ressource.
Je suis donc parti sur l'éléboration de mon propre système de detection, avant de découvrir qu'en fait, il est vraiment très simple de faire un système de détection en event, une simple condition suffit!
Tout d'abord, je vais vous présenter le principe!
Pour ceux qui connaissent, on va utiliser l'équation d'un cercle dans un repère 2D:
Il est tard, un peu la flemme d'expliquer d'où viend la formule, je le ferais demain ou après sauf si Garsim partage de sa culture pour nous faire la démonstration =) (démonstration simple par du Pythagore suffit amplement mais même ça j'ai la flemme x) )
On a donc pour un cercle: x² + y² = R², ou x² + y² - R² = 0 avec x et y les coordonnées du centre du cercle, et R le rayon du cercle
Bref, c'est la formule pour tracer un cercle de Rayon R, et de centre O(x,y). Maintenant, imaginons que le centre du cercle soit un événement ne position x, et y, et que l'on cherche si le héros ou un autre événement de coordonnée x' et y' se trouve dans le cercle.
On doit donc vérifier si la distance entre les x et les y des deux événements sont inférieures ou égales au rayon de la detection.
Ca nous donne donc X² + Y² <= R². Attention, j'ai mis des majuscules,c'est pas pour rien! Car, bah oui, On a deux x puisqu'on a deux event et deux y.
On va donc calculer la distanceentre les x et les y afin de pouvoir utiliser la formule.
Pour calculer une distance, il suffit de prendre la plus grande position moins la plus petite, ex on a un event de position 10, et un event de position 3. On va faire 10 - 3 = 7. Mais on va dire que c'est plutôt chiant de vérifier quelle est la position la plus grande en x, puis en y puis d'utiliser la formule etc... 3 - 10 = -7, pas super pour la formule ^^!
On va donc utiliser la valeur absolue. Pour ceux qui connaissent pas, la valeur absolue se note en mathématique |x| et correspond à simplement, si x positif, alors |x| = x, et si x négatif, |x| = -x. En bref, on rend positif ce qu'il y a dans la valeur absolue.
Donc si on reprend l'exemple de tout à l'heure, |10 - 3| = 7, et |3 - 10| = |-7| = 7.
Parfait, c'était ce qu'on voulais.
En ruby, la valeur absolue se note .abs
Donc (-7).abs nous donne 7.
Bref, on a tous les éléments qu'il nous faut, puisqu'on a de quoi calculer la distance entre les x et les y de deux événements.
Maintenant, reprenons la formule X² + Y² <= R². On nous parle de carré. Mais ou sont les carré dans ce que je viend de mettre précement ? Bah, il n'y en a pas tout simplement pour la bonne raison que puisque x et y sont toujours positif avec la valeur absolue, et puisque une distance ne peut pas vraiment être négative dans ce cas, on peut supprimer le carré, et donc utiliser X + Y <= R.
On a donc plus qu'a remplacer X et Y par les x des différents events, et R par le rayon de detection
(x - x').abs + (y - y').abs <= detection.
C'est bien beau tout ça me direz vous, mais à quoi ça sert ça?!
Bah, on a déjà la formule qui nous permettra de vérifier si un évent ou le héros est detecté par un autre!
Il suffit donc d'utiliser une condition ou on vérifie le script (page 4 des onglets de condition):
Si (x - x').abs + (y - y').abs <= detection.
Mais par quoi on remplace les x, les y etc... ?
Bah, par des variables pardi!
C'est là l'intéret du système ^^!
on va noté $x1 pour x, $x2 pour x', $y1 pour y, et $y2 pour y'. Pour la detection, on va donc noter $detection
On a donc 5 variables générales (on aurais pu utiliser aussi des variables RM comme expliqué dans mes tutos précédents avec les $game_variables[], mais j'en utilise toujours au minimum possible).
Ainsi, au débtu d'un événement, on va utiliser l'astuce expliquée dans mes précedentzs tuto pour enregistrer la position x et y d'un événement ou du héros facilement:
On utilise la commande déplacer/modifier un événement:
{
Vous mettez la cible du premier event , ex: le héros
Insérer un script:
Code:

$x1 = @x
Code:

$y1 = @y
}
Puis vous remetez un dépalcer/modifier un événement, avec la le deuxième événement qui sera detecté ou detectera:
{
Insérer un script:
Code:

$x2 = @x
Code:

$y2 = @y
}
Ensuite, il vous suffit juste de faire un appel de script et d'y mettre
Code:

$detection = nombredecasededetection
Voilà, on a donc nos 5 variables.
Suffit donc de mettre notre petite condition:
Code:

(($x1 - $x2).abs + ($y1 - $y2).abs) <= $detection
Pour le cas ou la condition est vrai, donc que la detection est vraie, vous activez un interrupteur local, ou un interrupteur simple, et dans le sinon vous desactivez celui-ci.
Vous me direz, c'est bien beau, mais y a quoi de plus que le script view range?
Tout simplement que le script view range ne permet pas de faire detecter un événement avec un autre.
Le système marche en plus en event, en une seule condition, donc facilement modifiable, et facilement réglable pour faire différents cas selon différents événements. Bien évidement, il faudra mettre l'event en processus parallel avec un "attendre une frame" au début pour pas faire planter le jeu.
Voilà, fin du tuto, j'étofferais demain, je suis fatigué, le whysky a un peu trop tapé le cerveau ^^ =)
Sur ce, bon making!
avatar
Larcange
Soldat Lv.27
Soldat Lv.27

Messages : 796
Age : 26

Fiche
Palmarès:
Spécialité: Scripteur/Event Maker
Avertissements: Aucun

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum