72 lines
1.6 KiB
Go
72 lines
1.6 KiB
Go
package play
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
|
|
"opslag.de/schobers/geom"
|
|
"opslag.de/schobers/zntg"
|
|
|
|
"opslag.de/schobers/zntg/ui"
|
|
)
|
|
|
|
type FPS struct {
|
|
ui.ControlBase
|
|
|
|
Align ui.HorizontalAlignment
|
|
|
|
update zntg.Animation
|
|
i int
|
|
frames []int
|
|
total int
|
|
}
|
|
|
|
func (f *FPS) Shown() {
|
|
f.update.Interval = 20 * time.Millisecond
|
|
f.update.Start()
|
|
f.i = 0
|
|
f.frames = make([]int, 51)
|
|
f.total = 0
|
|
}
|
|
|
|
func (f *FPS) Hidden() {
|
|
f.update.Pause()
|
|
}
|
|
|
|
func (f *FPS) font(ctx ui.Context) ui.Font {
|
|
font := ctx.Fonts().Font("debug")
|
|
if font != nil {
|
|
return font
|
|
}
|
|
return ctx.Fonts().Font("default")
|
|
}
|
|
|
|
func (f *FPS) Render(ctx ui.Context) {
|
|
_, n := f.update.AnimateDelta()
|
|
for i := 0; i < n; i++ {
|
|
f.total += f.frames[f.i]
|
|
f.i = (f.i + 1) % len(f.frames)
|
|
f.total -= f.frames[f.i]
|
|
f.frames[f.i] = 0
|
|
}
|
|
f.frames[f.i]++
|
|
|
|
font := f.font(ctx)
|
|
fps := fmt.Sprintf("FPS: %d", f.total)
|
|
|
|
renderer := ctx.Renderer()
|
|
switch f.Align {
|
|
case ui.AlignLeft:
|
|
ctx.Renderer().Text(font, geom.PtF32(5, 5), ctx.Style().Palette.Background, fps)
|
|
ctx.Renderer().Text(font, geom.PtF32(4, 4), ctx.Style().Palette.Text, fps)
|
|
case ui.AlignCenter:
|
|
center := .5 * renderer.Size().ToF32().X
|
|
ctx.Renderer().TextAlign(font, geom.PtF32(center, 5), ctx.Style().Palette.Background, fps, ui.AlignCenter)
|
|
ctx.Renderer().TextAlign(font, geom.PtF32(center+1, 4), ctx.Style().Palette.Text, fps, ui.AlignCenter)
|
|
case ui.AlignRight:
|
|
right := renderer.Size().ToF32().X - 5
|
|
ctx.Renderer().TextAlign(font, geom.PtF32(right, 5), ctx.Style().Palette.Background, fps, ui.AlignRight)
|
|
ctx.Renderer().TextAlign(font, geom.PtF32(right+1, 4), ctx.Style().Palette.Text, fps, ui.AlignRight)
|
|
}
|
|
}
|