-
Notifications
You must be signed in to change notification settings - Fork 0
/
player.go
101 lines (93 loc) · 2.37 KB
/
player.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
package menu
import (
"path/filepath"
"github.com/oakmound/oak"
"github.com/oakmound/oak/collision"
"github.com/oakmound/oak/dlog"
"github.com/oakmound/oak/entities"
"github.com/oakmound/oak/event"
"github.com/oakmound/oak/render"
)
type Player struct {
entities.Reactive
collision.Phase
stop bool
interactFn func()
interactR render.Renderable
}
func (p *Player) Init() event.CID {
p.CID = event.NextID(p)
return p.CID
}
func NewPlayer() *Player {
p := new(Player)
sh := render.GetSheet(filepath.Join("4x16", "topplayer.png"))
p.Reactive = entities.NewReactive(5, 5, 4, 16, render.NewCompound(
"forward",
map[string]render.Modifiable{
"forward": sh[0][0].Copy(),
"right": sh[1][0].Copy(),
"left": sh[1][0].Copy().Modify(render.FlipX),
"back": sh[2][0].Copy(),
}), p.Init())
var err error
if err != nil {
dlog.Error(err)
}
collision.Add(p.RSpace.Space)
render.Draw(p.R, entityLayer)
p.RSpace.Add(blocking, playerStop)
collision.PhaseCollision(p.RSpace.Space)
p.Bind(triggerInteractive, "CollisionStart")
p.Bind(unbindInteractive, "CollisionStop")
p.Bind(playerWalk, "EnterFrame")
p.Bind(playerInteract, "KeyUpE")
return p
}
func playerStop(s1, s2 *collision.Space) {
p := s1.CID.E().(*Player)
p.stop = true
}
func playerInteract(id int, nothing interface{}) int {
p := event.CID(id).E().(*Player)
if p.interactFn != nil {
p.interactFn()
}
return 0
}
func playerWalk(id int, nothing interface{}) int {
p := event.CID(id).E().(*Player)
shiftX := 0.0
shiftY := 0.0
if oak.IsDown("W") {
p.R.(*render.Compound).Set("back")
//p.footCh <- audio.NewPosSignal(0, p.X(), p.Y())
shiftY--
} else if oak.IsDown("S") {
p.R.(*render.Compound).Set("forward")
//p.footCh <- audio.NewPosSignal(0, p.X(), p.Y())
shiftY++
} else if oak.IsDown("A") {
p.R.(*render.Compound).Set("left")
//p.footCh <- audio.NewPosSignal(0, p.X(), p.Y())
shiftX--
} else if oak.IsDown("D") {
p.R.(*render.Compound).Set("right")
//p.footCh <- audio.NewPosSignal(0, p.X(), p.Y())
shiftX++
}
if p.interactR != nil {
p.interactR.SetPos(p.X()-1, p.Y()-8)
}
collision.ShiftSpace(shiftX, shiftY, p.RSpace.Space)
<-p.RSpace.CallOnHits()
// If near interactable, show potential interaction
// Stop if hit something
collision.ShiftSpace(-shiftX, -shiftY, p.RSpace.Space)
if p.stop {
p.stop = false
} else {
p.ShiftPos(shiftX, shiftY)
}
return 0
}