-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathimages.go
108 lines (100 loc) · 2.48 KB
/
images.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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package main
import (
"github.com/hajimehoshi/ebiten/v2"
"golang.org/x/image/colornames"
"math"
)
type sprites struct {
ship *ebiten.Image
planet *ebiten.Image
hole *ebiten.Image
star *ebiten.Image
}
const (
shipSpriteSize = 10
planetSpriteSize = 128
planetSpriteR2 = planetSpriteSize * planetSpriteSize / 4
)
// its a blue triangle
func newShipSprite() *ebiten.Image {
pixels := make([]byte, 4*shipSpriteSize*shipSpriteSize)
for y := 0; y < shipSpriteSize; y++ {
ybase := y * shipSpriteSize * 4
for x := 0; x < shipSpriteSize; x++ {
xbase := ybase + (x * 4)
if y > 2*x-shipSpriteSize && y > -2*x+shipSpriteSize {
pixels[xbase] = 64
pixels[xbase+1] = 64
pixels[xbase+2] = 255
pixels[xbase+3] = 255
}
}
}
result := ebiten.NewImage(shipSpriteSize, shipSpriteSize)
result.ReplacePixels(pixels)
return result
}
// its a green circle
func newPlanetSprite() *ebiten.Image {
mid := planetSpriteSize / 2
pixels := make([]byte, 4*planetSpriteSize*planetSpriteSize)
for y := 0; y < planetSpriteSize; y++ {
ybase := y * planetSpriteSize * 4
for x := 0; x < planetSpriteSize; x++ {
xbase := ybase + (x * 4)
cx := x - mid
cy := y - mid
if cx*cx+cy*cy <= planetSpriteR2 {
color := colornames.Darkgreen
if cx*cx+cy*cy <= 16 {
color = colornames.Darkolivegreen
}
pixels[xbase] = color.R
pixels[xbase+1] = color.G
pixels[xbase+2] = color.B
pixels[xbase+3] = 255
}
}
}
result := ebiten.NewImage(planetSpriteSize, planetSpriteSize)
result.ReplacePixels(pixels)
return result
}
func newStarSprite() *ebiten.Image {
result := ebiten.NewImage(1, 1)
result.Set(0, 0, colornames.White)
return result
}
func newBlackHoleSprite() *ebiten.Image {
mid := planetSpriteSize / 2
pixels := make([]byte, 4*planetSpriteSize*planetSpriteSize)
for y := 0; y < planetSpriteSize; y++ {
ybase := y * planetSpriteSize * 4
for x := 0; x < planetSpriteSize; x++ {
xbase := ybase + (x * 4)
cx := x - mid
cy := y - mid
r2 := cx*cx + cy*cy
if r2 <= planetSpriteR2 {
z := math.Sqrt(float64(r2)) / (planetSpriteSize / 2)
copy(pixels[xbase:xbase+4], []byte{
32 - byte(32*z),
0,
32 - byte(32*z),
255 - byte(255*z),
})
}
}
}
result := ebiten.NewImage(planetSpriteSize, planetSpriteSize)
result.ReplacePixels(pixels)
return result
}
func newSprites() sprites {
return sprites{
ship: newShipSprite(),
planet: newPlanetSprite(),
hole: newBlackHoleSprite(),
star: newStarSprite(),
}
}