Débriefing du développement du moteur 2D sur WinForms

Introduction


Il y a quelques années, j'ai eu l'idée d'écrire un moteur Visual Novel sur WinForms. Pourquoi sur WinForms? Parce qu'alors je ne savais pas vraiment comment. Périodiquement, le moteur a reçu et reçoit des mises à jour actuelles. Pendant ce temps, un peu de code utile s'est accumulé et peut être utilisé partout.

Fractionnement du texte en lignes


// string ActorText -  ,      (Split(' ')) // text_width -  ,     // StrSize -    // StrEndl -    string ActorText_str = ""; //     int old_y = 35, StrSize = 0, StrEndl = 0; MessBox_1.Image = (Image)new Bitmap(MessBox_1.Width, MessBox_1.Height); using (Graphics g = Graphics.FromImage(MessBox_1.Image)) { //   old_y -= 14; for (var i = 0; i <= ActorText.Length; i++) { if (StrSize < text_width & i != ActorText.Length) { StrSize += ActorText[i].Length; if (i != ActorText.Length - 1 & (StrSize + ActorText[i + 1].Length >= text_width)) StrSize = text_width + 12; } else { // String builder for (int CreatLineIter = StrEndl; CreatLineIter < i; CreatLineIter++) ActorText_str += ActorText[CreatLineIter] + " "; // Set endl pos StrEndl = i; if (i != ActorText.Length) StrSize = ActorText[i].Length; old_y += 14; // SetColor(lua.GetTextColor())) -    .   . g.DrawString(ActorText_str, new Font(lua.GetTextFont(), 10, FontStyle.Bold), new SolidBrush(SetColor(lua.GetTextColor())), new Point(10, old_y)); ActorText_str = ""; } } } 

Sprites et PictureBox


Comme vous le savez, PictureBox a deux couches d'image. Image de fond et image. Dans les premières versions du moteur, j'ai utilisé environ 5 boîtes pour dessiner des sprites. Un tel système présentait plusieurs gros inconvénients:

  • Problèmes de transparence dus à l'héritage à plusieurs niveaux
  • Présentation des formulaires lors de la mise à jour

Plus tard, j'ai créé l'algorithme via Graphics, il est donc devenu possible de dessiner des sprites autant que vous le souhaitez n'importe où.

 PictureBox ALeft; Bitmap SpriteListPic; //       // FreeMovePicture - ,    // posX, posY -    // Scale -  private void SpriteBoxesHolder(Image FreeMovePicture, int posX, int posY, float Scale = 2) { using(Graphics SpGr = Graphics.FromImage(SpriteListPic)) { SpGr.DrawImage(FreeMovePicture, posX * 2, posY * 2, FreeMovePicture.Size.Width / Scale, FreeMovePicture.Size.Height / Scale); } ALeft.Image = SpriteListPic; } 

LuaInterface et fonctionnalité de type try-catch


Un peu sur l'expérience avec LuaInterface:

  • Supplément pour un article sur LuaInterface sur LuaTable: Pour la plupart des choses, vous pouvez vous passer de fonctions en utilisant uniquement des tableaux.

     lua.NewTable("Scene"); //   //     TextColor public string GetTextColor() { return (string)lua.GetTable("Font")["TextColor"]; } 
  • Problèmes de fuites de mémoire lors de l'utilisation de tables
     string TableReaderS(string Table, string Key) { string Ret = ""; using (LuaTable tabx = lua.GetTable(Table)) { Ret = (string)tabx[Key]; } return Ret; } int TableReaderI(string Table, string Key) { int Ret = -1; using (LuaTable tabx = lua.GetTable(Table)) { Ret = (int)(double)tabx[Key]; //   int ... } return Ret; } 

    Chaque fois que vous appelez GetTable , vous obtenez un nouvel objet CLR qui référence la table Lua référencée par cette variable Lua globale.
  • Si vous n'êtes pas sûr de la valeur du tableau:

     try { Size = TableReaderI("Scene", "Image" + Convert.ToString(num) + "Scale"); } catch (Exception ex) { Size = 2; } 

    Lua renverra une valeur, mais pas le fait qu'il s'agira d'un nombre. Par conséquent Catch (Exception) . L'option avec double.TryParse ne convient pas ici, car lua.GetTable ne renvoie pas une chaîne, mais un certain type, qui est LuaTable et peut être converti en chaîne si une telle valeur lui a été affectée, également avec un nombre.

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


All Articles