
English: 
hey guys what's up Ombarus here and
this week we're talking about particle
systems in Godot and visual effects but
before I get started on that for the
people who are following me I just
wanted to explain a little bit why I've
been working on this this week I've been
thinking a lot about what's gonna be the
next step and what my priority should be
and my conclusion was that there's two
things I need to work on : the game design
like creating more items
implementing some more features trying
to figure out exactly what the story is
gonna be. Or working on like the art side
of things the look and feel the

French: 
Hey Tout le monde, Comment allez-vous ? Ombarus ici et cette semaine je vous parle de Système
de Particule dans Godot et d'effet visuel. Mais avant de commencer, pour
ceux qui me suivent, je voulais juste expliquer un peu pourquoi
J'ai décider de travailler la-dessus cette semaine. J'ai beaucoup réfléchi à ma
prochaine étape et ce que mes priorités devraient être et ma conclusion c'est qu'il y a deux
chose que je dois faire : Le Game Design comme créé plus d'item
ou implémenter de nouvelle fonctionalité ou décider de l'histoire
Ou bien, travailler sur le côté artistique et le style du jeu

French: 
le Design Graphique et tout ca et je me suis dit que c'était probablement ma plus haute
priorité pour l'instant. Je veux engager un artiste pour faire un peu de travail
mais avant je dois être certain que tout est en place pour
pouvoir intégré les éléments qu'un artiste pourrait me
fournir et je ne veux pas avoir à le refaire 10 fois alors
je me suis mis à réfléchir à comment je pourrais faire des animations parce que présentement
le jeu est pour ainsi dire statique, tout ce passe en un instant
et ca ressemble plus à un jeu de table où rien ne bouge et j'ai pensé
ok, commençons avec des animations de base alors si on regarde dans Godot
la première chose que j'ai essayé c'est d'implémenter un AnimatedSprite car je voulais
juste une animation de base mais je n'ai pas réussi à comprendre comment
ce noeud fonctionne. Tout ce que j'ai pu comprendre c'est que ca me prend soit une texture

English: 
design of the graphics and all that and
I figured this is probably my highest
priority right now and I want to hire
some artists to do some of the work but
before I can do that I have to make sure
that I have everything in place to be
able to integrate the art assets that
whatever artists would be able to
produce for me and I don't want to have
to redo it like 10 times so I got into
thinking I need to have some way of
doing animations because right now the
game is just basically static everything happens in in a fraction
of a second and then you just have like
this static game board and so I thought
yeah okay let's start with basic
animation so if we look into Godot the
first thing I tried to do was implement an
animated sprite I thought I'm just gonna
do basic spreadsheet animation but I
couldn't quite figure out how the
animated animated sprite work I figured
I kind of need either a separate texture

French: 
par image de mon animation ou je dois créé une sorte de ressource d'atlas
pour mes images et ca me semblait un truc que je ne veux pas faire pour chaque
animation. Ca me semblait trop de travail
Alors j'ai trouvé le noeud AnimationPlayer et
il est vraiment cool parce qu'il permet d'animation n'importe quel
propriété d'un noeud alors j'ai simplement garder mon vaisseau qui utilise ma
texture atlasser et si j'attache
l'animationPlayer a mon Sprite je peux simplement mettre une clef d'animation sur la Region
de ma texture et c'est ce que j'ai fait ici. Si vous allez ici and dans
animation vous pouvez voir chacune de mes clef d'animation et j'ai juste mis

English: 
for every frame of my animation or I
have to create like a resource file for
every frame and that seemed kind of like
something I didn't want to do for every
animation I have in the game it seemed
like too much work
so then I looked into this animation player and the animation
player is actually really cool because
it allows you to animate basically any
property from any node so I just kept my
basic probe here that's referencing my
Atlas texture here and then if I attach the
animation player to my sprite then I can
just keyframe the region rect from the
sprite sheet and that's what I did just
here. So if you go here you go into
animation and you can see every one of
my keyframes here and I just set it so

English: 
that it doesn't interpolate so it's just
an instant transition and you can create
as many animation as you want and so for
example I created this test animation
and as you can see it makes my little
ship move a little bit and it's really
cool and it's fairly easy to set up
because the only thing I have to do is
select the frame of the animation I want
and then I click on my probe here so
that I have the region here and in the
region I can just like scroll to where I
want and I can select for example some
kind of, let's say I want this frame here
and then I keyframe this and then it's
part of the animation now and it's that
easy just have to do it for every frame
I thought this is a process I can
work with so if I ask an artist to
generate some sprite sheets with
some animations and then I can just
create the animation really easily with

French: 
l'interpolation a "Discreet" pour que l'interpolation soit instantané et il est possible
de créé autant d'animation qu'on veut, par exemple j'ai créé cette animation de test
et ca fait bouger mon petit vaisseau et c'est vraiment
Cool et pas mal facile parce que la seule chose que j'ai à faire c'est
de choisir la frame de mon animation et quand je click sur mon vaisseau ici
j'ai l'option de région et dans région je peux aller où
je veux et sélectionner par example, disons que je veux cette image ici
et je click "Keyframe" et maintenant cette image fait parti de l'animation et c'est
super facile et il suffit de le faire pour chaque image et c'est un processus avec
lequel je peux travailler si par example je demande à un artiste de généré des feuilles d'animation
avec plusieurs animation je peux facilement les décomposer dans

French: 
l'animationPlayer et utiliser l'animationPlayer pour lancer n'importe quelle
animation que je veux. Pour l'instant je n'ai que cette animation de test mais
je pourrais avoir "immobile", "virage", "tirer", tout ce que je veux. Ce que j'ai fait ensuite
j'ai pensé, ok, les animations de base, c'est facile. Je veux essayer un truc
un peu plus complexe alors voyons comment je pourrais faire quelque VFX, peut-être même des particules
et comme ca, j'ai commencé à investiguer
comment Godot utilise et anime des système de particle et ce genre de chose. D'abord
j'ai chercher en ligne pour voir s'il
y a de bon tutorial pour les système de particules avec Godot.Ce que je voulais
c'est surtout des animations de tir et je me suis dit que j'avais besoin d'un genre de laser
ou quelque chose comme ca et je un truc de base

English: 
an animation player and then using the
animation player I can trigger whatever
animation I want so like right now I
only have this test animation but I
could have like idle, turn, shoot, anything
I want the next thing I did is I thought
okay so basic animation seems fairly
easy now I want to try to do something a
little bit more complicated so let's go
into like some VFX maybe particle
systems and
like that so I started investigating how
Godot handles particle animations and
things of that nature and the first
thing I thought I'd do is research a
little bit online so I figured is there
any good tutorial on Godot for
particles and what I wanted to do is
more the weapons animation and so I
thought I need some kind of beam weapon
so for the lasers and stuff like that
I want some basic beam thing

French: 
alors j'ai chercher mais je n'ai rien trouvé de bien spécifique pour Godot
sur Youtube. J'ai par contre trouvé deux très bon vidéos
sur Youtube, et je vais les liers dans la description, ils bien sur pour Unity mais
les principes de base s'applique et je trouvais ca très bien comme concept
J'aime beaucoup ce qu'il fait dans son vidéo et il explique bien comment s'y prendre
dans Unity alors tout ce que j'avais à faire c'est reproduire le tout
dans le système de particule de Godot. Malheureusement, il semble que Godot
ne soit pas encore tout à fait au point la dessus. J'ai bien chercher mais
je n'ai pas réussi à faire des trainers comme dans le vidéos
et je n'ai pas réussi à faire des trainers dans Godot mais au bout de la ligne

English: 
and so I started looking but I couldn't
find really a Godot specific particle
how to do particles kind of YouTube
video I did find two very nice videos on
YouTube and I'll put the link in the
description of course it's for unity but
the basic principle applies and it's a
really kind of quite nice concept so I
really like the effect that this guy was
using and he was explaining how to do it
in unity and all I had to do is try to
figure out how I can replicate
that with Godot's particle system
The thing is, it seems that Godot
particle system is in need of some work
I ended up looking at stuff I couldn't
make trail he's using trails to do this
animation and I couldn't quite figure
out how to do proper
trails in Godot but in the end I

English: 
managed to do it with kind of a mix of
multiple things so first I went online
to try to look for some graphics I could
use for my weapons visual effects and I
found a bunch of things that looked kind
of okay you know I just wanted something
that looked nice and I decided to go
with this thing here that looks kind of
like a laser and so fired up Krita and isolated the thing and then
exported that as a simple texture for my
visual effects and then what I ended up
doing is that I thought this is a laser
so it should stretch so I created the
basic script that will just take
whatever original position
I set the object at and then will scale
the sprite to make it stretch from
its current position to the original
position what happens is it gives

French: 
j'ai réussit avec un mélange de plusieurs chose. D'abord je suis aller en ligne
pour trouvé une image que je pourrais utiliser pour mes effets et
j'ai trouvé plusieurs images pas mal, je voulais juste quelque chose de pas trop
horrible et j'ai décidé d'utiliser cette image qui ressemble à un genre de
laser et j'ai donc utilisé Krita pour isoler cet élément et en faire une
texture toute simple pour mes effets visuel et ensuite, la façon que j'ai trouvé
pour faire mon laser c'est de l'étirer. J'ai créé un
script de base qui prend la position d'origine de l'objet
et il change le "scale" pour l'étirer entre
ca position actuelle et la position original. Ce que ca donne

French: 
c'est quelque chose comme ca et ca donne un résultat pas mal. Ensuite
j'ai fait un autre script dans la racine de mon effet
et ce script est en fait un script que je veux générique
pour lancer un effet et ca me permet de spécifier plusieurs
paramètre comme la durée de vie, la vitesse du projectile et sa cible de cette
façon, dans le jeu, il me suffit de programmer la cible et mon effet s'occupe
du reste et je peux jouer avec les paramètres puisque c'est une
scène évidemment c'est comme un préfab alors je peux le ré-utiliser pour toutes
mes armes dans le jeu et ca reste plutôt simple comme vous pouvez le voir
il n'y a même pas de système de particule, j'ai simplement animé le sprite
ici mais ca fonctionne bien. Maintenant que j'ai réussi à faire
ça, allons y au maximum, je veux être sûr

English: 
something kind of like this now that it
looks kind of good so the next thing I
had to do was that I had to make another
script so I created another root and
this script is actually kind of a
generic way of starting effects that I'm
thinking of implementing for the game
and this allows me to specify various
properties like the time to live the speed
of the projectile and its target and so
in the game when I set the target it's
just gonna go at that speed to that
target and so I can play a little bit
with the settings and since it's a
scene of course it's kind of like a
prefab so I can reuse this for every
weapons I have in the game and all that.
It's stayed fairly simple as you can see
there isn't even the particle system
it's just basically animating the sprite
here but it does the work so then I
thought okay now that I managed to do
that
let's go full blown I want to make sure

French: 
que je peux faire quelque chose de complexe. Je n'arrive pas à retrouver le vidéo
mais j'ai vu un vidéo très bien de quelqu'un qui tirait des missile qui partait
par le côté et faisait un arc de cercle pour revenir sur la cible
puis exploser. Après plusieurs jour de recherche
sur les système de particule et autres, je me suis dit : "ok, je pense que je
peux reproduire ça, j'ai une idée de comment m'y prendre"
Alors c'est la prochaine chose que j'ai mis en place. Comme vous pouvez le voir
c'est déjà pas mal plus compliquer. Il y a pas mal de
noeud et le premier que vous voyez est actuellement un sprite
avec une animation qui joue lorsqu'on fait feu. C'est seulement le moteur qui s'anime et puis
j'ai créé ce système de particule comme une sorte de trainer de fumé pour la chose
et le plus gros morceau c'est que quand on tire, je ne veux pas que le truc

English: 
that I can do something really
complicated and I can't find the video
again but I saw a really nice video of
someone using missiles that would shoot
from the side and do kind of a like an
half circle and then go back to the
target and hit them and boom they would
explode and so after spending days
researching particle systems and all
this kind of stuff and figuring out the
movement I thought okay I think I have
an idea of how to do that and that was
the next thing I implemented is this
little thing here so as you can see it's
a little bit more complicated and I have
quite a bit of stuff going on in the
nodes and the first thing is I have this
sprite here that actually has an
animation that will play when you shoot
so it's just the engine going and then I
created this particle system as a kind
of trail of smoke for the thing
and the big part was that I
needed the thing when I shoot it I don't

English: 
want it to go straight to the target I
wanted to go in an arc and then hit the
target and so the thing I ended up doing
is that I have this script here and
basically it works like the laser stuff
you have like a start method that takes
a target and you have some parameters
you can tweak like how big the circle
you want and stuff like that but instead
of going straight for the target it's
gonna calculate like a circle and then
it's gonna animate
the angle so it's gonna calculate a 180
degree and you need to hit the target in
one second so I need to do like one
degree per 180th of a second and then
every frame it's gonna move the sprite and
it's particle system along that path and
it also has to calculate the tangent but
it's pretty cool because Godot
provides you with already a method that
calculates the tangent for you so from

French: 
se déplace en ligne droite mais qu'il décrive un arc de cercle pour finalement toucher
la cible. Ce que j'ai finit par faire c'est avec le script ici et
ca marche beaucoup comme le laser, avec la méthode "Start" qui prend
une cible en paramètre et des paramètres que j'expose comme la taille du cercle
et des trucs du genre mais au lieu de s'en aller directement sur la cible
le script calcul un cercle et il anime
l'angle. Par example pour 180 degré et si la cible doit être atteinte en
une seconde alors il doit avancer le missile de un 180e de seconde et
à chaque frame il calcule le mouvement du sprite et de son système de particule le long du chemin
il doit aussi calculer la tangente mais ce qui est bien avec Godot
c'est qu'il y a déjà une méthode qui retourne la tangente pour moi alors

English: 
the radius of the circle I have
the tangent so I know how to rotate my
missile and then it just moves like this
and the effect is pretty nice
for
testing I have this debug here that I
can put to true and then I can just
run this scene as a standalone and when
I click - as you can see it goes to
where my mouse is so bang and it does
half circles like that and the further
it is the bigger the circle and the
shorter it is the shorter the circle but
it's always in the same amount of time
which I can play with by going like for
example I could say okay now I want you
to slow down so it would slow down like
such for example it's very slow now so
after I got some weapons effect going on
it was kind of a little bit strange that

French: 
du radius du cercle, j'ai la tangente et je sais de combien je dois tourné mon
missile et le déplacer. L'effet est pas mal.
Pour tester j'ai cette option de débug ici et
quand je le met a "vrai" je peux rouler la scène toute seule et
quand je click dans l'écran on voit qu'il pars vers la position de ma souris en faisant
des demi-cercle et le plus loin la cible, le plus grand le cercle et plus proche la cible
plus petit le cercle mais toujours dans le même temps
par exemple je pourras dire "ok, je veux que ca
prenne plus de temps" et je peux le ralentir comme ca et maintenant c'est tout lent
Maintenant que j'ai des effets d'arme c'est un peu étrange que

French: 
les armes touches mais il n'y a rien qui se passe alors je me suis dit, faisons quelque chose
de différent maintenant que les armes fonctionnent et que je peux animé mes sprites
faisons un effet quand un vaisseau se fait toucher ou plutôt
quand il meurt. Donc le dernier effet que j'ai essayer de faire moi-même comme faux-artiste
c'est une explosion et en fait c'est vraiment juste un paquet de particules
et il n'y a rien de très spécial mais c'est les trois effets que j'ai fait et la dernière
chose que j'ai fait c'est actuellement intégré ces éléments dans mon jeu et j'ai
eu un peu de difficulté ca il n'y a pas vraiment de système pour attendre
la fin d'une animation et je ne veux pas que mon jeu dépende des animations comme dans beaucoup de jeu
par exemple en général le joueur cour à la vitesse de son animation ce qui fait que

English: 
the weapons would hit but nothing would
happen so I thought let's do something a
little bit different okay weapons are
working I can animate my basic sprites
so let's do an effect
when you get hit actually when a ship
dies and so the one last effect I tried to
implement by myself as a budding artist
is the explosion here and this is just a
really big bunch of particles
there's nothing special going
on and with those three effects the last
thing I needed to do is actually
implement them in my game and I ran into
a bit of an issue there because the game
doesn't really have anything to wait for
animation and I didn't want the game to
be based on the animation like you know
usually for example the player runs at
the speeds of its animation so when he

English: 
moves the animation dictates how
fast he moves forward and I ran into a
little bit of an issue here because my
game should not be based on the
animation the animation should not
dictate any of the behavior so I needed
to wait on the animation but I don't
want the animation to actually trigger
some events or something so for example
I don't want the explosion to be
responsible for despawning the
object in the scene I want the object in
the scene to de-spawn by itself whether
or not it has an animation and to do
that I played around a little bit what I
ended up doing is that first of all I
created this new behavior so I have this
animation behavior and in the JSON I
added this animation component and for
now I just have some random tags like
shoot for the shooting animation and
when the ship gets destroyed I have this

French: 
quand il se déplace c'est l'animation qui décide à quelle vitesse et c'est
un peu un problème car mon jeu ne devrait pas être basé sur
l'animation, l'animation ne doit pas décider du comportement alors j'ai du
attendre la fin de l'animation mais je ne veux pas que ce soit l'animation qui lance
des événement. Par example je ne veux pas que l'explosion soit responsable de
détruire le vaisseau. La scène doit pouvoir détruire le vaisseau
avec ou sans animation et pour
faire ca j'ai fait quelque essaie et ce que j'ai décider de faire c'est d'abord
de créé un nouveau comportement. J'ai ce comportement d'animation et dans les JSON
j'ai ajouté un élément avec quelque nom qui n'ont pas vraiment d'importance pour l'instant
par example pour tirer j'ai "shoot" et quand un vaisseau est détruit j'ai "destroyed"

French: 
je ne sais pas si je vais le garder comme ca,
l'avantage avec du JSON c'est que je peux le changer facilement quand je veux
tant que je n'ai pas des millier à changer ca ne devrait pas être trop
un problème et dans le système je m'enregistre sur des événement spécifique
que je sais vont vouloir jouer des animation et le système
est responsable de valider s'il y a un élément JSON d'animation et de charger la scène
et de l'instancier et d'appeler la méthode "Start()" comme vous avez vu tantôt
dans mon missile cette méthode qui prend en paramètre la position de la cible
et ensuite il fait tout par lui-même et ca fonctionne bien mais
le problème que j'ai vu ensuite c'est que je doit trouvé une manière de synchronizer
mon missile par example jouait bien mais le vaisseau disparaît avant

English: 
destroyed animation I don't know if
I'll keep it like that I mean the
advantage with it being JSON is that I
can just change it whenever I want as
long as I don't have like ten thousand
to change it shouldn't be too much of a
problem and in the animation what I have
here is that I register on some specific
events that I know I'm going to want to
play animation and the system is
responsible for checking if there's an
animation component and loading the
scene, instantiating it and doing a
start if it needs to like you saw in my
missile and my weapon I have this start
method that takes a position and then it
does all its shit by itself and that's
working pretty well but the thing
is when I did that I realized that there
was some issue with synchronization for
example the missile would launch
but the ship would disappear before the

English: 
missile had reached and like I said I
don't want my stuff to be based on the
animation but at the same time I have
kind of no choice some animations are
just chained together when you're
shooting first you want the animation of
the shoot then you want the explosion
and then you want the ship to de-spawn
it's just like it has to be able to
chain these things together and I'm not
quite sure how I'm going to do it for
now what I decided to do is that I
created this boolean wait_for_animation
and I have now new events on_wait_for_animation
and on_animation_ done and
so what happened is that when the
animation system triggers an animation
that it knows that we should kind of
pause the game for the animation to play
out it's gonna trigger the on wait for
animation and for example in my level
loader which is responsible for
unloading sprite, on request object
onload for example what happened is that

French: 
que le missile touche sa cible et comme j'ai dit, je ne veux pas que mes trucs
dépende de l'animation mais je n'ai pas le choix d'avoir une
chaîne d'une manière ou d'une autre quand tu tires, d'abord
l'animation de tir, ensuite l'explosion et finalement l'objet est détruit
Il faut absolument pouvoir enchaîner tout ça et
je ne suis pas sûr de la meilleure façon mais pour l'instant j'ai décidé
de créé cette condition wait_for_animation et j'ai deux nouveau événement on_wait_for_animation
et on_animation_done et ce qui arrive c'est que
le système d'animation lance une animation qui doit bloquer le
jeu, il émet le "OnWaitForAnimation"
et par example dans mon levelloader qui est responsable de
détruire les sprite, dans OnRequestObjectUnload" par example ce qui se passe

English: 
now it does if wait for animation is
true then it's gonna yield until it gets
the on animation done callback and  of course it
connects to the on wait for animation
and on the on_animation_done and
these events basically they just
set some boolean here and I did the
same thing in the animation actually so
that for example I first trigger the
OnShotFired and then if for example
the object gets destroyed then before
playing the explode
it's gonna wait for the shot fired
callback to be done by doing the on
animation done callback and the
On AnimationDone callback is done by the
missile itself for example here when the
process is done and the TTL is over the
current time then it's gonna free itself

French: 
c'est que maintenant si WaitForAnimation est vrai il va faire un "Yield" jusqu'a ce qu'il
recoivent le signal AnimationDone et bien sûr
il se connect a mes événement OnWaitForAnimation et OnAnimationDone et
ces événement active ou désactive un booléen et
il se passe la même chose dans mon comportement d'animation par example il lance d'abord
OnShotFired et si par example, l'objet doit être détruit alors avant
de jouer l'animation d'explosion il attend que l'animation de OnShotFired
soit finit en attendant le AnimationDone
et l'événement AnimationDone est lancé par le missile lui-même par example dans
le script, quand le temps est écoulé il va se détruire

French: 
et lancer le signal OnAnimationDone et c'est comme ca que j'ai couvert
la plupart de mes besoins en effet visuel. Je ne sais pas ce que vous en pensez mais je pense
que c'est pas si mal. Laissez moi savoir ce que vous en pensez dans les commentaires
est-ce que je vous ai aider à figurer vos effects visuel ou avez vous
des trucs à me donner ? je serais plus qu'heureux de recevoir vos commentaires mais pour l'instant
ce sera tout pour aujourd'hui, merci d'avoir écouter et j'espère vous revoir dans mon prochain épisode.
 

English: 
and it's gonna trigger the on animation
done and that's how I covered most of my
visual effects needs I think I don't
know what you guys think. I think it
looks fine let me know in the comment
what you think and if I've been an
inspiration if you figured out how to do
your own visual effects or if you have
another trick I could use I'd be more
than happy to hear about it but for now
that's gonna be it thank you guys for
listening and see you guys in my next
episode bye
