Pembekalan pengembangan mesin 2D pada WinForms

Pendahuluan


Beberapa tahun yang lalu saya datang dengan ide untuk menulis mesin Visual Novel di WinForms. Mengapa menggunakan WinForms? Karena saya tidak tahu caranya. Secara berkala, mesin telah menerima dan menerima pembaruan hingga hari ini. Selama waktu ini, sedikit kode yang berguna telah terakumulasi yang dapat digunakan di mana-mana.

Membagi teks menjadi beberapa baris


// 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 = ""; } } } 

Sprite dan PictureBox


Seperti yang Anda ketahui, PictureBox memiliki dua lapisan gambar. BackgroundImage & Gambar. Pada versi pertama mesin, saya menggunakan sekitar 5 kotak untuk menggambar sprite. Sistem seperti itu memiliki beberapa kelemahan besar:

  • Masalah dengan transparansi karena pewarisan multi-level
  • Susun formulir saat memperbarui

Kemudian, saya membuat algoritma melalui Grafik, sehingga menjadi mungkin untuk menggambar sprite sebanyak yang Anda suka di mana saja.

 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 dan fitur coba-tangkap seperti


Sedikit tentang pengalaman dengan LuaInterface:

  • Tambahan untuk artikel tentang LuaInterface tentang LuaTable: Untuk sebagian besar hal, Anda dapat melakukan tanpa fungsi hanya menggunakan tabel.

     lua.NewTable("Scene"); //   //     TextColor public string GetTextColor() { return (string)lua.GetTable("Font")["TextColor"]; } 
  • Masalah dengan kebocoran memori saat bekerja dengan tabel
     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; } 

    Setiap kali Anda memanggil GetTable , Anda mendapatkan objek CLR baru yang mereferensikan tabel Lua yang dirujuk oleh variabel Lua global ini.
  • Jika Anda tidak yakin apa nilai dalam tabel sama sekali:

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

    Lua akan mengembalikan nilai, tetapi bukan fakta bahwa itu akan menjadi angka. Karena itu Tangkapan (Pengecualian) . Opsi dengan double.TryParse tidak cocok di sini, karena lua.GetTable tidak mengembalikan string, tetapi tipe tertentu, yang LuaTable dan dapat dikonversi ke string jika diberi nilai seperti itu, juga dengan angka.

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


All Articles