Jeu sur WinForms + C # en 16 ans (2 parties)

Contexte


Cela fait un bon moment depuis la rédaction de l' article précédent. Comme promis, j'ai écrit la deuxième partie. Je voudrais remercier tous ceux qui ont donné des conseils dans les commentaires, j'ai pu apprendre quelque chose de nouveau. Eh bien, pour ceux qui veulent voir le projet tout de suite, voici un lien vers le projet GitHub.

Je veux juste noter que tout ce qui a été ajouté et modifié dans cette version a été fait avec un très
beaucoup de travail, beaucoup d'erreurs. Mon Google a été rempli d'un grand nombre de demandes, allant des fonctionnalités de la mise en œuvre de MVP aux méthodes asynchrones.

image


Mises à jour


  1. Ajout de votre propre éditeur de carte (comme dans le jeu original).
  2. Sondeur mis en œuvre.
  3. Ajout de la possibilité d'attraper le donk et de tourner.
  4. Ajout de nombreux types de poissons.
  5. Performance du projet grandement améliorée.
  6. Correction d'un grand nombre de bugs.
  7. Aussi, une amélioration significative de l'architecture de l'application (plus précisément, de son apparence).
  8. Ajout du profil de sauvegarde du joueur.
  9. Trophées réalisés.
  10. Ajout d'un changement de jour et de nuit.
  11. Voyage ajouté.
  12. Mise en place d'une épicerie.
  13. Implémentation du modèle MVP.
  14. Implémentation d'un système d'événements dans le jeu
  15. Appât mis en œuvre, avec la possibilité de mélanger les ingrédients
  16. Jeu de voix ajouté
  17. Animations ajoutées
  18. L'usure des cannes est mise en place, en fonction de la taille du poisson et du temps de survie

J'ajouterai d'autres modifications au fichier de projet README Git.

Comment le code de quelqu'un d'autre a induit en erreur.


image

Nous voyons dans la capture d'écran l'éditeur de carte pour la pêche, à savoir la grille de profondeur pour chaque emplacement (Ce sont des éléments Label avec FormBorderStyle = 0, afin d'afficher le cadre). Soit dit en passant, la capture d'écran a été réalisée à l'aide de mes propres ciseaux. Quel était le problème?

Code source
for (int x = 0; x < 51; x++){ for (int y = 0; y < 18; y++){ Point between = new Point(Game.CastPoint.X - LVL.Deeparr[x, y].Location.X, Game.CastPoint.Y - LVL.Deeparr[x, y].Location.Y); float distance = (float)Math.Sqrt(between.X * between.X + between.Y * between.Y); if (distance < 20){ if (Player.getPlayer().lure != null){ Game.gui.DeepLabel.Text = LVL.Deeparr[x, y].Tag.ToString(); Sounder.setY(x); Sounder.setX(y); } } Game.Deep = Convert.ToInt32(Game.gui.DeepLabel.Text); } } 



Ici, nous voyons un simple passage à travers un tableau à deux dimensions (et non le bon). Ensuite, nous calculons l'hypoténuse par le théorème de Pythagore, et si elle est <20, nous déterminons la cellule souhaitée. Mais cette méthode fonctionne très mal même avec un carré. Et voici les rectangles. Par conséquent, la cellule est souvent détectée de manière incorrecte. Pour ma défense, je peux dire que j'ai pris ce code sur YouTube.

Nous devons donc déterminer dans quelle cellule se trouve le curseur. Pour ce faire, vous pouvez utiliser ce code source:

Code
 for (var y = 0; y < CurLvl.Height; y++) { for (var x = 0; x < CurLvl.Widgth; x++) { var r = new Rectangle(CurLvl.DeepArray[x, y].Location, new System.Drawing.Size(LabelInfo.Width, LabelInfo.Height)); if (r.IntersectsWith(new Rectangle(point, new System.Drawing.Size(1, 1)))) { //SomeCode } } } 


Ici, nous prenons les coordonnées du curseur, les collons dans un PointToClient et les transmettons au constructeur Rectangle, spécifions les tailles 1 et 1. Ensuite, nous utilisons la méthode de vérification standard IntersectsWith, l'intersection du curseur et l'étiquette. De plus, nous ne pouvons pas simplement traiter un clic sur une étiquette, car un formulaire avec eux ne s'affiche pas.
Il a également permis de mettre en place un support pour 3 cannes à pêche.

Génération de poissons


Ainsi, la partie principale du jeu est la génération de poissons. Elle se déroule en plusieurs étapes:
1.Lorsque vous entrez dans l'emplacement, nous venons d'une ligne comme:
Poisson rouge: 25 250-400 [Fromage, Ver, Mouche, Maïs] Où est la taille du poisson en pourcentage du maximum, de la profondeur minimale, de la profondeur maximale et une liste d'appâts que nous obtenons l'objet poisson (N'oubliez pas de pré-vérifier la ligne par des expressions régulières). Pour la beauté du code, j'ai défini un opérateur qui jette une chaîne pour pêcher.

 public static explicit operator Fish(FishString fs) { return fs.GetFishByStr(); } 


En conséquence, cette approche nous permet d'écrire:

 Fish fish = (Fish)new FishString(" : 25 250 - 400 [ , , ,  ]"); 

Le code est donné à titre d'exemple et ne se trouve pas dans le projet sous cette forme.

2.Maintenant, nous devons attendre que les cannes à pêche soient jetées, après quoi nous démarrons le minuteur (le nôtre pour chaque canne à pêche) avec un temps de morsure aléatoire, puis suivons la coche du minuteur de notre liste de poissons de 1000 unités, sélectionnez les poissons dont la profondeur de l'habitat comprend la profondeur cannes à pêche.

3. Dans cette liste, sélectionnez au hasard un poisson. Nous vérifions si l'appât fixé peut être mangé, et vérifions également que l'heure de la journée de l'activité du poisson correspond à l'heure actuelle du jeu.

4. Si le poisson peut manger l'appât, nous attaquons l'appât. Nous calculons s'il y aura une descente et après quelle heure, en fonction des chances de descente du crochet installé. Si le poisson ne peut pas manger l'appât, nous parcourons l'appât actuel (le cas échéant). Nous vérifions s'il y a un poisson à proximité qui peut picorer l'appât et répétons la même chose.

Grâce au processus de génération, je suis devenu un utilisateur LINQ confiant.

Jeu lui-même



Les aliments

Capture d'écran de l'épicerie.

Sa source peut être consultée dans le référentiel. Là, les gestionnaires MouseEnter et MouseLeft pour modifier les images des aliments sont exécutés de manière assez intéressante.

image

Capture d'écran du formulaire de voyage. (Tous les plans d'eau sont testés et leurs noms ne sont pas authentiques.)

image

Capture d'écran du jeu

Plans


  1. Créez un serveur client pour le jeu
  2. Développeur Junior FPGA (FPGA)
  3. Reconnaissance faciale via webcam (je recherche de la littérature qui peut être utile)
  4. Remplacement d'un ListView normal par un ObjectListView

À la fin de l'article précédent, j'ai écrit que je voulais obtenir un emploi. Eh bien, en septembre, j'ai fermé mon premier TOR par SNMP, bien qu'en C.

Conclusion


Le projet est devenu assez important, avec au moins une base de code idéale, mais très décente, pratique à maintenir. Quelque part les principes de SOLID peuvent être violés, mais cela est dû au fait que le projet était très long. De plus, si vous êtes un développeur débutant et que vous recherchez un projet auquel vous pouvez participer, vous pouvez valider ce référentiel. La liste des modifications attendues se trouve dans le fichier README du projet.

Je voudrais également noter que je ne vois aucune perspective dans la carrière de développeur C #, ou plutôt je voudrais quelque chose de plus proche du matériel, alors j'essaie d'étudier les langages de niveau inférieur.

Merci à tous ceux qui ont lu jusqu'au bout, toute critique du code source est la bienvenue et sera immédiatement prise en compte.

Source: https://habr.com/ru/post/fr479864/


All Articles