
Perpustakaan teks-tampilan yang berpusat di sekitar label yang mencetak dari waktu ke waktu, dengan efek dan gaya.
Dengan kata lain, ini membawa lebih banyak fitur ke rendering teks di libgdx.
Seperti apa ini? Sedikit sesuatu seperti ini ...
Atau mungkin seperti ini ...

Jika Anda lebih suka menonton video daripada membaca teks ini, Raymond "Raeleus" Buckley membuat video yang meliput sebagian besar Textratypist! Ini mencakup beberapa hal yang tidak dilakukan file ini, seperti penggunaan komposer kulit, jadi itu adalah arloji yang bagus.
Ada label "normal" di sini dalam bentuk Textralabel, yang bertindak hampir persis seperti label di scene2d.ui, tetapi memungkinkan gaya yang dibahas di bawah ini. Banyak penggunaan mungkin lebih suka mengetiklabel!
TypingLabel adalah widget adegan2d.ui yang cukup normal, dan memperluas Textralabel. Namun, itu menempatkan surat di layar satu per satu, kecuali jika disuruh melompat ke depan. Ini adalah efek nostalgia yang ditemukan di banyak game teks yang lebih tua, dan sepertinya mesin tik memasang setiap huruf pada tingkat yang lebih lambat dari instan.
Ya, ia memiliki lebih dari mode mesin tik! Teks dapat digantung di atas dan kemudian jatuh ke tempatnya. Itu bisa melompat ke atas dan ke bawah dalam gelombang panjang. Itu bisa goyah dan bergidik, seolah -olah itu sakit. Ini dapat berkedip dalam berbagai warna, bergerak dalam gradien dengan lancar di antara dua warna, atau melintasi seluruh pelangi. Banyak pilihan; sangat menyenangkan. Efek hampir sama dengan dalam pengetikan-label, tetapi ada beberapa perubahan dan penambahan. Anda dapat memeriksa wiki Textratypist untuk informasi lebih lanjut.
Pada 0.10.0, ada banyak efek baru. Jolt, spiral, putaran, kerumunan, menyusut, muncul, detak jantung, carousel, squash, skala, putar, perhatian, highlight, tautan, pemicu, stylist, meriam, laut, sputter, dan instan semuanya baru mengenal Textratypist (bukan dalam pengetikan label). Anda dapat melihat instruksi penggunaan dan sampel gif di halaman Tokens Wiki Textratypist. Sebagian besar efek ini menggunakan opsi penskalaan dan rotasi yang halus yang dapat digunakan oleh efek mulai dari Textratypist 0.5.1. Beberapa memanfaatkan pelacakan mouse, yang baru dalam 0.7.0, seperti bagaimana tautan hanya menanggapi klik pada berbagai teks.
Anda mungkin ingin membuat TypingLabel S bahkan di mana Anda tidak memerlukan efek mengetik, karena TextraLabel tidak menangani efek apa pun. Anda dapat menghubungi skipToTheEnd() pada TypingLabel atau (dalam 0.7.0 dan lebih tinggi) di beberapa kelas lain untuk memungkinkan TypingLabel digunakan untuk teks diam dengan efek.
Berbagai token standar juga ada, dan ini dapat memanipulasi efek pengetikan, penggantian variabel, dan hal -hal bermanfaat lainnya:
{WAIT=f} menyebabkan efek pengetikan berhenti dan tunggu f detik, sebagai float.{SPEED=f} mengubah waktu yang diperlukan untuk mengetik mesin terbang khas, dari default 0.035 ke f .{SLOWER} membuat semua mesin terbang memakan waktu 2x selama mengetik.{SLOW} Membuat semua mesin terbang membutuhkan 1,5x selama mengetik.{NORMAL} Membuat semua mesin terbang mengambil 1x normal untuk mengetik.{FAST} membuat semua mesin terbang membutuhkan 0,5x selama mengetik.{FASTER} membuat semua mesin terbang membutuhkan 0,25x selama mengetik.{NATURAL=f} membuat mesin terbang membutuhkan waktu lebih atau kurang waktu untuk mengetik, tetapi sebaliknya sama dengan {SPEED=f} .{COLOR=s} mengubah warna teks; Ini memiliki banyak pilihan, sehingga Anda dapat memiliki "pink abu -abu gelap".{STYLE=s} mengubah gaya teks (lihat di bawah); Ini memiliki banyak pilihan.{SIZE=f} mengubah ukuran teks (kasar, dalam kenaikan 25%); Ini membutuhkan F sebagai persentase dari 0 hingga 375.{FONT=name} mengubah font, jika ada fontFamily yang tersedia, dengan mencari name .{CLEARCOLOR} Mengatur warna teks ke warna default, yang biasanya putih.{CLEARSIZE} Mengatur ukuran menjadi 100%.{CLEARFONT} Mengatur font ke font asli (tidak menggunakan fontFamily).{ENDCOLOR} Mengatur warna teks ke warna default, yang biasanya putih. Ini sama dengan {CLEARCOLOR} .{VAR=name} akan diganti dengan string apa pun yang dikaitkan dengan name variabel.{IF=name;choice0=cat;choice1=b;=default} memeriksa nama variabel, dan membandingkannya dengan setiap pilihan dalam token.name sama dengan pilihan, token digantikan oleh nilai pilihan, seperti cat .default .{EVENT=name} memicu acara, mengirim name ke TypingListener, ketika pengetikan mencapai titik ini.{RESET} Mengatur semua perubahan pemformatan dan kecepatan pada nilai awal mereka.label.setDefaultToken() dapat digunakan untuk mengubah nilai awal, jadi teks default ke beberapa pengaturan yang berbeda.{SKIP=n} melompat ke depan dalam efek pengetikan, langsung menampilkan n karakter. Efek Gunakan kawat gigi curly secara default, tetapi jika kawat gigi keriting bukan pilihan yang baik untuk teks Anda (seperti dalam file i18n), Anda dapat menggunakan [-EFFECT] sebagai setara dengan {EFFECT} .
Perpustakaan ini memperluas apa yang dapat dilakukan oleh pengetikan asli-ini memungkinkan gaya diterapkan pada teks, seperti tebal, garis bawah, miring, superskrip, dll. Terkait dengan gaya adalah perubahan skala, yang dapat menyusut atau memperbesar teks tanpa mengubah font Anda, dan fitur "Font Family". Font dapat diberi "keluarga" dari font dan nama lain yang akan digunakan untuk merujuk mereka; Ini bertindak seperti gaya normal, tetapi sebenarnya mengubah font apa yang digunakan untuk menggambar. Daftar lengkap gaya panjang, tetapi tidak sedetail token efeknya. Anda dapat mengaktifkan gaya dengan sesuatu seperti markup warna libgdx, dalam tanda kurung persegi seperti [*] , atau (jika markup digunakan dalam TypingLabel ) Anda dapat menggunakan {STYLE=BOLD} untuk melakukan hal yang sama. Tag dan nama gaya keduanya tidak sensitif, tetapi nama warna peka case. Sintaks persegi yang digunakan terutama tanda baca, dan terinspirasi oleh sintaks penurunan harga (yang digunakan GitHub, di antara tempat-tempat lain).
Dalam daftar berikut, setiap entri terlihat seperti:
[*] Mengaktifkan mode tebal. Dapat menggunakan nama gaya * , B , BOLD , STRONG .
Itu berarti Anda selalu dapat menggunakan [*] untuk menghidupkan atau mematikan mode tebal, dan dalam TypingLabel Anda juga dapat menggunakan sintaks case-sensitif {STYLE=*} , {STYLE=B} , {STYLE=BOLD} , atau {STYLE=STRONG} untuk melakukan hal yang sama.
Daftar lengkap gaya dan tag braket persegi terkait:
[] Membatalkan perubahan terakhir untuk gaya/warna/pemformatan, meskipun tidak melakukan apa pun untuk efek mengetiklabel.[] dalam markup bitmapfont libgdx, tetapi bekerja lebih dari warna.[ ] Mengatur ulang semua gaya/warna/pemformatan dan efek ke keadaan awal.[] menjadi [ ] baru.[(label)] sementara menyimpan keadaan pemformatan saat ini sebagai label , sehingga dapat diterapkan kembali nanti.label dapat berupa string alfanumerik. Mungkin seharusnya tidak memiliki spasi di dalamnya, tetapi dapat memiliki garis bawah.[ label] Menyampaikan kembali keadaan pemformatan yang disimpan sebagai label , jika ada.[*] Mengaktifkan mode tebal. Dapat menggunakan nama gaya * , B , BOLD , STRONG .[/] mengubah mode miring (seperti huruf miring). Dapat menggunakan nama gaya / , I , OBLIQUE , ITALIC .[^] Mengaktifkan mode superscript (dan mematikan mode subskrip atau midscript). Dapat menggunakan nama gaya ^ , SUPER , SUPERSCRIPT .[=] mengubah mode midscript (dan mematikan superscript atau mode subskrip). Dapat menggunakan nama gaya = , MID , MIDSCRIPT .[.] Mengaktifkan mode subskrip (dan mematikan mode superscript atau midscript). Dapat menggunakan nama gaya . , SUB , SUBSCRIPT .[_] Mode Garis Garis Garis Besar. Dapat menggunakan nama gaya _ , U , UNDER , UNDERLINE .[~] Mengalihkan Mode Strikethrough. Dapat menggunakan nama gaya ~ , STRIKE , STRIKETHROUGH .[!] Mengaktifkan semua mode kasus atas (mengganti mode case lainnya). Dapat menggunakan nama gaya ! , UP , UPPER .[,] mengubah semua mode kasus rendah (mengganti mode case lainnya). Dapat menggunakan nama gaya , LOW , LOWER .[;] Mengaktifkan memanfaatkan setiap mode kata (mengganti mode kasus lainnya). Dapat menggunakan nama gaya ; , EACH , TITLE .[%DDD] , di mana DDD adalah persentase dari 0 hingga 375, skala teks ke beberapa. Dapat digunakan dengan {SIZE=150%} , {SIZE=%25} , atau juga, {STYLE=200%} atau {STYLE=%125} . Menghapus mode khusus apa pun.[%] Dengan set teksnya sendiri ke skala 100% default dan menghapus mode khusus apa pun. Dapat digunakan dengan {STYLE=%} .[%?MODE] Menghapus skala dan menetapkan mode khusus; Mode tercantum di bawah ini.[%^MODE] Menghapus skala dan menetapkan mode khusus pada saat yang sama dengan mode caps kecil; Mode tercantum di bawah ini.[@Name] , di mana nama adalah kunci/nama dalam variabel family font ini, mengganti jenis huruf saat ini ke yang bernama. Dapat digunakan dengan {STYLE=@Name} .[@] Dengan mengatur ulang jenis hurufnya sendiri ke font ini, mengabaikan keluarganya. Dapat digunakan dengan {STYLE=@} .[#HHHHHHHH] , di mana hhhhhhhh adalah warna hex rgb888 atau rgba8888 int, mengubah warnanya. Ini adalah tag {COLOR=#HHHHHHHH} normal.[COLORNAME] , di mana Colorname adalah nama atau deskripsi warna yang akan dicari secara eksternal, mengubah warnanya.ColorUtils.describe() , yang mencoba menemukan warna apa pun dari Palette dengan nama, dan juga memungkinkan menggambarkan campuran warna atau perubahan sederhana seperti "cahaya" atau "kusam".Colors Libgdx, dan juga sekitar 50 nama warna kecil tambahan (dari warna-warni-gdx).Palette dengan rona, dengan cahaya, atau dengan nama.[RED] , [green yellow] , [light blue] , [duller orange] , [darker rich BLUE lavender] , [pale pink orange] , dan [deeper green navy] .Font setColorLookup() dengan implementasi ColorLookup Anda sendiri untuk melakukan apa yang Anda inginkan di sini.| , yang memungkinkan mencari warna dengan nama yang berisi tanda baca. Misalnya, [|;_;] akan mencari warna yang disebut ;_; , "Warna Kesedihan," dan tidak akan bertindak seperti [;] .ColorLookup khusus mungkin tidak, juga tidak ColorLookup.INSTANCE , yang mencari nama string di kelas warna libgdx kata demi kata.{COLOR=SKY} (Warna yang dapat ditangani segera) atau dengan deskripsi, seperti {COLOR=lighter orange-red} , bahkan di dalam tag seperti {GRADIENT} .[+region name] , di mana nama wilayah adalah nama Textureregion dari Textureatlas terdaftar, tidak akan mengubah gaya, tetapi akan menghasilkan Textureregion yang sejalan dengan teks.KnownFonts.addEmoji() untuk menambahkan 3000+ ikon twemoji ke font.[+saxophone] dan [+?] Akan masing -masing menampilkan ikon saksofon.[+call me hand, medium-dark skin tone] dan [+??] .KnownFonts.addGameIcons() , yang menambahkan ikon dari koleksi Game-icons.net. Ini menggunakan sintaks yang sama: [+crystal-wand] .[-SOME_EFFECT] setara dengan menggunakan kawat gigi keriting di sekitar SOME_EFFECT ; Perhatikan dasbor yang ditambahkan.Mode khusus yang dapat digunakan sebagai pengganti penskalaan adalah:
black outline atau blacken , yang dapat digunakan dengan nama gaya BLACK OUTLINE atau BLACKEN .white outline atau whiten , yang dapat digunakan dengan nama gaya WHITE OUTLINE atau WHITEN .shiny , yang dapat digunakan dengan nama gaya SHINY , SHINE , atau GLOSSY .drop shadow atau shadow , yang dapat digunakan dengan nama gaya SHADOW , DROPSHADOW , atau DROP SHADOW .error , yang dapat digunakan dengan ERROR nama gaya, REDLINE , atau RED LINE .Font.PACKED_ERROR_COLOR .warn , yang dapat digunakan dengan nama -nama gaya WARN , YELLOWLINE , atau YELLOW LINE .Font.PACKED_WARN_COLOR .note , yang dapat digunakan dengan NOTE nama gaya, INFO , BLUELINE , atau BLUE LINE .Font.PACKED_NOTE_COLOR .jostle , yang dapat digunakan dengan nama gaya JOSTLE , WOBBLE , atau SCATTER .[%?] .small caps , yang dapat digunakan dengan nama gaya SMALLCAPS atau SMALL CAPS .[%^] . Itu tidak dapat digunakan dengan sintaks [%?small caps] ; itu membutuhkan pembalap. Mode tutup kecil dapat digunakan dengan salah satu mode lain kecuali untuk berdesak -desakan, dengan mengubah %? untuk %^ . Selain itu, tidak ada dua mode yang dapat aktif pada saat yang sama, dan tidak ada mode yang dapat digunakan bersamaan dengan penskalaan.
Perhatikan bahwa mode menggunakan sintaks yang sedikit berbeda untuk menghindari menjadi bingung dengan nama warna. Saat menggunakan tanda kurung persegi, masing-masing nama yang diberikan di sini dalam huruf kecil harus didahului oleh %? Sebagian besar waktu (topi kecil dan berdesak -desakan). Itu berarti mengaktifkan "kesalahan" mode bawah garis merah, Anda menggunakan tag bracket persegi [%?error] . Jika menggunakan markup Curly-Brace untuk TypingLabel, Anda akan menggunakan nama yang diberikan di sini di kelas atas, dan dapat menggunakannya seperti nama gaya lainnya: {STYLE=ERROR} , misalnya. Mode topi kecil, seperti yang disebutkan, khusus; Biasanya diaktifkan dengan [%^small caps] , tetapi juga dapat diaktifkan dengan [%^] , dan juga dapat dicampur dengan mode lain kecuali berdesak -desakan dengan mengubah %? untuk %^ . Setiap kali topi kecil aktif, tag braket persegi menggunakan %^ bukan %? . Mode berdesakan juga istimewa; Biasanya diaktifkan dengan [%?jostle] , tetapi juga dapat diaktifkan dengan [%?] Dengan sendirinya. Dorong tidak bisa dicampur dengan topi kecil.
Mode khusus sedikit terlalu rumit dalam hal sintaks karena saya kehabisan tanda baca yang bisa saya gunakan. Contoh umum dari garis hitam di sekitar teks putih dapat dicapai dengan [WHITE][%?blacken]Outlined![%][GRAY] . (Contohnya menggunakan GRAY sebagai warna normal, tetapi Anda juga bisa menggunakan [ ] untuk mengatur ulang warna ke warna dasar apa pun yang dikonfigurasi pada Layout atau label yang memegangnya. Perhatikan bahwa [ ] juga mengatur ulang ukuran, mode, dan, well, semuanya.)
Beberapa kombinasi efek tersedia menggunakan {VAR=ZOMBIE}urgh, brains...{VAR=ENDZOMBIE} sintaks:
{VAR=FIRE} mengubah teks berikut untuk memiliki warna yang berubah -embangkan. Anda dapat mengakhirinya dengan {VAR=ENDFIRE} .{VAR=SPUTTERINGFIRE} Mengubah teks berikut untuk mengubah warna yang berapi -api dan mengubah ukuran seperti api popping. Anda dapat mengakhirinya dengan {VAR=ENDSPUTTERINGFIRE} .{VAR=BLIZZARD} mengubah teks berikut menjadi goyah di angin dan menggunakan warna es, putih ke biru muda. Anda dapat mengakhirinya dengan {VAR=ENDBLIZZARD} .{VAR=SHIVERINGBLIZZARD} mengubah teks berikut menjadi goyah dalam angin dan menggunakan warna es, putih ke biru muda, ditambah itu akan secara acak membuat glyph "menggigil" seolah -olah dingin. Anda dapat mengakhirinya dengan {VAR=ENDSHIVERINGBLIZZARD} .{VAR=ELECTRIFY} Mengubah teks berikut menjadi warna ungu abu -abu kusam dan secara acak membuat mesin terbang menjadi kuning muda dan bergetar. Anda dapat mengakhirinya dengan {VAR=ENDELECTRIFY} .{VAR=ZOMBIE} Mengubah teks berikut menjadi "sage zaitun gelap" (warna abu-abu hijau kusam), membuat mesin terbang berputar ke kiri dan kanan perlahan dan acak, membuat mesin terbang turun dan naik kembali secara acak, dan ketika mereka pertama kali muncul, memiliki mesin terbang muncul dari baseline (seolah-olah cakar dari harta). Anda dapat mengakhirinya dengan {VAR=ENDZOMBIE} . Ini didefinisikan dalam TypingConfig.initializeGlobalVars() , dan Anda dapat menentukan kombinasi Anda sendiri dengan cara yang persis sama dengan ini didefinisikan. Misalnya, FIRE didefinisikan
TypingConfig . GLOBAL_VARS . put ( "FIRE" , "{OCEAN=0.7;1.25;0.11;1.0;0.65}" );
TypingConfig . GLOBAL_VARS . put ( "ENDFIRE" , "{ENDOCEAN}" ); Efek OCEAN tidak peduli warna apa yang digunakannya; Ini hanya mendefinisikan pola perkiraan cara transisi antara warna -warna tersebut. Itu berarti, berlawanan dengan intuisi, FIRE paling baik diimplementasikan dengan OCEAN daripada GRADIENT . Menggunakan nama FIRE mungkin lebih disukai daripada OCEAN , jadi VAR global ada di sini karena alasan itu.
Kemampuan untuk menyimpan status pemformatan menggunakan label memungkinkan beberapa perakitan string markup yang lebih kompleks dari berbagai sumber. Anda dapat menyebut sesuatu seperti font.storeState("spooky", "[/][darker gray][@?blacken]") untuk secara permanen menyimpan keadaan pemformatan itu (teks abu -abu yang lebih gelap dengan garis hitam) dalam font , dan kemudian dapat mengatur ulang ke keadaan itu hanya dengan memasukkan [ spooky] (perhatikan ruang pembukaan). Anda juga dapat membuat beberapa teks yang dapat dimasukkan yang menyimpan pemformatan saat ini sebelum menulis apa pun, dan mengatur ulang pemformatan kembali ketika selesai menulis. Itu akan menggunakan sesuatu seperti "[(previous)][ ][BLUE][^][[citation needed][ previous]" - jika string ini dimasukkan di tengah blok teks yang lebih besar, ia tidak akan mengubah pemformatan di sekitarnya, tetapi akan menggunakan Superscript Biru untuk teksnya sendiri ( [citation needed] ) dan tidak akan menggunakan format blok di sekitarnya sendiri. Jika Anda memiliki beberapa tag toko negara dengan label yang sama, nilai yang terkait dengan label itu akan berubah saat tag tersebut ditemui. Anda mungkin ingin menggunakan label unik untuk menghindari secara tidak sengaja mengubah nilai label lain, tetapi ini biasanya tidak diperlukan.
Textratypist memanfaatkan kelas Font baru, yang merupakan perombakan penuh dari Bitmapfont Libgdx yang pada dasarnya tidak memiliki kode dengan leluhurnya. Sebuah font memiliki berbagai kualitas yang memberikan kekuatan lebih dari Bitmapfont, sebagian besar berasal dari cara menyimpan (dan menyediakan) gambar mesin terbang sebagai teksturegion dalam peta. Tidak ada yang benar -benar mencegah Anda menambahkan gambar Anda sendiri ke mapping font, selama mereka memiliki informasi yang diperlukan untuk digunakan sebagai mesin terbang tekstual, dan kemudian menempatkan gambar -gambar itu dengan teks Anda. Ini digunakan untuk mengimplementasikan emoji, sebagai salah satu contoh, dan dapat digunakan untuk ikon khusus dan emoji.
Textratypist mendukung font bitmap standar dan juga font bidang jarak, menggunakan SDF atau MSDF. TypingLabel akan secara otomatis mengaktifkan shaderprogram yang dibutuhkan jenis bidang jarak yang sesuai (jika membutuhkannya) dan menonaktifkannya setelah memberikan dirinya. Anda dapat mengubah perilaku ini dengan secara manual memanggil metode Font.enableShader(Batch) pada font Anda, dan mengubah batch kembali ke shaderprogram pilihan Anda yang lain dengan Batch.setShader() metode (sering, Anda hanya lulus nol di sini untuk mengatur ulang shader). Perhatikan bahwa font SDF dan MSDF perlu diberitahu tentang perubahan ukuran layar, menggunakan Font.resizeDistanceField() atau metode berbagai tempat lain yang menyebut resizeDistanceField() . Sejak 1.0.0, Anda biasanya ingin menggunakan kelebihan beban yang mengambil Viewport ; Jika Anda tidak memiliki Viewport , Anda tidak perlu kelebihan itu. Setiap font bidang jarak yang saat ini Anda render perlu memiliki ukuran bidang jarak yang diubah ukurannya ketika jendela mengubah ukuran, di ApplicationListener.resize() .
Ada beberapa pengaturan font yang telah dikonfigurasi sebelumnya di KnownFonts ; Dokumentasi untuk setiap Font Getter mengatakan file apa yang diperlukan untuk menggunakan font itu. File .fnt lama telah dipindahkan ke sini . Anda dapat melihat pratinjau dan deskripsi semua font yang diketahui di sini. Setelah dikenal tidak diperlukan untuk banyak font sejak versi 1.0.0, karena font .dat sekarang dibuat semua dengan alat yang sama (fontwriter), dan cenderung dikonfigurasi dengan benar di luar kotak. Variasi jenis font tidak luar biasa, tetapi itu harus menjadi titik awal yang baik. Satu hal yang menyenangkan untuk dicatat adalah metode [@Medieval] KnownFonts.getStandardFamily() yang diketahui.
Font di sini menggunakan ekstensi file .dat (yang hanya berarti data biner tanpa format file tertentu). Mereka adalah versi terkompresi dari font .Json yang lebih besar yang diproduksi oleh FontWriter. Kompresi yang mereka gunakan kompatibel dengan GWT, sehingga file .dat ini dapat digunakan pada target platform libgdx apa pun. Anda masih dapat menggunakan file .fnt yang lebih lama tanpa masalah, dan beberapa file .fnt masih digunakan di sini (kebanyakan untuk font piksel). Anda juga biasanya membutuhkan .png dengan setiap font, meskipun bisa di atlas.
File lisensi untuk setiap font disertakan dalam folder yang sama, di knownFonts di sini. Semua font yang disediakan di sini diperiksa untuk memastikan lisensi mereka mengizinkan penggunaan komersial tanpa biaya, dan semuanya melakukannya. Sebagian besar membutuhkan atribusi; Periksa lisensi untuk detailnya.
DikenalFonts mencakup beberapa cara lain untuk mengonfigurasi instance font yang ada dengan menambahkan textureatlas ke mesin terbang yang mereka ketahui. Ini termasuk beberapa ikon tekstur yang ada dan ... emoji!
Ikon Twemoji juga hadir dalam atlas lebih dari 3000 32x32 gambar; KnownFonts.addEmoji() dapat mendaftarkannya dengan font sehingga sintaks [+name] yang disebutkan di atas dapat menggambar emoji inline. Demikian pula, atlas dari over-4000 60x60 ikon hadir dari Game-icons.net, dan KnownFonts.addGameIcons() dapat mendaftarkannya dengan font. Baik atlas Twemoji dan Game-Icons.NET tidak dapat didaftarkan dalam satu font secara bersamaan; Tidak ada cukup ruang kosong di bagian unicode yang dapat mereka gunakan dengan aman. Jalannya adalah dengan menggunakan fitur fontFamily, dan menambahkan font hanya untuk ikon atau hanya untuk emoji ke keluarga. Ada metode yang ada untuk ini; KnownFonts.getGameIconsFont() memungkinkan Anda mendapatkan font yang dimaksudkan hanya untuk menampilkan ikon permainan, dengan beberapa upacara di sekitar penggunaannya. [@Icons][+rooster][@] adalah contoh cepat bagaimana Anda bisa beralih ke font yang diproduksi oleh getGameIconsFont() , menggambar ikon, dan beralih kembali.
Ada pratinjau untuk Twemoji di sini, dengan emoji char dan nama untuk mencari setiap gambar. Demikian juga, ada pratinjau untuk ikon Game-Icons.net di sini, dengan hanya nama yang diperlukan untuk mencari setiap gambar. Ingatlah bahwa karena gambar Game-Icons.NET berwarna putih murni dengan transparansi, Anda dapat mengotori mereka warna apa pun yang Anda inginkan menggunakan sintaks [RED] [light dull green] , atau [#0022EEFF] standar.
File lisensi untuk twemoji dan gambar gim-icons.net disertakan dalam knownFonts , di sebelah file lisensi untuk font. Sementara Twemoji memiliki persyaratan sederhana untuk atribusi, ikon permainan membutuhkan atribusi untuk beberapa kontributor individu; Lihat akhir dokumen ini untuk daftar, yang dapat dan harus Anda salin untuk memberikan kredit kepada semua orang.
Ada juga emoji seni line dari OpenMoji, dan versi penuh warna dari emoji yang sama. Ini mungkin lebih cocok untuk gaya seni proyek tertentu.
Anda dapat memutar mesin terbang individu (jika Anda menggambarnya secara individual) atau memutar seluruh blok teks sebagai tata letak, menggunakan kelebihan opsional Font.drawGlyph() atau Font.drawGlyphs() . Efek khusus untuk TypingLabel juga dapat secara individual mengubah rotasi mesin terbang apa pun, serta posisi dan skalanya pada x dan/atau y. Anda dapat memutar Textralabel atau TypingLabel dengan menggunakan metode setRotation() mereka, dan rotasi sekarang akan bertindak dengan benar untuk label dengan latar belakang dan/atau dengan pengaturan penyelarasan yang berbeda. Asal untuk rotasi dapat diatur dalam label, dan seluruh label akan berputar di sekitar titik asal.
Anda juga dapat, untuk beberapa font, memiliki karakter yang menggambar kotak dan elemen blok dihasilkan secara otomatis. Ini membutuhkan karakter blok putih solid (dari ukuran apa pun, biasanya 1x1) yang ada dalam font pada ID 9608 (indeks blok penuh Unicode, 'u2588' ). Ini juga memungkinkan jaminan yang lebih baik untuk garis bawah dan karakter yang terhubung dengan benar, dan tanpa noda di mana dua garis bawah atau tanda hubung saling tumpang tindih. Font berupaya mengaktifkan ini dalam beberapa kasus, atau dapat diatur dengan parameter, tetapi jika gagal maka ia kembali menggunakan garis bawah untuk garis bawah dan tanda hubung untuk strikethrough. Semua font di KnownFonts dikonfigurasi untuk menggunakan blok padat atau untuk secara khusus menghindarinya karena font itu membuat lebih baik tanpa itu. Perhatikan bahwa jika Anda membuat Font dari libgdx BitmapFont , ini default untuk tidak mencoba membuat mesin terbang kisi, karena bitmapfont jarang memiliki arang blok padat yang sesuai.
Beberapa konfigurasi tambahan dimungkinkan untuk karakter menggambar kotak yang sebenarnya digunakan untuk tujuan itu (bukan hanya garis bawah atau coretan). Anda dapat mengatur boxDrawingBreadth pada Font ke beberapa pengganda untuk membuat garis yang menggambar kotak lebih tebal atau lebih tipis, tanpa mengubah cara mereka terhubung satu sama lain.
Berbagai fitur memungkinkan konfigurasi tambahan di sini. Anda dapat mengatur boldStrength ke beberapa nilai selain dari default 1 jika Anda ingin lebih atau kurang ruang ekstra yang diterapkan dari gaya tebal. Anda juga dapat mengatur obliqueStrength untuk mengubah sudut condong yang ditarik oleh teks miring. Warna untuk berbagai efek dapat diubah sesuai kebutuhan; font.PACKED_SHADOW_COLOR dapat diubah untuk menggunakan warna bayangan yang lebih gelap, lebih ringan, lebih buram, atau lebih transparan, misalnya. font.PACKED_BLACK mempengaruhi mode garis hitam, dan font.PACKED_WHITE mempengaruhi garis besar putih dan mode mengkilap. Ada mode serupa untuk mengubah warna kesalahan, peringatan, dan catatan menggarisbawahi. Semua konfigurasi warna ini berlaku per instance font, sehingga Anda dapat memiliki dua objek font menggunakan jenis huruf yang sama tetapi dengan warna yang berbeda dikonfigurasi.
Mulai dalam rilis 0.4.0, ada berbagai widget yang menggantikan rekan adegan2d.ui mereka dan menukar Label untuk TextraLabel , memungkinkan Anda untuk menggunakan markup di dalamnya. Widgetnya adalah ImageTextraButton , TextraButton , TextraCheckBox , TextraDialog , TextraLabel , TextraListBox , TextraTooltip , dan TextraWindow , ditambah versi alternatif masing -masing yang menggunakan TypingLabel alih -alih TextraLabel dan memiliki Typing dalam nama mereka.
Sementara TextArea belum didukung mitra untuk TextArea direncanakan, dan belum berhasil. TextraLabel default untuk mendukung beberapa baris, dan mungkin dapat mendukung beberapa penggunaan. TypingLabel memungkinkan pelacakan input juga, sehingga Anda dapat menggunakannya untuk membuat wilayah teks yang dapat dipilih - baca terus!
Pelacakan input telah menjadi opsi untuk TypingLabel dan kode yang menggunakannya sejak 0.7.0. Ini diperluas dalam 0.7.4 untuk memungkinkan teks dalam TypingLabel dibuat dapat dipilih dengan label.setSelectable(true) . Anda dapat mengakses teks yang dipilih saat ini dengan label.getSelectedText() atau menyalinnya langsung dengan label.copySelectedText() . Ketika pengguna menyelesaikan klik dan seret gerakan di atas TypingLabel (dan dapat dipilih), suatu acara dipicu juga; Anda dapat mendengarkan "*SELECTED" di TypingListener dan menyalin teks segera setelah dipilih, atau hanya menyalin ketika beberapa tombol ditekan. Fitur berguna lainnya yang menggunakan pelacakan input termasuk tag {LINK} , yang membuat rentang teks tautan yang dapat diklik ke alamat internet, {TRIGGER} , yang memicu acara di klik, dan beberapa tag lain yang merespons melayang mouse ( {ATTENTION} , {HIGHLIGHT} , dan {STYLIST} ). Ini hanya berfungsi untuk TypingLabel , bukan TextraLabel , jadi Anda mungkin ingin menggunakan TypingLabel dan memanggil skipToTheEnd() untuk memperlakukannya seperti teks diam yang terjadi untuk merespons input pengguna dan dapat menggunakan gaya animasi seperti {RAINBOW} .
Anda dapat membaca dalam file JSON kulit adegan2d.ui normal dengan varian di kelas Skin Libgdx, FWSkin (atau salah satu kelas yang memperluasnya), dan melakukan yang akan memuat gaya adegan2d.ui normal dan gaya Textratipist khusus. Gaya khusus biasanya hanya berbeda karena menggunakan Font , bukan BitmapFont , dan semuanya bersarang di kelas Styles di sini. Memiliki gaya khusus berarti satu font dapat digunakan kembali di lebih banyak tempat, tanpa harus membuat banyak salinan bitmapfont (satu per widget, kadang -kadang) ... yang merupakan kasus sebelum Textratypist 1.0.0. Biasanya, berubah dari kulit ke kulit fws sangat mudah. Kode seperti ini sebelumnya:
Skin skin = new Skin ( Gdx . files . internal ( "my-skin.json" ));Akan berubah menjadi ini setelah:
FWSkin skin = new FWSkin ( Gdx . files . internal ( "my-skin.json" )); Anda juga dapat menetapkan FWSkin ke variabel Skin , dan ini adalah pilihan yang paling kompatibel, karena variabel kulit Anda hanya akan menjadi Skin normal. Ada beberapa metode kenyamanan dalam FWSkin untuk menangani font lapangan jarak sedikit lebih mudah, jadi, jadi menggunakan FWSkin jika memungkinkan adalah ide yang bagus.
Mengapa itu disebut FWSkin , Anda bertanya -tanya? Nah, itu dapat memuat instance font dan bitmapfont dari file .fnt (membutuhkan konfigurasi kulit hanya untuk BitmapFont ), dan dapat melakukan hal yang sama untuk font JSON terstruktur, yang biasanya dibuat oleh fontwriter, atau FW. Tujuan awal FWSkin hanya untuk memuat dari .fnt dan .json/.dat file font dengan baik, tetapi ruang lingkupnya diperluas untuk memasukkan gaya baru.
Jika Anda terbiasa menggunakan Stripe, ada penggantian drop-in yang melakukan apa yang dilakukan FWSkin dan penanganan freetype yang dilakukan Stripe. Ini adalah ketergantungan FreeTypist tambahan, tersedia di repositori terpisah. Ini memungkinkan mengonfigurasi freetype dengan memiliki "com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator" di JSON kulit Anda, yang sering diproduksi oleh komposer kulit. Anda dapat mengambil kulit normal yang diproduksi oleh perawatan kulit dan kompatibel dengan garis dan menggunakannya dengan freetypist.
Anda bisa mendapatkannya melalui Gradle, tetapi mungkin merupakan opsi yang lebih baik untuk hanya menyalin dua file dari folder ini di Freetypist ke kode Anda sendiri. Terlepas dari bagaimana Anda bergantung pada freetypist, ia membutuhkan ketergantungan pada freetype (termasuk ketergantungan "platform" yang sesuai) dan pada textratypist (saat ini 1.0.0). Ketika fitur ditambahkan ke FWSkin dan Textratypist secara umum, Freetypist juga harus diperbarui.
Anda mungkin ingin mendapatkan Textratypist dengan Gradle! Ketergantungan untuk modul inti proyek libgdx terlihat seperti:
implementation " com.github.tommyettinger:textratypist:1.1.0 "Ini mengasumsikan Anda sudah bergantung pada libgdx; Textratypist tergantung pada versi 1.12.1 atau lebih tinggi. Persyaratan untuk 1.11.0 ditambahkan dalam Textratypist 0.5.0 karena beberapa perubahan yang melanggar kode tooltip di libgdx. Persyaratan untuk 1.12.1 ditambahkan dalam 1.0.0 karena beberapa hal mungkin berubah, tetapi 1.12.1 (atau rilis snapshot berikutnya) harus cukup mudah untuk diperbarui.
Jika Anda menggunakan GWT, ini harus kompatibel. Dibutuhkan ketergantungan ini dalam modul HTML:
implementation " com.github.tommyettinger:textratypist:1.1.0:sources "
implementation " com.github.tommyettinger:regexodus:0.1.16:sources "GWT juga membutuhkan ini di file gdxdefinition.gwt.xml (karena versi 0.7.7):
< inherits name = " regexodus.regexodus " />
< inherits name = " com.github.tommyettinger.textratypist " /> Dalam versi 0.7.4 dan sebelumnya, Anda akan menjadi versi sebelumnya dari kedua dependensi (Catatan, ini adalah versi lama ):
// OLD VERSION
implementation " com.github.tommyettinger:textratypist:0.7.4:sources "
implementation " com.github.tommyettinger:regexodus:0.1.13:sources " dan akan menggunakan warisan GWT ini sebagai gantinya:
<!-- OLD VERSION -->
< inherits name = " regexodus " />
< inherits name = " textratypist " />Regexodus adalah perpustakaan ekspresi reguler yang kompatibel dengan GWT yang digunakan untuk mencocokkan beberapa pola kompleks secara internal. Selain libgdx itu sendiri, Regexodus adalah satu -satunya ketergantungan yang dimiliki proyek ini. Warisan GWT berubah untuk textratypist dan untuk Regexodus karena ternyata menggunakan paket default dapat menyebabkan masalah nyata.
Setidaknya ada satu rilis di bagian rilis repo ini, tetapi Anda masih terdorong untuk menggunakan Gradle untuk menangani perpustakaan ini dan ketergantungannya.
Anda juga dapat menggunakan Jitpack untuk mendapatkan komit saat ini, yang bisa berguna jika ada rentang panjang antara rilis. Current gdx-liftoff and gdx-setup projects all can use JitPack dependencies without needing any extra configuration. You would use this dependency in your core module:
implementation ' com.github.tommyettinger:textratypist:de5a52f340 ' You can change de5a52f340 to any commit in the Commits tab of https://jitpack.io/#tommyettinger/textratypist , but you should not use -SNAPSHOT -- it can change without your requesting it to, which is not what you want!
You can also depend on FreeTypist using:
implementation " com.github.tommyettinger:freetypist:1.1.0 "(Now, FreeTypist 1.1.0 uses TextraTypist 1.1.0 .)
And if you target HTML and have FreeType working somehow, you would use this Gradle dependency:
implementation " com.github.tommyettinger:freetypist:1.1.0:sources "And this inherits line:
< inherits name = " com.github.tommyettinger.freetypist " />FreeType doesn't work out-of-the-box on GWT, though there is this].
Some parts of TextraTypist act differently from their counterparts in scene2d.ui and Rafa Skoberg's typing-label.
A big quirk is that Font and BitmapFont have some core disagreements about how to parse a .fnt file, and the results of creating a Font with new Font("MyFont.fnt") can be different from new Font(new BitmapFont(Gdx.files.internal("MyFont.fnt"))) . BitmapFont reads in padding information (and does so incorrectly according to the BMFont spec), where Font ignores padding information entirely. Some .fnt files have been made so they look right in libGDX by using padding, but they will look wrong in other frameworks/engines without that padding. Font compromises by allowing manual adjustment of x and y position for all glyphs (y often needs to be adjusted, either to a positive or negative value), as well as the width and height of glyphs (these are useful less frequently, but can be helpful to stretch or squash a font). It may take some tweaking to get a Font made from a BitmapFont to line up correctly with other widgets. You also may need to adjust the offsetX, offsetY, and maybe xAdvance parameters if you load an atlas (such as with addEmoji() or addGameIcons() ), and the adjustments may be quite different for a Font made from a BitmapFont vs. a Font made directly from a .fnt file. Since 0.8.1, Font can parse an extended version of the .fnt format that permits floats for any spatial metrics, and not just ints. No files actually use this here and now, because the Structured JSON files produced by fontwriter all use floats internally for everything.
If you load text from a file and display it, you can sometimes get different results from creating that text in code, or loading it on a different machine. This should only happen if the file actually is different -- that is, the files' line endings use rn when checked out with Git on a Windows machine, or n on MacOS or Linux machines. TextraTypist uses r to mark some kinds of "soft" line breaks that can be re-wrapped, and n for "hard" line breaks that must always create a new line. Having rn present generally shows up as two lines for every line break. A simple solution that works for many projects is to include a .gitattributes file in your project root, like the one here. This can be used to force all text files or all text files with a certain file extension to use LF mode, where only a single n is used for line breaks. It's still recommended to keep .bat files using CRLF mode, with rn used, for compatibility. Using .gitattributes from the start is a good idea, and should keep files exactly the same on all current OSes. Older Windows programs (like Notepad from Windows 7) aren't able to read n line endings, but the versions distributed with recent Windows can use n easily, as can almost all code-oriented text editors.
Colors can be written out as hex strings, like #FF7700 or #9783EDFF , given by name, or described using a simple syntax. The full list of (case-sensitive!) names can be seen ordered by hue, by lightness, or by name. You can take one or more of these color names, optionally add adjectives like "light" or "dull", and get a color that mixes the named colors and applies changes from the adjectives. There are some tricky things here:
Colors class, and are ALL_CAPS , sometimes with underscores. Other names are from colorful-gdx, and are lowercased single words. In a few cases, the same word refers to a different color value if you use ALL_CAPS or use lowercase ( ORANGE and orange are a good example).ColorUtils.unevenMix() . You can have a number after any color name, which assigns a weight to that color for the mixing. Higher numbers will cause their preceding color to have more effect on the result; any non-negative integers are allowed.0x00000100 ), or fully transparent very dark blue, which is used as a placeholder because visually it is the same as transparent black. If a color does wind up as 256 at the time it is finally rendered, it will probably be ignored.Palette with its static addColor() method. This makes another color name usable, but won't retroactively make that color name parse correctly. You may have to call methods like Font.markup() again, so it's best if you can change colors before using them.If you encounter issues with TypingLabel tokens, and you use ProGuard, the configuration for that tool needs a small addition:
-keep class com.github.tommyettinger.textra.** { *; }
There may be more strict versions of this ProGuard instruction possible, but at the very least, the com.github.tommyettinger.textra.effects package needs to be kept as-is, for reflection reasons. You may also need to ensure the com.github.tommyettinger.textra.Effect class is kept. Keeping all of TextraTypist should be perfectly fine for obfuscation purposes because this is an open-source library, but it does add a small amount to the size of the final JAR or APK. Right now, that appears to be 202 KB if you don't include any assets, so I wouldn't worry about it.
Distance field fonts might not be worth the hassle of resizing each font's distance field, but they do look much better at very large sizes than standard fonts. Using a standard font actually can look better for small-to-moderate size adjustments. The best approach when you don't need large text seems to be to use a large standard font texture, without SDF or MSDF, and scale it down as needed. Since 1.0.0, all fonts support emoji. Older versions did not support emoji in MSDF fonts.
If you happen to use both tommyettinger's TextraTypist library and tommyettinger's colorful-gdx library, you may encounter various issues. ColorfulBatch appeared to be incompatible because it uses an extra attribute per-vertex (compared to SpriteBatch), but an adjustment it already does seems to make it compatible without changes. Color description can be done by both colorful-gdx's SimplePalette and ColorUtils.describe() here, but descriptions would really need to use the RGBA color space to work as expected. Alternative shaders from colorful-gdx's Shaders class generally won't work correctly with the known fonts here and the defaults for neutral colors (here, white is the neutral color, but in most shaders that allow lightening, 50% gray is the neutral color). The easiest solution for all this is to use a normal, vanilla SpriteBatch for TextraTypist rendering, and whatever ShaderProgram or ColorfulBatch you want for colorful-gdx rendering.
Games that use custom Batch classes with additional attributes don't work out-of-the-box with Font , but it provides an extension point to allow subclasses to function with whatever attributes the Batch needs. Overriding Font.drawVertices() allows quite a lot of flexibility to handle unusual batches, and you can generally leave the custom Font unchanged other than the drawVertices() override. If you implement Font 's copy constructor just by calling super(font); , and still allow it to take a Font argument, then you can quickly take Fonts from KnownFonts and make copies using your subclass. The JavaDocs for Font.drawVertices() detail what each of the 20 floats passed in via an array to drawVertices are expected to do; custom Batches could have 24 or more floats and so would need to put the 20 existing floats in the positions their Batch expects.
Sometimes, you may need to enable or disable integer positioning for certain fonts to avoid a strange GPU-related visual artifact that seems to only happen on some Nvidia GPUs. When this happens, glyphs may appear a half-pixel or so away from where they should be, in seemingly randomly-picked directions. It looks awful, and the integer position code at least should resolve it most of the time. Integer positions don't work well if you use world units that span multiple pixels in length, but this bug is an absolute mystery, and also doesn't happen at all on integrated GPUs, and may not happen on AMD GPUs. How it behaves on Apple Silicon graphics, I also do not know. The Issues tab is always available for anyone who wants to try to debug this! It is possible that some fixes introduced in the 0.7.x releases may have already eliminated this bug, but I'm not especially optimistic that it is always gone.
The gdx-freetype extension produces BitmapFont outputs, and you can create a Font from a BitmapFont without any issues. However, FreeType's "Auto" hinting settings both look worse than they normally should with Font, and can trigger the GPU artifact covered immediately above. Instead of "AutoSlight", "AutoMedium", or "AutoFull" hinting, you can choose "Slight", "Medium", or "Full", which makes the font look more legible and avoids the GPU half-pixel-offset issue. I don't have any idea why this happens, but because hinting can be set either in the FreeType generator parameters or (if you use Stripe or FreeTypist from this repo) set in a Skin file with "hinting": "Full" , it isn't hard to fix.
There are some known issues with scaling, rotation, and integer-positioning in 0.7.5 through 0.9.0. You may see labels slide a little relatively to their backgrounds when rotated smoothly, and some (typically very small) fonts may need integer positions enabled to keep a stable baseline. Font debug lines may be quite incorrect in some of these versions, also, even if the text displays correctly to users. Scaling has improved significantly in 0.7.8, as has the handling of debug lines, but rotation still has some subtle bugs. A bug was fixed starting in 0.8.0 that made extra images in a Font (such as emoji) scale differently and drift when the Font they were mixed with scaled. That same bug also made an ordinary Font drift slightly as its scale changed; this is also fixed. Positions and sizes for background color and for images from an atlas have improved in 0.8.2, so selecting text shouldn't cover up text as badly with the background, and emoji should be fully surrounded by their selection background. Positions along the line vertically, while the text is scaled, improved in 0.8.3 so that the scaling is relative to the center of the line, rather than the bottom of the line. Some other code already expected scaling to be centered like that, so this change makes scaling look better, usually. In 0.9.0, integer positioning can still be set, but it does nothing; in practice, setting it was causing more problems than improvements. The few fonts that one would think would need integer positions (pixel fonts) actually look better without it. There are still some rotation issues in 0.9.0, though they mostly happen when the descent is configured to an extreme value, or sometimes other metrics. Lining up underline/strikethrough with rotated text is also a challenge.
Word wrap periodically seems to break and need fixing across different releases. The most recent time this happened was in 0.7.9, which also affected 0.8.0 and was fixed (I hope) in 0.8.1. A different wrapping-related bug was fixed more recently, in 0.8.3 ; this was rare, and only affected TypingLabel when some effects were present.
There's other issues with word wrap if you expect it to behave exactly like Label in libGDX. Here, we don't break words, even if a single word is longer than the width of a TextraLabel or TypingLabel . The reason for this is twofold: first, breaking words without proper hyphenation logic can change the meaning of those words, and second, fixing this could be a ton of work. I do intend to try to make this configurable and match Label by default in some near-future version. The word wrap behavior for multiple whitespace characters changed in version 0.10.0, and should be essentially correct now. Remember that word wrap only makes sense in the context of scene2d.ui for a widget (such as a TypingLabel or TextraLabel) if that widget has been sized by scene2d.ui, usually by being in a Table cell, or sometimes by being in a Container. You may need to add a label to a Table or Container, then set the width and/or height of that Cell or Container, to get wrap to act correctly.
A possibly-frequent issue (with an easy fix) that may start occurring with version 0.9.0 and later is that TextraTypist now requires Java 8 or higher. All modern desktop OSes support Java 8, and this has been true for 9 years. Android has supported Java 8 (language level, though only some APIs) for several years, and older versions can use "desugaring" to translate more-recent Java code to be compatible with (much) older Android versions. GWT has supported language level 8 for years, as well; 2.8.2, which libGDX is built with, allows using Java 8 features, and 2.11.0, which an alternate libGDX backend supports, allows using even more. RoboVM doesn't support any new APIs added in Java 8, but it has supported language level 8 from the start. TextraTypist doesn't use any APIs from Java 8, but does now use functional interfaces and method references. Having these features allows us to remove some nasty reflection-based code, and that in turn helps usage on platforms where reflection is limited, such as GWT and Graal Native Image. GWT was able to work before, but Graal Native Image would have needed a lot of configuration to be added for every game/app that used TextraTypist. The other issue is that if TextraTypist continued to target Java 7 for its library code, it wouldn't compile with Java 20 or later, and the LTS release 21 has been out for almost a year.
If you're upgrading to TextraTypist 1.0.0 or later, and you haven't changed Skin usage at all, you'll probably encounter some bugs. These are quick to fix by changing Skin to FWSkin , or if you used Stripe, FreeTypistSkin from FreeTypist. There is also a FWSkinLoader for use with AssetManager , and FreeTypist has a FreeTypistSkinLoader . FWSkin allows loading the new types of scene2d.ui styles that reuse Font instances rather than making new ones often. It also allows loading BitmapFont and Font objects from .fnt, .json, and .dat files (where .dat is the compressed JSON format this repo uses), requiring only configuration for BitmapFont in the skin .json .
If you want to make your own Fonts, you can use Hiero or AngelCode BMFont as you always have been able to, but now you can also use FontWriter (though it is Windows-only for now). FontWriter can output SDF and MSDF distance field fonts, as well as standard bitmap fonts, and it always ensures the files have been processed how TextraTypist prefers them (they need a small white square in the lower right to use for block drawing and underline/strikethrough, plus a specific transparency change makes certain overlapping renders with alpha keep their intended colors). These processing changes could be done by running BlockStamper and TransparencyProcessor in the TextraTypist tests, but that's a hassle, so using FontWriter is preferred. It outputs .json and .dat font files, as well as a .png texture. You only need the .png file AND (the .dat file OR the .json file), but the .dat file is smaller, so it is usually preferred. The .json file can be hand-edited, but it isn't very easy to do that given how it is inside.
This is based very closely on typing-label, by Rafa Skoberg. Typing-label is MIT-licensed according to its repo LICENSE file, but (almost certainly unintentionally) does not include any license headers in any files. Since the only requirement of the MIT license is to leave any license text as-is, this Apache-licensed project is fully compliant with MIT. The full MIT license text is in the file typing-label.LICENSE , and the Apache 2 license for this project is in the file LICENSE . Apache license headers are also present in all library source files here. The Apache license does not typically apply to non-code resources in the src/test/resources folder; individual fonts have their own licenses stored in that directory.
Twemoji isn't a font, so it might be best to mention it separately. It's licensed under CC-BY 4.0, and requires attribution to Twitter if used. Twemoji's guidelines for attribution are here. (The documentation still says Twitter, not X, and to my knowledge X doesn't employ any of the active Twemoji team, so... I would link back to the Twemoji repo, so that it is up to them).
Like Twemoji, Game-Icons.png isn't a font, and it has quite a few contributors to the project. Because all icons in the project are on one PNG file, you must credit all the contributors who licensed their art under CC-BY, and it may be ideal just to credit all the contributors, period. The list is in the license.
OpenMoji is also not a font, but it clearly has a CC-BY-SA 4.0 license, and the BY clause should be satisfied by attributing the OpenMoji Project. The SA clause should be satisfied by any users of OpenMoji continuing to provide attribution. There isn't a non-commercial clause for any assets here.
The logo was made by Raymond "raeleus" Buckley and contributed to this project. It can be used freely for any purpose, but I request that it only be used to refer to this project unless substantially modified.
Wow, raeleus has really helped a tremendous amount. Both by testing TextraTypist in his Skin Composer app (which found quite a lot of bugs, small and large), and advising on proper scene2d.ui layout practices (which were not easy to get 100% right), the large 0.5.2 release (and those after it) would not be what it is today without his input. Terima kasih!
Thanks to fraudo for helping me go step-by-step to figure out how badly I had screwed up rotation with backgrounds, and for writing most of LabelRotationTest . Release 0.5.5 would still probably be in development for months without that help, so thanks are in order.
Thanks to piotr-j (evilentity), mas omenos, and DMC from the libGDX Discord, for really thoroughly testing TextraTypist. IncongruityTest was originally piotr-j's work, and it helped me figure out which fonts in KnownFonts had incorrect bounds information. TableWrapTest was based closely on mas omenos' work, and was useful to locate a wrapping bug. DMC managed to track down a very elusive ProGuard issue, which is now documented in this README.md , as well as noticing and helping debug a variety of issues with code that I had no idea people were already using. Sanda Moen, fourlastor, tecksup, and Siavash Ranbar helped track down some maddening bugs affecting word wrap; thanks to everyone who's put up with those kinds of bug! IgorApplications has helped track down various SDF-related bugs and pointed out that a feature (full-color emoji in SDF fonts) was possible, so thanks as well!
Of course, I have to thank Rafa Skoberg for writing quite a lot of the code here! About 2/3 of the effects are almost purely by Rafa, much of the TypingLabel-related code is nearly unchanged from his work, and in general he showed what libGDX UIs could be just by making the initial code.
Thanks to all the font designers who made fonts we use here; by making your fonts freely available, you perform a great service to the people who depend on them.
Thanks to Twitter for generously contributing Twemoji to the world of open source; having broadly available emoji makes them much more usable. Note that because this was a generous action by Twitter, it happened before its acquisition/change to "X".
Thanks to the many contributors to game-icons.net for producing high-quality free icons to game developers everywhere. The icons in Game-Icons.png were made by:
(Projects that use TextraTypist can copy the above list of Game-Icons.png contributors to comply with its license.)
Thanks again to the OpenMoji project! That was clearly a lot of work. OpenMoji is licensed as CC BY-SA 4.0.
Thanks also to the developers of the Noto Fonts and Emoji! They are OFL 1.1 licensed. The Noto Color Emoji here also used data from the MIT-licensed EmojiBase project to create the atlas.