Les forces

Je vais tenter de vous expliquer plus en détail ce petit bijou parfois mal compris. Je vous conseil de faire les même exemples que moi pour bien vous rendre compte de ce qui ce passe. Bonne lecture.

Vous aurez besoin de ces images :

Perso Sol

Faites un clic droit et choisissez Enregistrer l'image sous et n'oubliez pas de contrôler vos masques de collisions.

Table des matières :

  • I) Présentation des forces.
  • II) Le fonctionnement.
  • III) Un exemple d'utilisation.
  • IV) A propos du tutoriel.

Présentation des forces

Je vais tout simplement citer le wiki :

Il s'agit de flèches imaginaires, qui “poussent” l'objet dans une direction. Enfin, vous pourrez indiquer l'amortissement.
A chaque seconde, cette force sera multipliée par ce chiffre : Si vous souhaitez que la force s'applique indéfiniment, mettez 1.
Si vous souhaitez qu'elle disparaisse immédiatement après avoir un peu poussé l'objet, mettez 0.
Ce dernier cas est essentiellement utilisé quand l'objet doit être bougé continuellement, par exemple quand le joueur appuie sur une touche.

Nous allons commencer par mettre les bases. Flèches imaginaires, je dirai oui et non. En effet 4ian se base sur la physique et donc en physique tout le monde sait que les forces appliquées à un objet sont symbolisées par une flèche ou plutôt un vecteur (En savoir + sur les vecteurs). Mais là on parle bien de force vous allez voir que les forces ne ressemblent pas toujours à des flèches comme sur un dessin.

L'amortissement est aussi important à retenir surtout cette partie “A chaque seconde, cette force sera multipliée par ce chiffre” car c'est ce chiffre qui va définir la durabilité de votre force.

Nous allons aussi mettre au clair les termes que je vais utiliser :

  • Force : Effet de mouvement permettant de déplacer notre objet
  • Direction : Sens d'application de la force.
  • Durabilité : Durée de vie de la force.
  • Puissance : Longueur en pixel de la force, pour nous elle sera toujours positive car elle ne dépend pas de la direction (qui elle peut être négative).

Un exemple : force de - 200 en y amortissement 1

Direction = y en négatif (donc je vais vers le haut de l'écran, voir image des repères)
Durabilité = ici infinie car l'amortissement est à 1 (voir def)
Puissance = 200 pixels par seconde

Une force est définie par une direction, une durabilité et une puissance. Attention, En ce qui concerne la direction le repère n'est pas le même qu'en math voyez plutôt :

IMAGE REPERE

Le fonctionnement

Il faut bien assimiler la théorie pour passer à la pratique. Tout d'abord il faut bien comprendre que les forces appliquées sur un même objet s'additionnent. Autrement dit il faut éviter de faire ça :

IMAGE PAS BIEN

Pourquoi ça ? En fait il suffit d'appliquer deux principes cités plus haut :

  • Les force s'additionnent.
  • “À chaque seconde, cette force sera multipliée par ce chiffre”.

Autrement dit ici, nous avons notre Perso qui avance vers le haut de l'écran de manière continue.

Oui mais si j'ai envie qu'il avance continuellement ?

Il ne faut pas faire comme ça. Car ici il y a un gros problème, non seulement le Perso ne s'arrête jamais, mais en plus au moment où l’évènement est lu (C'est à dire quand la touche Up est enfoncée), on ajoute encore une force équivalente. Il faut savoir que les évènements sont lus de manière continue et en boucle : votre ordinateur va lire du début à la fin de votre code sans arrêt, et si l’évènement est “vrai” alors il applique le code. Je me mets à la place de l'ordinateur pendant quelques secondes :

  • Je commence
  • Evénement “touche Up enfoncé” J'applique la force -50 en y à l'objet
  • Fin
  • Je commence
  • Evénement “touche Up enfoncé” J'applique la force -50 en y à l'objet
  • Fin
  • Je commence
  • Evénement “touche Up enfoncé” J'applique la force -50 en y à l'objet
  • Fin
  • Je commence
  • Evénement “touche Up enfoncé” J'applique la force -50 en y à l'objet
  • Fin
  • Je commence
  • Evénement “touche Up enfoncé” J'applique la force -50 en y à l'objet
  • Fin
  • Je commence
  • Evénement “touche Up enfoncé” J'applique la force -50 en y à l'objet
  • Fin

Et à ce moment là votre perso a déjà filé “vers l'infini et au delà”, car ce n'est pas une puissance de 50 qui est appliquée mais une puissance de 50 + 50 + 50 + 50 + 50 + 50 autrement dit une puissance de 300 pixels par seconde. 8-O

Oui mais si j'appuis seulement une fois sur la touche Up ?

En fait la simulation que j'ai faite, c'est un seul appui. Votre ordinateur est beaucoup plus rapide que vous, pour lui vous êtes resté appuyé donc il applique le code tant que c'est “vrai”. Ceci dit, si vous voulez faire que votre perso n'avance que quand c'est appuyé, mettez l'amortissement à 0 ce qui donnera une durabilité à votre force quasi inexistante, comme ça elles ne s'additionneront pas. Autre chose importante à retenir, c'est la notion de pixel/seconde (p/s). En appuyant sur la touche, ne vous attendez pas à voir votre perso bouger de 50 pixels. On parle bien de force et pas de “déplacement aux coordonnés”.

Comment faire pour dire à l'ordinateur de ne l'appliquer qu'une seule fois avec un amortissement de 1 ?

Je vous propose une variable par exemple ou un timer. Tout dépend de votre besoin.

Je prends l'exemple d'un timer car nous souhaitons rajouter une force de - 50 en Y toutes les secondes au minimum :

IMAGE MouvTimer

Bien nous avons réglé notre problème d'appui continue. Mais ce n'est pas fini. J'ai dit que les forces s'additionnaint. C'est vrai, mais pas uniquement dans la même direction. En fait si j'avais voulu être précis j'aurais dû marquer :

Un exemple : force de 0 en X - 200 en Y avec un amortissement 1

Direction = x nul et y en négatif (donc je vais vers le haut de l'écran)
Durabilité = ici infinie car l'amortissement est à 1 (voir def)
Puissance = 200 pixel par seconde

Nous allons tester ça de suite. Bien sûr nous restons avec notre exemple d'amortissement à 1 qui donne une durabilité infinie, car c'est avec ce dernier que nous avons le temps de voir ce qui ce passe. Pour cela nous allons ajouter à notre objet une force de 50 en X 0 en Y avec un amortissement 1, ensuite faites comme pour la précédente force (le timer et la touche). Je vous propose ça :

IMAGE 2FORCES

Que cela soit clair, le but de la manœuvre est de pouvoir ajouter une force en X, en aucun cas notre perso tournera sur lui même. Au pire il filera à une vitesse de 1000 p/s vers X mais c'est tout. Si c'était le but on aurait dû utiliser la force par angle et modifier l'angle. Mais si vous comprenez ce tuto vous serez capable de faire ça, pour un jeu de voiture par exemple.

Je pense que c'est fini pour le fonctionnement, nous allons passer sur une toute petite mise en pratique, qui va me permettre d'aborder le dernier point avec vous.

Un exemple d'utilisation

Les force s'additionnent, ça c'est bon c'est assimilé. Mais que donne ces deux forces :

force de 0 en X - 200 en Y avec un amortissement 1
force de 0 en X + 200 en Y avec un amortissement 1

Vous pouvez tester si cela vous chante avant de me donner votre réponse :-)

Quoi ??? Mais, mon perso est bugué ?

Non c'est normal, si vous êtes dans ce cas là :

IMAGE ANNULATION

Qu'est ce qui se passe ? Regardons ensemble.

Une force de - 50 en y est appliquée MAIS une force de 50 en y aussi. Autrement dit on monte de 50 et on descend de 50, donc 50 - 50 = 0 votre perso ne bouge pas, donc le comportement est normal, on appellera ça l'annulation des forces.

Et justement maintenant que ce point est vu, nous allons l'utiliser =) Nous allons simuler une gravité. Normalement avec tout ce que l'on a vu, ça ne devrait pas vous poser problèmes.

Commençons par mettre par écrit ce que notre “gravité” doit faire. Comme toutes gravités qui ce respectes, elle doit attirer les objets soumit à elle, vers le sol. Et une fois au sol l'objet ne doit plus continuer de descendre. Bien nous avons un bon début. Ensuite cette gravité doit avoir une force en Y, je vous laisse le soin de choisir la puissance. Il nous faudra un timer pour la contrôler. Nous appliquerons la gravité toutes les 0.1 secondes, donc 10 fois par secondes.

Je pense que nous sommes bon. Mettons ça en application.

IMAGE gravité 1

Par habitude je ne met jamais d'accent sur mes variables, timers etc …

Bon nous avons notre force il nous faut maintenant notre sol et gérer l'arrêt de notre perso. Faite un truc du genre :

IMAGE exemple position

Élargissez le sol c'est pas grave ce n'est qu'une barre noire.

Bien la collision maintenant. Il faut que le perso s'arrête quand il touche le sol. Bon je ne vous fais pas tomber dans le panneau ce n'est pas un cours sur les collisions (En savoir + sur les collisions). Si vous écrivez :

Perso est en collision avec sol -> arrêter perso

Votre perso ne bougera absolument plus, car du moment qu'il est en collision il s'arrête :-| Nous allons utiliser une variable “Saut” que l'on met de base dans notre objet Perso. Nous devons donc arrêter le Perso seulement si il “saute” ou qu'il est de base en l'air. Donc nous allons faire en sorte de savoir si notre perso est en l'air ou pas et d'appliquer la gravité seulement si il n'est pas au sol :

IMAGE Gravité 2

Sur notre code actuel, notre Perso ne s'arrêtera pas. En effet une force avec une puissance x fois 30 est appliquée x étant le nombre de dixième de seconde. Il faut donc l'arrêter et dire à notre ordinateur que notre Perso ne saute plus. Nous allons donc gérer l'arrêt sur le sol.

IMAGE Gravité 3

Notez aussi que j'ai fait “séparer les 2 objets” car le timer est à 0.1 seconde, il se peut que le Perso soit un peut DANS le sol. Cette action nous permet de le mettre correctement dessus, et ce, sans que le joueur sans rende compte.

Nous arrivons à la fin, il nous manque plus qu'a faire sauter notre Perso. Il faut lui appliquer une force en - Y la puissance est selon votre envie. Naturellement nous ne sautons pas quand nous sommes en l'air hein !

IMAGE Gravité 4

Plusieurs points sur ces quelques lignes de code.

  1. La force appliquée est obligatoirement en durabilité infinie, si non notre Perso ne bougera même pas ou très peu.
  2. Pourquoi remettre “saut = 1” alors que, si notre perso est en l'air il a sa variable à 1 ?

Tout simplement le fait que votre ordinateur est beaucoup plus rapide que vous. Essayez de ne pas mettre ça et restez appuyé sur la touche Up. Votre perso s'envolera. Pourquoi ? Car entre le moment où il redescend et le moment où il remonte il est un peu dans le sol (C'est à dire pendant l'action de séparation). L'ordinateur, extrêmement rapide, comprend qu'il doit appliquer une force de 300 de puissance tant que le Perso est dans le sol, soit peut être 5, 10, 15 fois :-|

Ce que nous voyons pas à l'œil nu ne veut pas dire que ça n'existe pas ;-) Donc gardez bien ça en tête pour vos projets.

A propos du tutoriel

Ce tutoriel vous est proposé par Thaomas.
Vous pouvez me contacter par Mp ou en créant un nouveau post sur le forum de GD http://www.forum.compilgames.net/