ETXT es un paquete para la representación de texto Vectorial 1 en Golang diseñado para usarse con EbitEngine , el motor de juego 2D hecho por Hajime Hoshi.
Si bien EbitEngine ya incluye el paquete Ebiten/V2/Text/V2 , ETXT tiene algunas ventajas sobre él:
font.Face para siempre.Lo que Etxt no hace:
Si no está familiarizado con los términos y conceptos de tipografía, le recomiendo leer los primeros capítulos de las convenciones del glifo de FreeType; Una de las mejores referencias sobre el tema que puede encontrar en Internet.
¡Menos charla y más código!
package main
import ( "math" ; "image/color" )
import "github.com/hajimehoshi/ebiten/v2"
import "github.com/tinne26/etxt"
import "github.com/tinne26/fonts/liberation/lbrtserif"
const WordsPerSec = 2.71828
var Words = [] string {
"solitude" , "joy" , "ride" , "whisper" , "leaves" , "cookie" ,
"hearts" , "disdain" , "simple" , "death" , "sea" , "shallow" ,
"self" , "rhyme" , "childish" , "sky" , "tic" , "tac" , "boom" ,
}
// ---- Ebitengine's Game interface implementation ----
type Game struct { text * etxt. Renderer ; wordIndex float64 }
func ( self * Game ) Layout ( winWidth int , winHeight int ) ( int , int ) {
scale := ebiten . DeviceScaleFactor () // *
// * ebiten.Monitor().DeviceScaleFactor() in >=v2.7.0
self . text . SetScale ( scale ) // relevant for HiDPI
canvasWidth := int ( math . Ceil ( float64 ( winWidth ) * scale ))
canvasHeight := int ( math . Ceil ( float64 ( winHeight ) * scale ))
return canvasWidth , canvasHeight
}
func ( self * Game ) Update () error {
newIndex := ( self . wordIndex + WordsPerSec / 60.0 )
self . wordIndex = math . Mod ( newIndex , float64 ( len ( Words )))
return nil
}
func ( self * Game ) Draw ( canvas * ebiten. Image ) {
// background color
canvas . Fill (color. RGBA { 229 , 255 , 222 , 255 })
// get screen center position
bounds := canvas . Bounds () // assumes origin (0, 0)
x , y := bounds . Dx () / 2 , bounds . Dy () / 2
// draw text
word := Words [ int ( self . wordIndex )]
self . text . Draw ( canvas , word , x , y )
}
// ---- main function ----
func main () {
// create text renderer, set the font and cache
renderer := etxt . NewRenderer ()
renderer . SetFont ( lbrtserif . Font ())
renderer . Utils (). SetCache8MiB ()
// adjust main text style properties
renderer . SetColor (color. RGBA { 239 , 91 , 91 , 255 })
renderer . SetAlign ( etxt . Center )
renderer . SetSize ( 72 )
// set up Ebitengine and start the game
ebiten . SetWindowTitle ( "etxt/examples/ebiten/words" )
err := ebiten . RunGame ( & Game { text : renderer })
if err != nil { panic ( err ) }
}Puedes intentar ejecutar esto tú mismo con 2 :
go run github.com/tinne26/etxt/examples/ebiten/words@latest
Alternativamente, puede ir a https://tinne26.github.io/etxt-examples/ y hacer clic en el primer ejemplo de la versión web.
Este es un ejemplo muy simple y autónomo. Si desea obtener más información, ¡asegúrese de echar un vistazo a ETXT/Ejemplos!
Sí, puedes compilarlo con -tags gtxt . Observe que gtxt hará que el sorteo de texto ocurra en la CPU, así que no intente usarlo para aplicaciones en tiempo real. En particular, tenga cuidado de no usar accidentalmente gtxt con EbitEngine (son compatibles en muchos casos, pero el rendimiento morirá).
etxt/test .Si está utilizando fuentes vectoriales tipo Pixel-Art, lea estos consejos. ↩
Necesitará Golang> = 1.18, y si nunca antes ha usado EbitEngine, es posible que deba instalar algunas dependencias (generalmente solo en Linux o FreeBSD). ↩