-
Notifications
You must be signed in to change notification settings - Fork 1
/
nav_sprite.go
80 lines (62 loc) · 2.03 KB
/
nav_sprite.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package render
import (
"image/color"
"github.com/hajimehoshi/ebiten/v2"
"github.com/hajimehoshi/ebiten/v2/vector"
"github.com/harbdog/raycaster-go"
"github.com/pixelmek-3d/pixelmek-3d/game/model"
"github.com/tinne26/etxt"
)
type NavSprite struct {
*Sprite
NavPoint *model.NavPoint
}
func NewNavSprite(
navPoint *model.NavPoint, scale float64,
) *NavSprite {
navPos := navPoint.Pos()
navEntity := model.BasicVisualEntity(navPos.X, navPos.Y, 0.5, raycaster.AnchorCenter)
n := &NavSprite{
Sprite: NewSprite(navEntity, scale, navPoint.Image()),
NavPoint: navPoint,
}
// nav points cannot be focused upon by player reticle
n.focusable = false
// nav points self illuminate so they do not get dimmed in night conditions
n.illumination = 5000
return n
}
func GenerateNavImage(navPoint *model.NavPoint, imageSize int, font *Font, clr *color.NRGBA) *ebiten.Image {
if navPoint == nil {
return nil
}
navImage := ebiten.NewImage(imageSize, imageSize)
renderer := etxt.NewStdRenderer()
if clr == nil {
clr = &_colorNavPoint
}
nColor := color.NRGBA{R: clr.R, G: clr.G, B: clr.B, A: 255}
renderer.SetTarget(navImage)
renderer.SetCacheHandler(font.FontCache.NewHandler())
renderer.SetFont(font.Font)
renderer.SetColor(nColor)
// set font size based on image size
fontPxSize := float64(imageSize) / 3
if fontPxSize < 1 {
fontPxSize = 1
}
renderer.SetSizePx(int(fontPxSize))
renderer.SetAlign(etxt.YCenter, etxt.XCenter)
navChar := navPoint.Name[0:1]
renderer.Draw(navChar, imageSize/2, imageSize/2)
// draw nav diamond shape
oT := float32(2)
minX, minY := float32(imageSize)/8, float32(imageSize)/8
maxX, maxY := 7*float32(imageSize)/8, 7*float32(imageSize)/8
midX, midY := float32(imageSize)/2, float32(imageSize/2)
vector.StrokeLine(navImage, minX, midY, midX, minY, oT, nColor, false)
vector.StrokeLine(navImage, midX, minY, maxX, midY, oT, nColor, false)
vector.StrokeLine(navImage, minX, midY, midX, maxY, oT, nColor, false)
vector.StrokeLine(navImage, midX, maxY, maxX, midY, oT, nColor, false)
return navImage
}