-
Notifications
You must be signed in to change notification settings - Fork 0
/
dungeon.go
98 lines (80 loc) · 2.65 KB
/
dungeon.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
package states
import (
"bytes"
"image"
"image/color"
"log"
"github.com/hajimehoshi/ebiten/examples/resources/images"
"github.com/hajimehoshi/ebiten/v2"
"github.com/hajimehoshi/ebiten/v2/inpututil"
gc "github.com/kijimaD/ruins/lib/components"
"github.com/kijimaD/ruins/lib/engine/states"
w "github.com/kijimaD/ruins/lib/engine/world"
"github.com/kijimaD/ruins/lib/loader"
"github.com/kijimaD/ruins/lib/resources"
gs "github.com/kijimaD/ruins/lib/systems"
ecs "github.com/x-hgg-x/goecs/v2"
)
var (
baseImage *ebiten.Image // 一番下にある黒背景
bgImage *ebiten.Image // 床を表現する
)
type DungeonState struct{}
func (st DungeonState) String() string {
return "Dungeon"
}
// State interface ================
func (st *DungeonState) OnPause(world w.World) {}
func (st *DungeonState) OnResume(world w.World) {}
func (st *DungeonState) OnStart(world w.World) {
screenWidth := world.Resources.ScreenDimensions.Width
screenHeight := world.Resources.ScreenDimensions.Height
baseImage = ebiten.NewImage(screenWidth, screenHeight)
img, _, err := image.Decode(bytes.NewReader(images.Tile_png))
if err != nil {
log.Fatal(err)
}
bgImage = ebiten.NewImageFromImage(img)
baseImage.Fill(color.Black)
gameResources := world.Resources.Game.(*resources.Game)
gameResources.Level = loader.NewLevel(world, 1, 20, 20)
}
func (st *DungeonState) OnStop(world w.World) {
gameComponents := world.Components.Game.(*gc.Components)
world.Manager.Join(
gameComponents.SpriteRender,
).Visit(ecs.Visit(func(entity ecs.Entity) {
world.Manager.DeleteEntity(entity)
}))
world.Manager.Join(
gameComponents.Position,
).Visit(ecs.Visit(func(entity ecs.Entity) {
world.Manager.DeleteEntity(entity)
}))
world.Manager.Join(
gameComponents.GridElement,
).Visit(ecs.Visit(func(entity ecs.Entity) {
world.Manager.DeleteEntity(entity)
}))
}
func (st *DungeonState) Update(world w.World) states.Transition {
gs.MoveSystem(world)
if inpututil.IsKeyJustPressed(ebiten.KeyEscape) {
return states.Transition{Type: states.TransPush, NewStates: []states.State{&DungeonMenuState{}}}
}
gameResources := world.Resources.Game.(*resources.Game)
switch gameResources.StateEvent {
case resources.StateEventWarpNext:
gameResources.StateEvent = resources.StateEventNone // reset
gameResources.Depth += 1
return states.Transition{Type: states.TransSwitch, NewStates: []states.State{&DungeonState{}}}
}
return states.Transition{}
}
func (st *DungeonState) Draw(world w.World, screen *ebiten.Image) {
screen.DrawImage(baseImage, nil)
gs.RenderSpriteSystem(world, screen)
gs.DarknessSystem(world, screen)
gs.BlindSpotSystem(world, screen)
gs.HUDSystem(world, screen)
}