-
Notifications
You must be signed in to change notification settings - Fork 1
/
background.go
126 lines (107 loc) · 3.1 KB
/
background.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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
package main
import (
"github.com/hajimehoshi/ebiten"
log "github.com/sirupsen/logrus"
"github.com/ungerik/go3d/float64/vec2"
)
var (
positionCurrent vec2.T
positionN = vec2.T{0, -windowHeight}
positionNE = vec2.T{windowWidth, -windowHeight}
positionE = vec2.T{windowWidth, 0}
positionW = vec2.T{-windowWidth, 0}
positionNW = vec2.T{-windowWidth, -windowHeight}
)
type Background struct {
player *J0hn
tiles map[Tile]bool
timeAccumulator int64
FirstTile Tile
}
func NewBackgroundSystem(player *J0hn) *Background {
t := NewInitTile(windowWidth, windowHeight*3, 1)
p := &Background{
player: player,
tiles: map[Tile]bool{t: true},
}
p.FirstTile = t
p.player.currentTile = t
return p
}
func (bg *Background) Update(_ *ebiten.Image, delta int64) {
bg.timeAccumulator += delta
if float64(bg.timeAccumulator) >= playerTick {
bg.timeAccumulator = 0
tilesCollection := map[vec2.T]Tile{
positionCurrent: nil,
positionN: nil,
positionNE: nil,
positionNW: nil,
positionE: nil,
positionW: nil,
}
for tile := range bg.tiles {
vel := copyVector(*bg.player.velocity)
vel.Scale(float64(playerTick) / 300)
tile.Update(vel)
if !bg.player.isLifting {
for k := range tilesCollection {
pos := copyVector(bg.player.currentTile.GetPosition().Min)
pos.Add(&k).Add(&vec2.T{windowWidth / 2, windowHeight / 2})
if k == positionCurrent {
pos = copyVector(*bg.player.position)
pos.Scale(j0hnScale)
}
if tile.GetPosition().ContainsPoint(&pos) {
tilesCollection[k] = tile
break
}
}
}
if tile == bg.FirstTile {
pos := *tile.GetPosition()
if pos.Min[1] > 0 {
bg.player.isLifting = false
}
}
// offscreen? then delete instance
if tile.IsOffscreen() {
log.WithField("id", tile.GetId()).Debugln("Killing Tile")
delete(bg.tiles, tile)
}
}
if !bg.player.isLifting && tilesCollection[positionCurrent] == nil {
log.WithFields(map[string]interface{}{
"player_position": bg.player.collitionBox,
"last_tile": bg.player.currentTile.GetPosition(),
}).Error("impossible to locate the current tile")
} else if bg.player.isLifting {
} else {
if bg.player.currentTile.GetId() != tilesCollection[positionCurrent].GetId() {
log.WithFields(map[string]interface{}{
"player_position": bg.player.collitionBox,
"last_tile": tilesCollection[positionCurrent].GetPosition(),
}).Tracef("%v contains player", tilesCollection[positionCurrent].GetId())
bg.player.currentTile = tilesCollection[positionCurrent]
}
for k, v := range tilesCollection {
if k == positionCurrent || v != nil {
continue
}
pos := copyVector(bg.player.currentTile.GetPosition().Min)
pos.Add(&k)
t := NewStarsTile(pos)
bg.tiles[t] = true
}
}
log.WithFields(map[string]interface{}{
"tiles_counter": len(bg.tiles),
}).Traceln("Active tiles")
}
}
func (bg *Background) Draw(screen *ebiten.Image) {
for t := range bg.tiles {
t.Draw(screen)
//fmt.Printf("%#v: %#v\n", k, t.op.GeoM)
}
}