Un exemple qui dessine une horloge à l'aide d'un moteur de jeu appelé ebiten

L'horloge est simple.
main.go
package main
import (
	. "clock"
	"github.com/hajimehoshi/ebiten"
	"github.com/hajimehoshi/ebiten/inpututil"
	"log"
	"time"
)
type Game struct {
	time time.Time
	stop bool
}
func (g *Game) Update(screen *ebiten.Image) error {
	if inpututil.IsKeyJustPressed(ebiten.KeyEscape) {
		g.stop = !g.stop
	}
	if !g.stop {
		g.time = time.Now()
	}
	return nil
}
func (g *Game) Draw(screen *ebiten.Image) {
	m := ClockImage(g.time)
	em, _ := ebiten.NewImageFromImage(m, ebiten.FilterDefault)
	screen.DrawImage(em, &ebiten.DrawImageOptions{})
}
func (g *Game) Layout(outsideWidth, outsideHeight int) (screenWidth, screenHeight int) {
	return 320, 320
}
func main() {
	game := &Game{}
	ebiten.SetWindowSize(320, 320)
	ebiten.SetWindowTitle("Hello, World!")
	if err := ebiten.RunGame(game); err != nil {
		log.Fatal(err)
	}
}
Avec la signification d'un échantillon, vous pouvez arrêter l'horloge en appuyant sur la touche d'échappement.
Je ne réfléchis pas à comment l'utiliser.
Un programme qui génère l'image d'horloge essentielle
clock.go
package clock
import (
	"image"
	"github.com/fogleman/gg"
	"github.com/golang/freetype/truetype"
	"golang.org/x/image/font/gofont/gomedium"
	"time"
)
func ClockImage(t time.Time) image.Image {
	const (
		R       = 160
		Long    = 108 //Second
		Midium  = 85  // Minute
		Short   = 50  // Hour
		Width   = R*2 + 1
		Height  = R*2 + 1
		CenterX = Width / 2
		CenterY = Height / 2
		M       = 15 //Autres lignes de mémoire
		M5      = 26 //Ligne mémoire de 5 minutes
	)
	dc := gg.NewContext(Width, Height)
	dc.SetHexColor("#ffffff")
	dc.Clear()
    //Dessin de mémoire
	dc.Push()
	dc.SetHexColor("#000000")
	for i := 0; i < 60; i++ {
		dc.Push()
		var m float64 = M
		if i%5 == 0 {
			dc.SetLineWidth(2)
			m = M5
		}
		dc.MoveTo(CenterX, CenterY-R+m)
		dc.LineTo(CenterX, 0)
		dc.Stroke()
		dc.Pop()
		dc.RotateAbout(gg.Radians(float64(6)), CenterX, CenterY)
	}
	dc.Pop()
	dc.SetHexColor("#000")
        
    // AM /Dessin PM
	var AMPM = "AM"
	if t.Hour() >= 12 {
		AMPM = "PM"
	}
	f, _ := truetype.Parse(gomedium.TTF)
	face := truetype.NewFace(f, &truetype.Options{Size: 34})
	dc.SetFontFace(face)
	dc.DrawString(AMPM, CenterX+37, CenterY+7)
    //L'angle de l'aiguille courte à 0 heure=Puisque nous voulons le régler à 0 degré, faites-le pivoter de 90 degrés dans le sens inverse des aiguilles d'une montre à l'avance.
	dc.RotateAbout(gg.Radians(-90), CenterX, CenterY)
	dc.DrawCircle(CenterX, CenterY, R)
	dc.Stroke()
    //Dessin de la main courte
	dc.Push()
	dc.SetLineWidth(8)
	dc.MoveTo(CenterX, CenterY)
	HD := t.Hour()%12*30 + int(float64(t.Minute())*0.5) //t.Hour() range [0,23] 360/12 == 30
	if HD != 0 {
		dc.RotateAbout(gg.Radians(float64(HD)), CenterX, CenterY)
	}
	dc.LineTo(CenterX+Short, CenterY)
	dc.Stroke()
	dc.Pop()
    //Dessin de la longue main
	dc.Push()
	dc.SetLineWidth(4)
	dc.MoveTo(CenterX, CenterY)
	MD := t.Minute() * 6 // t.Minute() range [0,59] 360/60 == 6
	if MD != 0 {
		dc.RotateAbout(gg.Radians(float64(MD)), CenterX, CenterY)
	}
	dc.LineTo(CenterX+Midium, CenterY)
	dc.Stroke()
	dc.Pop()
    //Dessin de la seconde main
	dc.Push()
	dc.SetLineWidth(2)
	dc.MoveTo(CenterX, CenterY)
	SD := t.Second() * 6 // t.Second() range [0,59] 360/60 == 6
	if SD != 0 {
		dc.RotateAbout(gg.Radians(float64(SD)), CenterX, CenterY)
	}
	dc.LineTo(CenterX+Long, CenterY)
	dc.Stroke()
	dc.Pop()
	return dc.Image()
}
Passe le temps et renvoie une image d'horloge indiquant cette heure
Il n'y a presque pas d'explication, mais j'aimerais la mettre à jour si je peux penser à une explication plus compréhensible.
Personnellement, je pense que Go est un langage facile à écrire, mais la conversion de type a tendance à être redondante.
Y aura-t-il moins de bogues en éliminant la conversion de type implicite, ou y aura-t-il plus de code écrit ...
Recommended Posts