Les différents postes de programmeur

Hello everybody,

peut-être que certain-es d’entre vous ont décidés de poursuivre leur aventure dans le monde du GameDev de manière professionnelle dans les années à venir. Autant on retrouve souvent le cas du développeur seul qui remplit tous les rôles, autant dans une grosse entreprise on a plutôt tendance à bien séparer les tâches face à la complexité du projet. J’ai pu remarquer que les différents profils de développeur recherché n’était pas forcément connu par les jeunes développeurs, voici donc une liste (non exhaustive) des différents métiers de programmeurs au sein d’un grand studio de développement.

Pour la liste suivante, je me suis inspiré des différentes offres d'emplois trouvable sur le site de l'AFJV.
Vu que les termes anglais sont très utilisés même dans notre pays, j'ai tendance à les préférer aux termes français.

Gameplay Programmer

Rôle : Implémente le gameplay du jeu. C’est lui qui s’occupe d’ajouter les interactions avec le joueur et les différentes mécaniques de jeu. C’est en général à ce développeur que l’on pense lorsque l’on parle de programmeur de jeu.

Techno : C++ (+ Lua) / C# (avec ou sans moteur du style Unity/Unreal)

Skill : Programmeur polyvalent, il peut changer de moteur rapidement et a (de préférence) des connaissances en Game Design.

Engine Programmer

Rôle : Développe le moteur du jeu. Cela peut être un moteur fait à la main par l’entreprise ou un moteur connu comme Unity/Unreal dont le code source aurait été acquis par la société.

Techno : C/C++

Skill : Programmeur EXTRÊMEMENT polyvalent, avec des connaissances allant du Hardware des consoles de jeux jusqu’à de la conception logicielle très poussée, ce poste est souvent vu comme le plus complexe et c’est rare de voir des débutants l’occuper.

Graphics Programmer

Rôle : Spécialiste de la programmation GPU, il s’occupe de la création de shaders et du rendu visuel offert par le moteur développé par les Engine Programmer.

Techno : C++ (avec OpenGL/Direct3D et GLSL/HLSL)

Skill : Parfaite connaissance des GPU et des différentes API graphiques. Sait créer des shaders complexes. Excellent niveau en mathématiques.

Audio Programmer

Rôle : S’occupe de toutes les fonctionnalitées lié au son au sein du moteur développé par les Engine Programmer (comme la spacialisation du son au sein d’une scène 3D).

Techno : C++ (avec OpenAL ou équivalent)

Skill : Connaissance pointue en manipulation du son et en physique acoustique.

Network Programmer

Rôle : Responsable des fonctionnalités Online d’un jeu. Il intervient sur la partie réseau (client /serveur) des jeux multijoueurs ou possédant des fonctionnalités en ligne.

Techno : C++ / Linux / TCP-UDP

Skill : Connaissance approfondie en réseaux informatique et des différents protocoles qui vont avec. Souvent expert Linux.

AI Programmer

Rôle : Programmeur spécialisé en création d’intelligence artificielle.

Techno : C++ (+ Lua)

Skill : Expert dans divers domaines des mathématiques (Théorie des graphes, probas, réseaux neuronaux, …) et en optimisation algorithmique.

Tools Programmer

Rôle : Développe des outils pour les différents membres de la team. (Plugin Maya pour les Game Artist, Gestionnaire de dialogues pour les scénaristes, etc…)

Techno : C++ (Qt) / C# (WPF) / Python / Lua

Skill : Bonnes compétences en ingénierie logicielle de manière générale. Des compétences en UI/UX sont un plus.

Automation & Build Engineer

Rôle : Fait en sorte que les tests et les builds du jeu se passent sans problèmes.

Techno : C++ / C# / Python / Shell / Linux / DevOps (Docker, Consule, Selenium, Jenkins, etc…)

Skill : Comprend parfaitement comment automatiser les tâches redondantes et comment désigner un système de build performant.


 

Et il y en a encore d’autres qui peuvent apparaître au fur et à mesure des besoins selon les studios.

Personnellement, à l’époque où je désirais rejoindre le monde du jeu vidéo, j’étais plutôt orienté Tools/Automation/Build Engineer, car ma partie préférée reste quand même la possibilité de créer des outils pour aider les autres à produire quelque chose d’encore plus énorme. De plus, j’ai toujours trouvés l’ingénierie logicielle “classique” plutôt sympa.

Et vous ? Vers quoi vous orientez-vous ?

 

J’ai des doutes

Pour ceux qui connaissent, je ne vous parlerai pas de Sara Mandiano et de sa chanson culte du début des années 90. Si j’ai décidé d’écrire cet article c’est pour vous partager une expérience qui m’est arrivée (ce n’est pas la première fois) et qui vous est déjà arrivée et vous arrivera encore, j’en suis sûr.

Non, on ne se connait pas mais si tu continues la lecture, je parie que tu te retrouveras facilement comme acteur dans ce scénario. Et puis comme tu m’as l’air sympathique et que je te veux du bien, tu ne verras pas d’inconvénient à ce que je tutoies 😀

 

Comme le mien et celui de tous les humains, ton cerveau a la tendance de se focaliser sur les mauvaises choses, les choses négatives. Il ne faut pas lui en vouloir c’est un réflexe d’autodéfense et c’est tant mieux qu’il le fasse car l’humanité serait éteinte depuis bien longtemps s’il ne remplissait pas ce rôle.

Bref, ce truc là-haut qui est à la base d’à peu près de toutes nos décisions, nous fait nous questionner sur l’avenir qui rappelons-le est “incertain” ou encore “jamais sûr”… C’est pas moi qui le dit.

Oui, donc ce trouillard a peur de l’inconnu et toi et moi (et tout ce qui… la chanson est finie…) aussi par la même occasion.

 

Lorsque tu démarres un projet, après un temps, alors que tu es occupé à suivre ta liste de choses à faire voir même que tu les as planifiées, le Doute frappe à ta porte avec un léger mais sec battement: Toc! Toc! Toc! Ta bonne éducation et ton sens de l’hospitalité te dicte de le faire entrer et lui servir une petite tasse de café avec un petit gâteau et de la sorte accueillir ton ami de longue date comme il se doit. Bienveillant, il va alors te demander si tu vas bien (pourquoi j’ai une sale gueule?) et très rapidement te questionner sur tes décisions, ta stratégie et te montrer les photos de toutes tes appréhensions: “Alors que fais-tu? Ah ça…? Tu penses vraiment que tu vas y arriver? Tu es tellement loin du but… Est-ce que ça en vaut la peine au moins? Et si tu fais ça pour rien? Et tu as pensé à ceci et puis à cela? Combien y sont arrivés avant toi? Pas beaucoup hein !?!”

 

Alors tu te dis que pourtant ton projet est bon et il est cohérent avec ce que tu penses, ce que tu aimes et ce que tu veux et jusque là tu étais enthousiaste à cette idée. Oui mais ça c’était avant, avant que ton ami ne vienne t’interroger sur ta capacité à mener à bien ce projet et aille jusqu’à te demander si tu as fait le bon choix au départ. Rassures-toi, c’est un ami et il ne va pas te laisser seul avec tes soucis. Il va rester près de toi et te soutenir. Il s’occupera de toi tout le temps que cela sera nécessaire du moment que tu lui donnes des gâteaux. Ton énergie sera alors utilisée pour lui jusqu’à ce que tu te sentes mieux en arrêtant ce que tu avais entrepris et que tu retournes à ta petite vie tranquille sans grand rebondissement ni grande aventure.

 

Maintenant, soit tu aimes véritablement cet ami et alors tu peux arrêter de lire et le laisser faire, soit je te donne un coup de main pour le sortir de ta cuisine manu militari et sur le champ!

 

Tu continues à lire? Tu veux vraiment savoir comment tu peux le faire sortir de chez toi? Ok, alors allons-y.

Affiche tes valeurs

Tes valeurs, tu les connais bien, ce sont celles qui t’ont poussé à commencer ton aventure? Et bien, elles sont une véritable mine d’or de motivation et de bonnes raisons de faire ce que tu fais. Ces petites choses qui t’ont donné l’envie de commencer ton projet, t’en souviens-tu? Et bien, plus que de t’en souvenir, écris-les et placarde-les afin de toujours les avoir devant toi. Lorsque ton ami reviendra pour frapper à ta porte, il verra la pancarte et il comprendra que ce n’est pas le moment, tu es occupé à construire ton avenir.

 

Dans la pratique, c’est ce que l’on appelle un tableau des rêves ou tableau de visions ou encore tableau de visualisation positive. C’est un outil vraiment puissant qui, en le regardant tous les jours avant de commencer à bosser, en te levant le matin et/ou quand ton ami arrive jusqu’à ta porte, te permettra de te reconnecter à tes motivations, à ce que tu veux vraiment et à ce qui est en accord avec toi.

 

Tu as envie de faire le prochain Halo ou le prochain Tomb Raider ou encore un remake de Mario, mets une photo du jeu sur ton tableau qui te rappellera ton but. Tu veux travailler pour une AAA, mets son logo sur ton mur. Tu rêves de rencontrer Jean Guesdon, trouve une photo de lui et pose-la sur ta pancarte.

Le but est d’afficher en photos ou en textes très court l’image que représente pour toi ton rêve ou ce que tu veux. C’est quelque chose de personnel que probablement tu seras le seul à comprendre mais au final, c’est sur toi qu’il doit agir!

Développe tes talents

Tu veux faire des jeux vidéo, peut-être depuis toujours, et tu as des talents pour le faire. Même si tu connais pas de langage de programmation ou que tu ne sais pas dessiner ou que tu ne sais pas faire de la musique ou que tu as l’impression de ne jamais avoir d’idée, tu as tout de même en toi la capacité de le faire.

 

Je le dis et répète depuis des années, nous avons tous en nous ce potentiel et je suis prêt à la démontrer à tout ceux qui diront le contraire. Nous sommes des animaux intelligents, c’est ce qui nous caractérise le plus des autres espèces sur cette terre. Cette intelligence n’est pas de connaître toutes les capitales de tous les pays ou 7 langues différentes ou encore d’être capable de développer des théorèmes mathématiques (tout ça c’est Google, non?!?), non cette intelligence qui t’habite c’est la capacité d’apprendre.

D’ailleurs, il est grand temps que l’éducation nationale arrête de penser que tout le monde peut et doit apprendre de la même façon. Nous sommes tous différents et nous avons tous notre manière d’apprendre. Alors plus de complexe et regarde simplement ce que tu aimes faire tout en cherchant le moyen, ton moyen d’arriver à faire ce que tu veux. Yes, you can!

 

Chaque pas que tu feras sera un pas qui te rapprochera de tes rêves. Aussi petit qu’il soit, un progrès est un progrès.

Explore tes accomplissements

Tu as déjà accomplis des choses dont tu es peut-être même fier ou qui t’ont tout simplement fait plaisir. Ces moments où tu as ressentis au fond de toi un sentiment de chaleur, une extase, une fierté. Et bien si tu ne le savais pas encore, le bonheur c’est ça. Il n’y a pas de recette miracle ou de tapis rouge, le bonheur c’est juste ces petits instants lorsque le bout de code que tu viens d’écrire fonctionne, lorsque le personnage que tu voulais voir dans ton jeu s’anime comme tu l’avais imaginé, lorsqu’un joueur te dit qu’il est vraiment cool ton jeu.

 

Ces moments, tu dois t’en rappeler et graver le sentiment qu’ils procurent dans ta mémoire afin de toujours les retrouver dans ce que tu feras. Ceci doit être ton ultime but: ressentir ça chaque jour. Mis bout à bout, comme des petits pas, ils créeront ton Bonheur.

 

C’est pour cela que depuis 28 ans je n’ai jamais arrêté de coder, dessiner, fabriquer… Et même depuis mes toutes premières années, je créais déjà à partir de briques de Lego.

 

Entoure-toi des personnes qui te soutiennent

Rien de tel que les encouragements pour rebooster le morale ou te faire une piqûre de rappel de TuEsSurLeBonChemin. Ton entourage est très important car nous ne sommes pas fait pour vivre seul (même si certains sont tellement déçus qu’ils préfèrent éviter tout contact). Ces gens doivent être les personnes qui t’aident ou t’encouragent et pas ceux qui se prenne pour ton ami le Doute.

 

Tu auras besoin de compagnons d’aventure tantôt pour te dire que tu vas y arriver, tantôt pour t’aider dans un algorithme dans lequel tu ne vois plus clair ou encore pour faire la musique d’ambiance de ton niveau. Tous seront important pour toi, n’oublie pas de les remercier au passage.

Evidemment, la communauté de GameCodeur.fr est une place de choix  🙂

 

En conclusion, je finirai par ceci: J’ai lu que les gens qui doutent sont des gens intelligents. Je pense que c’est vrai, si tu doutes c’est que tu réfléchis. Se poser les bonnes questions est important dans la réalisation de projets mais il ne faut pas que cela te soit néfaste.Écoute ce qu’il y a au fond de toi au début de ton projet et reste accroché à cela tout au long de ton parcours. Tu sais pourquoi tu le fais et rien ne doit t’empêcher de le faire même les peurs et les doutes, tes doutes.

 

J’espère que tu auras pris autant de plaisir à lire cette article que j’ai eu à l’écrire. Cela m’a pris une matinée entière car je suis encore lent dans le domaine de l’écriture mais je sais qu’à force de le faire je m’améliore. Je te souhaite de réaliser tes souhaits et tes rêves et peut-être trouveras-tu quelques conseils utiles dans mes articles. N’hésite pas à partager car tu peux toi aussi aider d’autres personnes de cette manière.

 

Keep Making Games!

 Je coache un élève Premium Pro en vidéo : révision des collisions

Parfois, quand tu commences à te former, tu vas faire un blocage sur un concept. Peut être parce que inconsciemment tu l’as classé mentalement dans la case “j’y comprends rien”.

Ca te rappelle peut être un truc imbitable qui t’as emmerdé à l’école…

C’est la plupart du temps juste un soucis de “mindset”. Il faut alors voir le concept avec plus de calme, et plus d’assurance, en arrêtant d’avoir des pensées limitantes, inutiles et nuisibles.

Quand je vous dis que 50% des conditions de réussites de l’apprentissage de la programmation de jeux vidéo c’est dans la tête !

Je suis justement là pour vous le rappeler.

C’est comme ça que j’ai mis à la programmation des dizaines de personnes auparavant “dégoutées” de la prog, et persuadées de ne pas être faites pour ça.

Et quand ça bloque, je suis là pour aider.

Un de mes élèves Premium Pro a récemment réalisé un travail formidable pour la Gamecodeur Gamejam 9, mais il bloque sur le concept des collisions.

Pourtant le concept est relativement simple, pour peu qu’on prenne la peine de l’aborder avec calme et détermination. C’est aussi un concept fondamental. Pas de collisions : pas de gameplay !

Je le coache en vidéo ici en lui faisant une petite révision (code + schémas) :

Tous ces concepts (et bien d’autres), je les enseigne dans ma formation “Devenir programmeur de jeux vidéo”. La seule formation en ligne qui forme plus vite qu’une école, comme en témoigne Benjamin :

“Maintenant que j’arrive a mon premier mois de formation premium je me rend compte de la vitesse a la quelle il est possible d’apprendre avec ta méthode ! Je n’aurai jamais pu atteindre le meme niveau après seulement un mois dans une école ! Merci beaucoup pour ça !”.

Pourquoi ? Parce que travaille totalement différemment des enseignants traditionnels. Je reviens non seulement aux VRAIES bases de la programmation de jeux vidéo, mais je te les fais approcher progressivement, sans te bourrer la tête tout d’un coup. Parce que sais ce que c’est de commencer, même en partant de zéro !

Commence dès maintenant à te former et mesure tes progrès dans seulement 2 à 3 semaines ! Déjà plus de 450 élèves ont fait le pas !

C’est là :

Adhésion à la formation Gamecodeur

This entry was posted in News and tagged . Bookmark the permalink.

Créer et Gérer sa bibliothèque

 

En code, dans tout les langages il est nécessaire de se constituer une bibliothèque de codes.

la principale raison a cela est qu’il est inutile de réinventer la roue a chaque fois.

cela évite des pertes de temps ou l’on se dit j’ai déjà fait ça dans un code mais lequel ?

voir de se reprendre la tête a recoder quelque chose qu’on a déjà codé

seulement voila, comment s’y prendre ?

lorsque je rencontre un problème mathématique par exemple et que j’arrive a le résoudre je fais une fonction de la formule et je la sauvegarde seule sur mon disque dur.

j’ai un dossier nommé functions dans laquelle je sauve toute mes fonctions le jour ou j’ai a nouveau besoin de résoudre le même problème je n’ai plus qu’a prendre la fonction dans la bibliothèque et faire un copier coller dans mon code.

il est aussi possible par exemple en lua d’ajouter la ligne

require “functions/mafonction.lua” pour ajouter directement la fonction depuis la bibliothèque.

il est important de bien nommer les fichiers afin qu’il soit simple de se souvenir de quelle fonction il s’agit.

j’utilise aussi pastebin ce qui permet d’avoir un moyen de les partager et d’y accéder a tout moment cela permet aussi d’avoir une sauvegarde en cas de crash de disque dur.

par exemple mon pastebin est consultable a l’adresse : https://pastebin.com/u/casencty j’y poste mes fonctions dans le dossier gamecodeur.

enfin il existe des logiciels permettant d’organiser ses morceaux de codes. ce qui permet de les retrouver facilement.

par exemple http://www.snippetmanager.net/ propose un logiciel freeware(gratuit) pouvant servir a gérer ses codes assez simplement.

 

voila j’espère que cet article vous aider a a organiser votre bibliothèque de codes et a vous y retrouver facilement.

 

case.

 

 

Ecrire un code idiomatique (avec Javascript)

Hello everybody,

ces derniers temps, je suis amené à regarder de plus en plus de code Javascript lié au jeu vidéo et il y a quelque chose qui me frappe. La plupart des GameDev Javascript que je croise sont d’anciens développeurs C/C++/C# et essayent à tout pris de garder leurs habitudes de programmation. Je trouve cela dérangeant, car Javascript possède tout un tas de concept intéressant, mais trop peu exploités par les développeurs de jeux. Je vais donc essayer de vous montrer comment écrire un code idiomatique en Javascript.

Alors, déjà, que veut dire idiomatique ? On va qualifier un code d’idiomatique lorsqu’il s’efforce de respecter la philosophie (la manière de faire) du langage de programmation dans lequel il est écrit. Autrement dit, il est possible d’écrire le même programme quasiment de la même façon en C#, Python et Javascript, mais chacun de ces langages possèdent ses spécificités qu’il s’agisse de structure de données particulières ou de différences dans la bibliothèque standard. Il est intéressant de s’approcher le plus possible de l’idiome du langage utilisé, cela permet en général d’avoir un code plus propre, plus clair (donc plus simple à maintenir) et parfois plus performant. Je vous propose une petite démonstration avec la réécriture d’un bout de programme Javascript.

Il y a peu de temps, j’ai rencontré le bout de code suivant (que j’ai adapté pour ce contexte) :

var players = [
  { x: 20, y: 20, life: 100 },
  { x: 60, y: 40, life: 100 }
];

var players_alive = [];

for (var i = 0; i < players.length; i++) {
  players[i].x -= 10;
  players[i].y -= 10;
  players[i].life -= 50;

  if (players[i].life > 0) {
    players_alive.push(players[i]);
  }
}

Ce code est volontairement simplifié, normalement il y a beaucoup plus de données et d'opérations. ;)

Pour expliquer vite fait la logique, on a un ensemble de joueurs et une explosion se produit, les joueurs sont projetés en arrières et perdent de la vie (selon leur position dans le vrai code, simplement la moitié ici).

Ce code, bien que parfaitement valide, a plusieurs problèmes, attaquons nous au premier : var.

var était autrefois la construction par défaut pour créer une variable et les développeurs C# ont tendances à le confondre avec le var de C#. Maintenant en JS, on essaye de jamais l’utiliser, car on a deux meilleures constructions : let et const. La première va nous permettre de créer une variable local qui sera mieux scopés dans son block de déclaration (il y avait des soucis avec var à ce niveau-là), la deuxième va nous permettre de créer une constante (une variable que l’on ne pourra pas réassigner). Dans un monde parfait, tout est const, cela évite les mauvaises surprises au fur et à mesure du programme et seule les données qui doivent absolument changer vont passer en let.

Une fois cela modifiée, il nous reste le plus gros problème: for. Je vais être honnête avec vous, une boucle for je trouve cela extrêmement chiant à lire. On est obligé de lire l’intégralité de la boucle pour espérer comprendre la volonté du développeur, c’est super relou. On va donc se tourner vers la programmation fonctionnelle pour essayer d’encapsuler les actions dans des fonctions. Pour l’instant, nous avons le code suivant :

const players = [
  { x: 20, y: 20, life: 100 },
  { x: 60, y: 40, life: 100 }
];

const players_alive = [];

function move_player(player, distance) {
  player.x -= distance;
  player.y -= distance;
  return player;
}

function damage_player(player, damage) {
  player.life -= damage;
  return player;
}

function is_alive(player) {
  return player.life > 0;
}

Okay, nos actions sont encapsulées et sont réutilisables. Maintenant, pour pouvoir itérer on va utiliser les second order functions. Ce sont, globalement, des fonctions qui vont nous permettent de boucler sur une structure de données afin d’effectuer un type d’action. Pour le déplacement et les dégâts, je veux juste changer les valeurs de chaque player, je vais donc mapper une nouvelle valeur (va la fonction map) .

const players = [
{ x: 20, y: 20, life: 100 },
{ x: 60, y: 40, life: 100 }
];

const players_alive = [];

// On garde en tête les fonctions présentés plus haut.

const updated_players = players.map(player => damage_player(move_player(player)));

Héhé, j’aimerais voir votre tête en ce moment. 🙂

Pour info, `x =&gt; y` c'est juste un moyen plus court pour écrire une fonction.

Cela peut sembler déroutant au début, mais en réalité ça se lit très facilement :

“updated_players correspond aux valeurs mapper de players où damage_player et move_player sont appelés sur chaque player”.

C’est aussi simple que ça. On peut appliquer une logique similaire pour garder les joueurs encore en vies, on voudra donc appliquer un filtre grâce à la fonction `filter`.

// On garde en tête les fonctions présentés plus haut.

const players_alive = updated_players.filter((player) => { is_alive(player) });

Là c’est sûrement la plus claire de toutes :

“players_alive correspond aux updated_players en vies”.

Toutes ces modifications nous donnent le code final suivant :

const players = [
  { x: 20, y: 20, life: 100 },
  { x: 60, y: 40, life: 100 }
];

function move_player(player, distance) {
  player.x -= distance;
  player.y -= distance;
  return player;
}

function damage_player(player, damage) {
  player.life -= damage;
  return player;
}

function is_alive(player) {
  return player.life > 0;
}

const updated_players = players.map(player => damage_player(move_player(player, 10), 50));
const players_alive = updated_players.filter(player => is_alive(player));

 

C’est quand même classe non ? En plus, toutes les actions sont réutilisables, on s’oriente donc vers un code plus modulaire et ça, c’est bien.

Ceci conclus cet article, n’hésitez pas à le relire et surtout à tester par vous-même, car c’est déroutant la première fois. Au besoin, je suis souvent sur le Discord GameCodeur.

Tchouss !!

Autopsie d’un jeu vidéo Pico-8

Âmes sensible s’abstenir ! On parle Design Pattern aux débutants en programmation de jeux vidéo !

Le Design Pattern est pour le programmeur la clé pour savoir programmer un jeu vidéo.

Ha bon, vous pensiez que c’était d’apprendre un langage de programmation vous ? C’est peut être pour ça que vous galérez…

Dans cette vidéo extraite de l’atelier “Coder sur Pico-8”, j’autopsie le gameplay du jeu que j’ai réalisé pour vous former à l’utilisation d’un Design Pattern hyper simple à mettre en place.

L’atelier contient également une vidéo pendant laquelle je passe en revue l’intégralité des 360 lignes de code du jeu !

L’atelier :
https://www.gamecodeur.fr/liste-ateliers/atelier-pico8/

La vidéo :

This entry was posted in News and tagged . Bookmark the permalink.

Nouvelle présentation des parcours de formation

J’ai réorganisé et revu les visuels pour les parcours de formation

Ca me semble plus clair et on voit mieux la chronologie de l’apprentissage Gamecodeur basé sur des fondamentaux et de la diversification ou spécialisation.

A voir sur : https://www.gamecodeur.fr/liste-ateliers

Pour adhérer et accéder à tous les parcours, c’est ici :
https://www.gamecodeur.fr/acces-premium/

On frise les 400 vidéos pour plus de 35 ateliers…

This entry was posted in News and tagged . Bookmark the permalink.