CodeGym/Blog Java/Random-FR/Au début, il y avait...
John Squirrels
Niveau 41
San Francisco

Au début, il y avait...

Publié dans le groupe Random-FR
membres
Au début, il y avait ... - 1 La période d'essai de mon premier emploi s'est terminée il y a 3 ans, mais ce n'est que maintenant que j'ai trouvé le temps d'écrire un article. J'ai passé un an dans différents départements de mon université : au premier semestre, j'ai étudié la gestion, et au second semestre, je suis passé au génie logiciel. J'espérais qu'ils m'apprendraient à programmer, mais je me suis trompé. Alors, j'ai rassemblé des matériaux et j'ai décidé de tout apprendre par moi-même. La seule raison pour laquelle je suis reconnaissant à mon professeur est qu'il m'a recommandé de commencer par le livre électronique de Stephen Pratt "The C Programming Language". C'est vraiment un bon livre avec beaucoup d'exercices pratiques. J'ai passé environ 2 mois sur le livre, après quoi je suis tombé sur ce cours Java en ligne dans les groupes d'un ami et c'est ainsi que tout a commencé. Au départ, je prévoyais de devenir développeur Android, mais le backend m'a semblé plus intéressant au fur et à mesure que j'avançais dans mon apprentissage. Soit dit en passant, il m'a fallu 3 mois d'études pour atteindre le niveau 20, après quoi j'ai décidé d'essayer de trouver un emploi. La première chose à faire était de déménager dans une autre villepuisque le mien n'avait aucune ouverture pour un développeur Java junior. J'ai trouvé une entreprise, j'ai postulé et j'ai reçu une tâche de test, que j'ai eu une semaine pour terminer. J'ai dû écrire une application web simple en utilisant Hibernate, Servlet/JSP et MySQL. En voyant tous ces termes, je savais seulement que MySQL était une base de données. Au début, j'étais très déçu. J'ai même décidé de chercher des offres d'emploi dans certains KFC, mais j'ai ensuite décidé de tenter ma chance à la tâche de test. Après tout, je pourrais toujours trouver un emploi chez KFC. J'ai travaillé sans arrêt toute la semaine et j'ai réussi à terminer le test. J'ai soumis ma solution, mais elle "n'était pas jolie", alors je l'ai révisée 4 fois de plus. Ma dernière solution s'est avérée correcte, mais les postes étaient déjà pourvus et les candidatures supplémentaires ne seraient pas acceptées avant 3 mois. Qu'est-ce que tu vas faire, hein ? Pour les 3 prochains mois, J'ai appris HTML, CSS, JS, SQL et PHP. Pourquoi PHP ? J'avais besoin d'un langage serveur qui répondrait aux demandes et autres. À l'époque, les servlets et les jsp semblaient trop compliqués. En fin de compte, j'ai produit une application Web à part entière avec une interface terrible. J'ai publié le code sur GitHub pour mon portfolio. À ce moment-là, 3 mois s'étaient écoulés et la même entreprise m'a recontacté et m'a invité à un entretien, me donnant une autre tâche simple pour tester mes connaissances en SQL, que j'ai réussi à terminer en quelques heures. La personne à qui je parlais d'emploi a laissé entendre qu'elle poserait des questions sur les algorithmes et les structures de données - des sujets que je n'avais pas encore eu le temps de maîtriser. Cela dit, il restait 15 jours avant l'entretien. J'ai ça ! Le livre de Robert Lafore "Data Structures & Algorithms in Java" m'a aidé. je n'ai pas Je n'ai pas eu le temps de tout lire et de tout comprendre en deux semaines, mais j'ai quand même beaucoup appris. Et puis le jour de l'entretien est arrivé. Je suis arrivé à l'heure dite. Deux hommes m'ont accueilli et l'entretien a commencé. Dire que j'étais inquiet serait un doux euphémisme. Ma voix tremblait. Ils ont posé des questions sur tout sauf les algorithmes et les structures de données. Ils ont posé des questions sur Spring, DI, IoC, Hibernate, comment fonctionne la JVM, comment fonctionne le ramasse-miettes — je n'ai pas pu répondre à une seule de ces questions. Je n'ai répondu avec succès qu'aux questions sur Java Core (collections, exceptions, OOP, etc.). Alors que j'étais encore à l'entretien, je savais que j'avais échoué, mais j'étais quand même déçu de ne pas recevoir de commentaires. Au lieu de cela, j'ai identifié des lacunes dans mes connaissances et j'ai commencé à travailler avec diligence pour les combler. Et puis le jour de l'entretien est arrivé. Je suis arrivé à l'heure dite. Deux hommes m'ont accueilli et l'entretien a commencé. Dire que j'étais inquiet serait un doux euphémisme. Ma voix tremblait. Ils ont posé des questions sur tout sauf les algorithmes et les structures de données. Ils ont posé des questions sur Spring, DI, IoC, Hibernate, comment fonctionne la JVM, comment fonctionne le ramasse-miettes — je n'ai pas pu répondre à une seule de ces questions. Je n'ai répondu avec succès qu'aux questions sur Java Core (collections, exceptions, OOP, etc.). Alors que j'étais encore à l'entretien, je savais que j'avais échoué, mais j'étais quand même déçu de ne pas recevoir de commentaires. Au lieu de cela, j'ai identifié des lacunes dans mes connaissances et j'ai commencé à travailler avec diligence pour les combler. Et puis le jour de l'entretien est arrivé. Je suis arrivé à l'heure dite. Deux hommes m'ont accueilli et l'entretien a commencé. Dire que j'étais inquiet serait un doux euphémisme. Ma voix tremblait. Ils ont posé des questions sur tout sauf les algorithmes et les structures de données. Ils ont posé des questions sur Spring, DI, IoC, Hibernate, comment fonctionne la JVM, comment fonctionne le ramasse-miettes — je n'ai pas pu répondre à une seule de ces questions. Je n'ai répondu avec succès qu'aux questions sur Java Core (collections, exceptions, OOP, etc.). Alors que j'étais encore à l'entretien, je savais que j'avais échoué, mais j'étais quand même déçu de ne pas recevoir de commentaires. Au lieu de cela, j'ai identifié des lacunes dans mes connaissances et j'ai commencé à travailler avec diligence pour les combler. Dire que j'étais inquiet serait un doux euphémisme. Ma voix tremblait. Ils ont posé des questions sur tout sauf les algorithmes et les structures de données. Ils ont posé des questions sur Spring, DI, IoC, Hibernate, comment fonctionne la JVM, comment fonctionne le ramasse-miettes — je n'ai pas pu répondre à une seule de ces questions. Je n'ai répondu avec succès qu'aux questions sur Java Core (collections, exceptions, OOP, etc.). Alors que j'étais encore à l'entretien, je savais que j'avais échoué, mais j'étais quand même déçu de ne pas recevoir de commentaires. Au lieu de cela, j'ai identifié des lacunes dans mes connaissances et j'ai commencé à travailler avec diligence pour les combler. Dire que j'étais inquiet serait un doux euphémisme. Ma voix tremblait. Ils ont posé des questions sur tout sauf les algorithmes et les structures de données. Ils ont posé des questions sur Spring, DI, IoC, Hibernate, comment fonctionne la JVM, comment fonctionne le ramasse-miettes — je n'ai pas pu répondre à une seule de ces questions. Je n'ai répondu avec succès qu'aux questions sur Java Core (collections, exceptions, OOP, etc.). Alors que j'étais encore à l'entretien, je savais que j'avais échoué, mais j'étais quand même déçu de ne pas recevoir de commentaires. Au lieu de cela, j'ai identifié des lacunes dans mes connaissances et j'ai commencé à travailler avec diligence pour les combler. Je n'ai répondu avec succès qu'aux questions sur Java Core (collections, exceptions, OOP, etc.). Alors que j'étais encore à l'entretien, je savais que j'avais échoué, mais j'étais quand même déçu de ne pas recevoir de commentaires. Au lieu de cela, j'ai identifié des lacunes dans mes connaissances et j'ai commencé à travailler avec diligence pour les combler. Je n'ai répondu avec succès qu'aux questions sur Java Core (collections, exceptions, OOP, etc.). Alors que j'étais encore à l'entretien, je savais que j'avais échoué, mais j'étais quand même déçu de ne pas recevoir de commentaires. Au lieu de cela, j'ai identifié des lacunes dans mes connaissances et j'ai commencé à travailler avec diligence pour les combler.J'ai trouvé un emploi un mois après mon entretien raté. Au fait, j'ai trouvé l'offre d'emploi dans les discussions sur CodeGym ( CodeGym est la version russe de CodeGym — note de l'éditeur). Tout d'abord, il y a eu un entretien Skype avec un recruteur (il a duré environ 2 heures). Ils ont posé des questions sur Java Core, la récupération de place (maintenant je savais comment cela fonctionnait), les bases de données et les structures de données. L'intervieweur m'a demandé de partager mon écran et d'écrire une calculatrice. J'ai presque pleuré de joie, car j'avais écrit une calculatrice juste une semaine auparavant. Confiant en moi, j'ai commencé la tâche. Mais que ce soit à cause de mon excitation ou pour une autre raison, j'ai oublié une partie de l'algorithme. Mon écran a été partagé. J'avais peur de consulter Google. Heureusement, j'avais mon téléphone portable, ce qui m'a sauvé la mise. Le lendemain, ils ont appelé pour un entretien en personne et quelques jours plus tard, j'ai reçu une offre. Ce n'était pas une position officielle. Mon rôle était celui d'apprenti chez un propriétaire unique. Nous avons écrit un service pour la planification d'événements, la vente de billets, etc. Je me souviens de mon premier jour de travail. Mon patron a pris 15 minutes pour expliquer ce qu'il fallait faire. "Est-ce que tout est clair?" Il a demandé. « Hmm, pas vraiment. Peux-tu y revenir une fois de plus ? ai-je demandé avec une grande inquiétude. Le patron a encore tout expliqué. "C'est clair maintenant ?" "Oui, maintenant ça l'est." En fait, je n'ai RIEN compris. Mais j'avais peur de demander une autre explication. Je pense que n'importe qui peut le comprendre. La tâche se résumait au portage de Thymeleaf vers AngularJS. Heureusement, j'ai trouvé un morceau de code fini et l'ai utilisé comme exemple de ce qu'il faut faire. Je ne comprenais pas comment cela fonctionnait, mais j'ai terminé la tâche. On m'a ensuite confié des tâches directement liées au backend. Ce n'est qu'après une expérience pratique avec Spring que j'ai commencé à comprendre ce que j'avais lu dans "Spring for Professionals". J'y ai travaillé pendant 8 mois, puis j'ai déménagé dans une autre ville, où j'ai rapidement trouvé un emploi officiel, travaillé pendant 2 ans et changé mon titre de "junior" à "mid-level" en cours de route. Puis j'ai fait face au fait que mon travail était devenu routinier et ne me procurait pas une once de plaisir. Alors j'ai fait une pause. Pour éviter que mes doigts ne s'atrophient pendant ma pause, j'ai décidé de m'essayer à un autre domaine : le développement de jeux. Plus précisément, développement de jeux mobiles, reprise d'Android, puisque je connaissais déjà Java. Et c'est ce dont je vais parler en détail maintenant. Ce n'est qu'après une expérience pratique avec Spring que j'ai commencé à comprendre ce que j'avais lu dans "Spring for Professionals". J'y ai travaillé pendant 8 mois, puis j'ai déménagé dans une autre ville, où j'ai rapidement trouvé un emploi officiel, travaillé pendant 2 ans et changé mon titre de "junior" à "mid-level" en cours de route. Puis j'ai fait face au fait que mon travail était devenu routinier et ne me procurait pas une once de plaisir. Alors j'ai fait une pause. Pour éviter que mes doigts ne s'atrophient pendant ma pause, j'ai décidé de m'essayer à un autre domaine : le développement de jeux. Plus précisément, développement de jeux mobiles, reprise d'Android, puisque je connaissais déjà Java. Et c'est ce dont je vais parler en détail maintenant. Ce n'est qu'après une expérience pratique avec Spring que j'ai commencé à comprendre ce que j'avais lu dans "Spring for Professionals". J'y ai travaillé pendant 8 mois, puis j'ai déménagé dans une autre ville, où j'ai rapidement trouvé un emploi officiel, travaillé pendant 2 ans et changé mon titre de "junior" à "mid-level" en cours de route. Puis j'ai fait face au fait que mon travail était devenu routinier et ne me procurait pas une once de plaisir. Alors j'ai fait une pause. Pour éviter que mes doigts ne s'atrophient pendant ma pause, j'ai décidé de m'essayer à un autre domaine : le développement de jeux. Plus précisément, développement de jeux mobiles, reprise d'Android, puisque je connaissais déjà Java. Et c'est ce dont je vais parler en détail maintenant. où j'ai rapidement trouvé un emploi officiel, travaillé pendant 2 ans et changé mon titre de "junior" à "mid-level" en cours de route. Puis j'ai fait face au fait que mon travail était devenu routinier et ne me procurait pas une once de plaisir. Alors j'ai fait une pause. Pour éviter que mes doigts ne s'atrophient pendant ma pause, j'ai décidé de m'essayer à un autre domaine : le développement de jeux. Plus précisément, développement de jeux mobiles, reprise d'Android, puisque je connaissais déjà Java. Et c'est ce dont je vais parler en détail maintenant. où j'ai rapidement trouvé un emploi officiel, travaillé pendant 2 ans et changé mon titre de "junior" à "mid-level" en cours de route. Puis j'ai fait face au fait que mon travail était devenu routinier et ne me procurait pas une once de plaisir. Alors j'ai fait une pause. Pour éviter que mes doigts ne s'atrophient pendant ma pause, j'ai décidé de m'essayer à un autre domaine : le développement de jeux. Plus précisément, développement de jeux mobiles, reprise d'Android, puisque je connaissais déjà Java. Et c'est ce dont je vais parler en détail maintenant. J'ai décidé de m'essayer à un autre domaine : le développement de jeux. Plus précisément, développement de jeux mobiles, reprise d'Android, puisque je connaissais déjà Java. Et c'est ce dont je vais parler en détail maintenant. J'ai décidé de m'essayer à un autre domaine : le développement de jeux. Plus précisément, développement de jeux mobiles, reprise d'Android, puisque je connaissais déjà Java. Et c'est ce dont je vais parler en détail maintenant.Mon équipe. En peu de temps, j'avais monté une petite équipe de 4 personnes (dont moi) : 2 développeurs, 1 game designer, et 1 ingénieur du son. Parce que personne dans l'équipe n'avait d'expérience dans le développement de jeux, et parce que mon temps de vacances était limité, nous avons décidé de mettre en place un projet simple que nous serions certainement en mesure de terminer. Et c'est ce que nous avons fait ! Initialement, la date limite était le 15 novembre, mais comme vous le savez, terminer un projet dans les délais est tout simplement faux. Donc, nous l'avons terminé avec deux semaines de retard. Notre pile technologique était composée de Java 8 et de libGDX.

Développement

Le développement a commencé le 17 octobre. Au total, nous avons passé 45 jours durant lesquels :
  1. Nous avons appris à utiliser libGDX.
  2. Nous avons écrit du code.
  3. Nous avons créé des graphiques.
  4. Nous avons créé de la musique.
Quiconque a vu le jeu pourrait se demander : « Pourquoi cela a-t-il pris si longtemps ? Le jeu est si simple. Oui, c'est vrai, et pour être précis, la partie développement (écriture du code) a pris environ une semaine et demie. Le reste du temps était partagé entre :
  1. Maîtriser l'utilisation du moteur de jeu.
  2. Dessiner et redessiner des oeuvres.
  3. Ecrire de la musique.
  4. Recherche de sons sur https://freesound.org .
  5. Lire des tas d'articles sur la façon de promouvoir les jeux.
Nous avons aussi eu des moments de « downtime » pour diverses raisons : quelqu'un avait un examen, quelqu'un d'autre avait un test de rattrapage, etc. On peut certainement attribuer une semaine et demie ou plus au downtime. Un peu de temps a également été consacré aux "débats" : de nouvelles idées sur ce qu'il fallait ajouter au jeu apparaissaient presque quotidiennement, alors nous avons débattu : "c'est superflu", "ça ne rentre pas", etc. Nous avons jeté beaucoup d'idées, par exemple, ajouter des cafards qui couraient qu'on pouvait écraser pour obtenir des points supplémentaires : à mon avis, l'une des choses les plus difficiles était de décider à l'avance ce qu'il y aurait dans le jeu et de s'en tenir au plan sans essayer d'ajouter "juste un de plus " fonctionnalité. C'est ainsi que ces 45 jours se sont accumulés. Un prototype du jeu était prêt après une semaine et demie. Pendant cette période, nous n'avions pas vraiment de graphiques, Au début, il y avait ... - 2Le jeu est très simple d'un point de vue technique. Nous n'avons même pas eu besoin d'utiliser box2d (un moteur physique). Nous pouvons gérer les collisions et calculer nous-mêmes l'hypoténuse. Les points les plus intéressants que je soulignerai sont :
  1. Au départ, tous les éléments du jeu étaient générés aléatoirement. En d'autres termes, nous avons placé des fournisseurs (de trous noirs, de ciseaux, d'étoiles ninja, de mine de crayon, de cœurs) dans un tableau, obtenu un fournisseur aléatoire, obtenu un élément avec des coordonnées aléatoires. Il est devenu clair assez rapidement que cette approche n'était "vraiment pas vraiment bonne". Des amis participant aux tests nous ont dit la même chose, recommandant l'utilisation de modèles. Pour ceux qui sont impliqués dans le développement de jeux, c'est probablement une solution évidente. Mais parce que nous étions nouveaux dans le domaine, c'était un conseil très pratique pour nous.

    Nous avons donc créé plusieurs modèles : une vallée de ciseaux ; des mines de crayons - c'est plutôt cool de les collecter très rapidement (whoosh, whoosh, whoosh avec votre doigt) ; et un modèle de plus que je ne sais pas comment appeler — je vais juste vous dire comment nous avons nommé la classe dans notre code : StraightForwardPattern.

    Au début, il y avait ... - 3

    Ces modèles l'ont amélioré, mais il est devenu trop prévisible d'une manière ou d'une autre. C'est pourquoi nous en avons ajouté un de plus : un modèle aléatoire. En d'autres termes, nous avons maintenant des modèles "statiques" et un modèle aléatoire (insérez ici un mème "parfaitement équilibré").

  2. Voici le principal problème que nous avons rencontré. LibGDX appelle la méthode render (float delta) dans une boucle infinie. C'est là que tous les éléments sont dessinés. La ligne au crayon est tracée comme suit : nous obtenons les coordonnées du doigt et y dessinons la texture. Donc, si nous déplaçons notre doigt sur l'écran très rapidement, la ligne aurait des "vides" en raison des millisecondes entre les appels à la méthode render(delta).

    La solution était assez simple : nous nous souvenons des dernières coordonnées où la texture est dessinée, obtenons les coordonnées suivantes, et si la distance entre elles est supérieure à X et que le doigt n'a pas été relâché, nous comblons le vide. Au début, nous pensions que cette option pourrait ne pas fonctionner - les lignes seraient angulaires. Mais nos craintes n'étaient pas fondées, tout a fonctionné comme il se doit.

À propos du jeu

Le gameplay ne prétend pas être unique, mais il est assez bon et peut attirer les utilisateurs. Vous contrôlez un crayon, dessinez littéralement sur du papier et évitez les obstacles - ciseaux, étoiles ninja et trous noirs. Pendant ce temps, votre mine de crayon s'épuise et vous devez ramasser de petits crayons. Si votre crayon se termine avant que vous n'ayez ramassé un petit crayon, vous pouvez ramasser un morceau de miroir. Pendant quelques secondes, au lieu de consommer la mine du crayon, elle sera restaurée, cependant, en même temps, les commandes sont mises en miroir - si votre doigt se déplace vers la gauche, le crayon tire vers la droite. Vous pouvez également ramasser un cœur qui vous permettra de heurter un obstacle une fois et de rester en vie. Plus vous déplacez le crayon longtemps sans lever le doigt, plus votre combo est élevé, ce qui signifie que vous accumulerez des points plus rapidement. Au début, il y avait ... - 4La vitesse du jeu augmente également progressivement. La seule chose qui manque, ce sont les oiseaux en colère. Au départ, nous avions prévu de nommer le jeu Karan Dash (la translittération du mot russe pour crayon est karandash — ha ! compris ?), mais plus tard, nous avons changé d'avis et opté pour Pencil Dash. Nous l'avons fait parce que ce jeu de mots gracieux ne serait compris que par un public russophone. Nous avons sorti le jeu il y a quelques jours et en faisons maintenant la promotion. Ici aussi, personne dans l'équipe n'a d'expérience. Nous avons acquis toutes nos connaissances sur la promotion de jeux grâce à divers articles. Nous avons publié gratuitement des informations sur le jeu sur divers sites Web/forums. Nos chaînes payantes comprenaient la publicité sur 4pd, la publicité avec un blogueur, plusieurs publications dans des groupes publics sur VKontakte et la publicité AdMob. Soit dit en passant, ce message fait également partie de notre promotion, donc avec la permission de l'administration du site Web, j'inclus un lien vers le jeu ici. Vous pouvez trouver le jeu sur Google Play ici . Je vous serais reconnaissant de l'installer (peut-être que vous l'aimerez !), et si vous laissez une note, je vous promets de donner votre nom à un enfant ! :) Au début, il y avait ... - 6
Commentaires
  • Populaires
  • Nouveau
  • Anciennes
Tu dois être connecté(e) pour laisser un commentaire
Cette page ne comporte pas encore de commentaires