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