RPG Fusion
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.



 
AccueilPortailRechercherDernières imagesS'enregistrerConnexion
Le Deal du moment : -20%
-20% sur le Lot de 2 écrans PC GIGABYTE ...
Voir le deal
429 €

 

 Détection du Héros par les ennemis (avancé)

Aller en bas 
3 participants
AuteurMessage
Laugilus
Démocrate Usurpateur
Démocrate Usurpateur
Laugilus


Masculin
Nombre de messages : 577
Age : 32
Projet(s) en cours : Fusion Maker 1.0.0
Niveau Rpg Maker : Trop lent.
Jeux Préférés : FF X - KH - KH 2 - DQ 8 - Oblivion
Date d'inscription : 12/02/2007

Détection du Héros par les ennemis (avancé) Empty
MessageSujet: Détection du Héros par les ennemis (avancé)   Détection du Héros par les ennemis (avancé) EmptyDim 02 Sep 2007, 22:36

Je suis l'unique auteur de ce tutorial, et il n'est inspiré d'aucun autre.

Oyez, oyez, chers fusionnards


Introduction
Ce système va servir certainement à plusieurs personnes, surtout les propriétaires de A-RPG. Mais aussi pour les RPG classiques. J'explique un peu de quoi il s'agit : Si le héros s'approche trop près d'un ennemi (ou n'importe quoi, d'ailleurs, ...) l'ennemi en question le poursuit. (Mais vous n'êtes pas obligé d'appliquer ce système de détection avancé pour des ennemis. Vous pouvez par exemple faire un très grand feu, et si le héros s'approche trop, il commence à griller^^ =D)

Système de base (champ de vision rectangulaire)
L'ennemi voit aussi loin devant lui que derrière lui. (Plus simple, tu meurs^^)
Eh bien, dans ce système, qui n'est pas bien compliqué, l'ennemi peut voir à x carreaux. Si le héros va dans cette zone (proche de x), et bien l'ennemi le poursuivra.

Pour cela, on prend une variable, et on lui assigne la valeur de x.
Ensuite, on prendra 4 autres variables, qui seront respectivement égalent au coordonnée en x de l'ennemi, au coordonnée en y de l'ennemi, au coordonnée en x du héros, au coordonnée en y du héros.
On calculera la distance en case du héros par rapport à l'ennemi.

Allez, hop, on passe au code^^
Ce qui donne : (toutes les explications sont dans les commentaires)
Code:
Map ID: 1, Nom: Intro
Evènement ID: 003, Nom: Ennemi

------ PAGE 1 ------

Conditions de l'évènement :

Apparence:
- Character : 005-Fighter05, Ton : 0, Regarde en Bas, Modèle n°0, Opacité : 255, Transparence : Normal

Mode de déplacement:
- Type de déplacement : Aléatoire
- Vitesse de déplacement: Lent
- Fréquence de déplacement: Basse

Options:
- Animé lorsqu'il se déplace

Conditions de déclenchement:
- Processus Parallèle

Commandes d'évènement:

Commentaire : On va faire en sorte que l'ennemi puisse voir à 5 cases.
Variable(s) [0003: Cases] rendre égale à 5
Commentaire : Variables de l'ennemi
Variable(s) [0004: Axe x ennemi] rendre égale à Cet évènement --> Coordonnée X
Variable(s) [0005: Axe y ennemi] rendre égale à Cet évènement --> Coordonnée Y
Commentaire : Variables du héros
Variable(s) [0006: Axe x Héros] rendre égale à Héros --> Coordonnée X
Variable(s) [0007: Axe y Héros] rendre égale à Héros --> Coordonnée Y
Commentaire : Calcul des distances
Commentaire : Les distances doivent être positives (supérieures à 0)
Condition : si la variable [0004: Axe x ennemi] est strictement supérieur à Variable [0006: Axe x Héros]
  Variable(s) [0008: Distance x] rendre égale à (valeur de la variable [0004: Axe x ennemi])
  Variable(s) [0008: Distance x] retirer (valeur de la variable [0006: Axe x Héros])
 
: Sinon
  Variable(s) [0008: Distance x] rendre égale à (valeur de la variable [0006: Axe x Héros])
  Variable(s) [0008: Distance x] retirer (valeur de la variable [0004: Axe x ennemi])
 
: Fin
Condition : si la variable [0005: Axe y ennemi] est strictement supérieur à Variable [0007: Axe y Héros]
  Variable(s) [0009: Distance y] rendre égale à (valeur de la variable [0005: Axe y ennemi])
  Variable(s) [0009: Distance y] retirer (valeur de la variable [0007: Axe y Héros])
 
: Sinon
  Variable(s) [0009: Distance y] rendre égale à (valeur de la variable [0007: Axe y Héros])
  Variable(s) [0009: Distance y] retirer (valeur de la variable [0005: Axe y ennemi])
 
: Fin
Condition : si la variable [0008: Distance x] est inférieur ou égale à Variable [0003: Cases]
  Condition : si la variable [0009: Distance y] est inférieur ou égale à Variable [0003: Cases]
    Afficher une animation sur Cet évènement, [Emotion-!]
    Interrupteur local A activé
   
  : Fin
 
: Fin

Et voilà, c'est fini. A la fin, j'ai été un peu radin sur les explications, alors^^. On vérifie tout simplement si le héros est à l'intérieur du champ de vision de l'ennemi, en regardant les distances x et y. C'est un peu compliqué, mais bon... Peut-être qu'après quelques relectures pour les plus jeunes ou débutants, il ne devrait pas y avoir de problèmes.

Système à la Laugilus (champ de vision circulaire)
Pour moi, c'est une première. Disons, que c'est la première fois que je trouve une idée aussi innovant, alors qu'il s'agit d'un truc simple.

Disons aussi que je ne pense pas que cela à déjà été exploité dans tout l'univers du making (en event, du moins), et retranscrit en tutorial. (Quelle modestie =D) Aussi, j'ai longtemps hésité à le montrer, car ce système sera présent dans mon projet, et ça gachera un peu la surprise, mais bon... Le but de cette section, c'est de faire partager des connaissances, et dans ce cas, mieux vaut ne pas être égoïste^^.

Vous trouvez pas bizarre que l'ennemi voit en rectangle ? Je trouverai plus logique, pour ma part, qu'il puisse voir en cercle. Et bien nous y voilà^^

O_o, trêve de bavardage !
Ok, on y arrive. Avant de commencer (...), il faut que vous sachiez que c'est compliqué. Car là, il va falloir faire intervenir mes maths adorés (I love you ) ainsi que notre méconnu théorème de Pythagore^^. Pour comprendre, un minimum de niveau de 4° est requis. Mais on comprend tout de même mieux cela après avoir fini le programme de seconde (et l'avoir compris laughing ).
Ainsi pour ceux qui ne comprendrons pas, ils peuvent tout de même prendre les commandes d'évènement. Je me suis débrouillé pour que la distance du champ de vision (le rayon) soit à inscrire dans une variable.

O_o, trêve de bavardage !!!
Attention, c'est parti. Avec l'aide de notre Pythagore, on peut calculer la distance dans un plan orthonormé entre 2 points, avec cette formule :

Code:
racine carré ((y du point 1 - y du point 2)au carré + (x du point 1 - x du point 2)au carré)

Je vous avez dit que c'était pas facile^^.

Erf, c'est pas facile, envoie les commandes que je les recopie^^
Un peu d'explication sur les commandes d'abord. Là, c'est simple (...), Il n'y aura qu'une seule variable de distance, et elle sera calculé avec la formule ci-dessus. Le point 1 étant l'emplacement de l'ennemi, et le point 2 du héros. Les x et y correspondent évidemment aux coordonnées.
Mais ici, on ne va pas appliquer la racine carré, car il est impossible de la faire sous RPG Maker (sans script). Nous laissons donc toutes les unités au carré.

Bon, tu passes vraiment au code, cette fois ?
Euh... oui bon... =D

Code:
Map ID: 1, Nom: Intro
Evènement ID: 005, Nom: Ennemi

------ PAGE 1 ------

Conditions de l'évènement :

Apparence:
- Character : 005-Fighter05, Ton : 0, Regarde en Bas, Modèle n°0, Opacité : 255, Transparence : Normal

Mode de déplacement:
- Type de déplacement : Aléatoire
- Vitesse de déplacement: Lent
- Fréquence de déplacement: Basse

Options:
- Animé lorsqu'il se déplace

Conditions de déclenchement:
- Processus Parallèle

Commandes d'évènement:

Commentaire : Le champ de vision est le rayon (toujours en cases)
Variable(s) [0003: Cases] rendre égale à 5
Variable(s) [0003: Cases] multiplier par (valeur de la variable [0003: Cases])
Commentaire : Variables de l'ennemi
Variable(s) [0004: Axe x ennemi] rendre égale à Cet évènement --> Coordonnée X
Variable(s) [0005: Axe y ennemi] rendre égale à Cet évènement --> Coordonnée Y
Commentaire : Variables du héros
Variable(s) [0006: Axe x Héros] rendre égale à Héros --> Coordonnée X
Variable(s) [0007: Axe y Héros] rendre égale à Héros --> Coordonnée Y
Commentaire : Calcul de la distance
Variable(s) [0008: Distance x] rendre égale à (valeur de la variable [0004: Axe x ennemi])
Variable(s) [0008: Distance x] retirer (valeur de la variable [0006: Axe x Héros])
Variable(s) [0008: Distance x] multiplier par (valeur de la variable [0008: Distance x])
Variable(s) [0009: Distance y] rendre égale à (valeur de la variable [0005: Axe y ennemi])
Variable(s) [0009: Distance y] retirer (valeur de la variable [0007: Axe y Héros])
Variable(s) [0009: Distance y] multiplier par (valeur de la variable [0009: Distance y])
Variable(s) [0010: Distance totale] rendre égale à (valeur de la variable [0008: Distance x])
Variable(s) [0010: Distance totale] ajouter (valeur de la variable [0009: Distance y])
Condition : si la variable [0010: Distance totale] est inférieur ou égale à Variable [0003: Cases]
  Afficher une animation sur Cet évènement, [Emotion-!]
  Interrupteur local A activé
 
: Fin

Vous remarquerez que c'est plus court^^. Mais c'est également plus compliqué^^.

Ensuite...
Pour terminer le tout, vous devez faire une seconde page d'évènement, où vous mettez : Condition de déclenchement : Si l'interrupteur local A est activé.

Et là, vous faites tout ce que vous voulez.

Ouf, et bien voilà, j'aurais révisé mes maths avant la rentré au CE1 =D^^.

En espérant que cela aura servi à quelqu'un...

Laugilus.


Dernière édition par le Mar 04 Sep 2007, 20:42, édité 1 fois
Revenir en haut Aller en bas
moms
Luthiste
Luthiste
moms


Nombre de messages : 375
Age : 35
Projet(s) en cours : héhé pas de nom...
Date d'inscription : 24/08/2007

Détection du Héros par les ennemis (avancé) Empty
MessageSujet: Re: Détection du Héros par les ennemis (avancé)   Détection du Héros par les ennemis (avancé) EmptyLun 03 Sep 2007, 08:37

très bon tutorial laugilus ^^!
en faites le système du champs de vision existe déjà, j'avais un amis qui s'en servait pour faire son jeu d'infiltration... laughing
Revenir en haut Aller en bas
Laugilus
Démocrate Usurpateur
Démocrate Usurpateur
Laugilus


Masculin
Nombre de messages : 577
Age : 32
Projet(s) en cours : Fusion Maker 1.0.0
Niveau Rpg Maker : Trop lent.
Jeux Préférés : FF X - KH - KH 2 - DQ 8 - Oblivion
Date d'inscription : 12/02/2007

Détection du Héros par les ennemis (avancé) Empty
MessageSujet: Re: Détection du Héros par les ennemis (avancé)   Détection du Héros par les ennemis (avancé) EmptyLun 03 Sep 2007, 09:55

Merci^^.

Je savais que le champ de vision existe déjà. Je parlais du champs de vision circulaire^^.
Revenir en haut Aller en bas
Erevan
Acrobate
Acrobate
Erevan


Masculin
Nombre de messages : 104
Age : 30
Projet(s) en cours : Erevan
Niveau Rpg Maker : 1/20
Jeux Préférés : Erevan ^^
Date d'inscription : 29/07/2007

Détection du Héros par les ennemis (avancé) Empty
MessageSujet: Re: Détection du Héros par les ennemis (avancé)   Détection du Héros par les ennemis (avancé) EmptyMar 04 Sep 2007, 15:51

On peut avoir une ptite demo tout simple a copier/coller
-_- je sent que je vais me faire traiter de flemanrd par don...
Revenir en haut Aller en bas
Laugilus
Démocrate Usurpateur
Démocrate Usurpateur
Laugilus


Masculin
Nombre de messages : 577
Age : 32
Projet(s) en cours : Fusion Maker 1.0.0
Niveau Rpg Maker : Trop lent.
Jeux Préférés : FF X - KH - KH 2 - DQ 8 - Oblivion
Date d'inscription : 12/02/2007

Détection du Héros par les ennemis (avancé) Empty
MessageSujet: Re: Détection du Héros par les ennemis (avancé)   Détection du Héros par les ennemis (avancé) EmptyMar 04 Sep 2007, 16:20

Faignasse va.

>>>DOWNLOAD<<<
Revenir en haut Aller en bas
Laugilus
Démocrate Usurpateur
Démocrate Usurpateur
Laugilus


Masculin
Nombre de messages : 577
Age : 32
Projet(s) en cours : Fusion Maker 1.0.0
Niveau Rpg Maker : Trop lent.
Jeux Préférés : FF X - KH - KH 2 - DQ 8 - Oblivion
Date d'inscription : 12/02/2007

Détection du Héros par les ennemis (avancé) Empty
MessageSujet: Re: Détection du Héros par les ennemis (avancé)   Détection du Héros par les ennemis (avancé) EmptySam 15 Mar 2008, 23:50

Bon, je up. J'ai fais la découverte qu'il fallait faire pour achever définitivement le champ de vision. En effet, avec l'amélioration que je viens de trouver, je crois qu'on est arrivé au summum de la détection, ou pas loin en tout cas^^. Bon, avant que je ne me noie dans la modestie ;p , j'enchaîne par du concret.

Champ de vision ovale


Avant-propos :
Bon, oui, vous avez bien lu, le champ de vision est ovale. C'est à dire que l'ennemi aura un champ de vision comme-ci : Détection du Héros par les ennemis (avancé) 0803150816187111829687
Donc, avec ce champ de vision, le monstre ne peut pas voir derrière lui (sauf si vous passez très près de lui).
La vraie forme mathématique est une ellipse. Le champ de vision n'est maintenant que des mathématiques. Les explications ne sont pas vraiment intéressantes, et même dénuées d'intérêts (on est sur un forum de making et non de math). D'ailleurs "tout" est fait en script car il faut utiliser des racines carrés. C'est pourquoi je ne vais pas vraiment m'attarder sur les explications, et que je vais simplement vous dire en deux trois lignes comment ça marche. Puis je vous expliquerai clairement comment mettre ce système chez vous.

Les commandes/scripts :
Pour éviter le cas de conscience, je vais quand même donner quelques explications. Mathématiquement, une ellipse a une équation. Et c'est de cette équation dont on sert ici (l'équation bipolaire, pour ceux que ça intéresse [Don hypocrite] ). En gros, on calcule la distance entre l'ennemi et le héros, et on regarde grâce à cette distance et l'équation, si le héros est à l'intérieur de l'ellipse qui englobe l'ennemi.
Voilà, c'était pour les explications inintéressantes [Don hypocrite] .
Avant de vous exposer les commandes, je voulais préciser une petite chose. Vous pouvez régler approximativement la taille de l'ellipse, c'est à dire la largeur et la longueur (en carreau). Pourquoi approximativement ? Eh bien, c'est difficile à expliquer sans entrer dans les détails mathématiques [Don hypocrite] . En tout cas, la largeur et la longueur que vous préciserez seront inférieures (de peu) aux réelles dimensions.

Citation :
Conditions de déclenchement:
- Processus Parallèle

Commandes d'évènement:

<>Variable(s) [0074: Largeur] rendre égale à 6
<>Variable(s) [0075: Longueur] rendre égale à 10
<>Variable(s) [0073: Direction] rendre égale à Cet évènement --> Direction fixée
<>Script : v = $game_variables
: v[80] = $game_map.events[1].x
: v[81] = $game_map.events[1].y
: if v[73] == 2
: v[82] = v[80]
: v[83] = v[81] + v[75]
: elsif v[73] == 8
: v[82] = v[80]
: v[83] = v[81] - v[75]
: end

<>Script : v = $game_variables
: if v[73] == 4
: v[82] = v[80] - v[75]
: v[83] = v[81]
: elsif v[73] == 6
: v[82] = v[80] + v[75]
: v[83] = v[81]
: end
: v[74] = (v[74] / 2).ceil
: v[75] = (v[75] / 2).ceil

<>Script : v = $game_variables
: v[85] = (v[74]**2 + v[75]**2)**0.5
: v[85] = (v[85]*2).ceil
: v[86] = $game_player.x
: v[87] = $game_player.y
: v[88] = ((v[80]-v[86])**2 + (v[81]-v[87])**2)**0.5
: v[88] += ((v[82]-v[86])**2 + (v[83]-v[87])**2)**0.5
: v[88] = v[88].floor

<>Condition : si la variable [0088: Distance Héros-Monstre] est inférieure ou égale à Variable [0085: "Equation de l'ellipse"]
<>Interrupteur local A activé
<>
: Fin
<>

Vous remarquez que ce n'est presque que du script [Don hypocrite] . Eh bien on doit cela à deux choses : RMXP ne veut que des nombres entiers, donc pas de nombres à virgule (dans notre cas, c'est extrêmement gênant). Et la seconde chose est qu'on ne peut pas calculer de racine carré en événement...
Ensuite, pour les pros en programmation de ruby, ne m'arrachez pas les yeux si ce que j'ai écrit est maladroit [Don hypocrite] , après tout, la seule chose que je sache faire un ruby, c'est manipuler les variables [Don hypocrite] .

Comment l'utiliser ?
Eh bien, ce code doit se trouver dans l'événement qui possède le champ de vision, et cet événement doit être en processus parallèle.

Ensuite, on va procéder par éléments :
  • Ce système utilise les variables 73 à 75 et 80 à 88 incluses.
  • La variable 74 contient la largeur de l'ellipse. Modifiez sa valeur pour modifier la largeur du champ de vision de l'événement.
  • La variable 75 contient la longueur de l'ellipse. Tout comme la largeur, modifiez sa valeur pour modifier la longueur du champ de vision de l'événement.
  • Citation :
    v[80] = $game_map.events[1].x
    : v[81] = $game_map.events[1].y
    Ce numéro est l'ID de l'événement qui possède le champ de vision. (Pour connaître l'ID d'un événement, soit vous double-cliquez dessus, et l'ID est marquée en haut à droite de la fenêtre, soit sur la couche d'événement, cliquez une fois sur l'événement, et tout en bas à droite de votre écran, l'ID apparait juste devant le nom.) Il faut que vous remplaciez ce numéro par l'ID de VOTRE événement.
  • Si ces variables sont déjà prises par votre projet... eh bien soit vous les libérez, soit il faut remplacer le numéro des variables de tout le script. C'est à dire que vous donnez un autre numéro aux variable 73, 74 et 75. Dans le script, lorsqu'il y a : v[X], cela veut dire qu'on utilise la variable X. Donc si vous voulez que la variable qui contient la largeur de l'ellipse soit la variable 5, à la place de v[74], il faudra mettre v[5], et ce, dans tout l'événement.
  • Si plusieurs événements qui utilisent le système sont présents dans la même map, vous devez faire de nouvelles variables pour chaque nouvel événement. Vous devez faire de nouvelles variables pour remplacer les variables 73 à 75 et 80 à 88 incluses.
  • Enfin, faites une nouvelle page dans l'événement, en mettant comme condition : Si l'interrupteur local A est activé. Et dedans, vous pouvez mettre les commandes que vous souhaitez faire lorsque le héros est détecté.


Et voilà [Don hypocrite] . J'espère que cela servira à quelqu'un^^.
Revenir en haut Aller en bas
Contenu sponsorisé





Détection du Héros par les ennemis (avancé) Empty
MessageSujet: Re: Détection du Héros par les ennemis (avancé)   Détection du Héros par les ennemis (avancé) Empty

Revenir en haut Aller en bas
 
Détection du Héros par les ennemis (avancé)
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Vitesse du heros

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
RPG Fusion :: LUDOTHEQUE :: Temple du Savoir :: Systèmes-
Sauter vers:  
Ne ratez plus aucun deal !
Abonnez-vous pour recevoir par notification une sélection des meilleurs deals chaque jour.
IgnorerAutoriser