summaryrefslogtreecommitdiff
path: root/engine/Components/World.go
blob: c7a96df7a161f5611cb5159367db7a8ee7acf094 (plain)
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
127
package components

import (
	coreobjects "github.com/DegustatorPonos/RuinesOfRafdolon/CoreObjects"
	rl "github.com/gen2brain/raylib-go/raylib"
)

// The scene implimetation that represents one playable scene
type World struct {
	Manager *coreobjects.SceneManager
	Name string
	Floor []FloorTile
	StaticObjects []coreobjects.GameObject

	Player *Player

	Camera *rl.Camera2D

	layersStatic layering

	// ========== Cache ==========

	// the collection of the colliders that belong to static objects - world, buildings, etc
	staticColliders []*coreobjects.Collider
}

func (base *World) Create(manager *coreobjects.SceneManager) {
	base.Manager = manager
	base.Player.Init(manager)
	for _, v := range base.StaticObjects {
		v.Init(manager)
	}
	base.layersStatic = layering{}
	base.generateStaticLayers()
}

func (base *World) Destroy() {
	base.Player.Destroy()
}

func (base *World) Update() {
	for _, v := range base.StaticObjects {
		v.Update()
	}
	base.Player.Update()
	base.Player.SnapCamera(base.Camera)
	base.handleZoom()
}

func (base *World) handleZoom() {
	var zoomSpeed = 50 * rl.GetFrameTime()
	base.Camera.Zoom += zoomSpeed * rl.GetMouseWheelMove()
}

func (base *World) collectStaticColliders() {
	base.staticColliders = make([]*coreobjects.Collider, 0)
	for _, obj := range base.StaticObjects {
		for _, v := range obj.GetColliders() {
			base.staticColliders = append(base.staticColliders, &v)
		}
	}
}

func (base *World) GetStaticColliders() []*coreobjects.Collider {
	if base.staticColliders == nil {
		base.collectStaticColliders()
	}
	return base.staticColliders
}

func (base *World) Draw() {
	rl.BeginMode2D(*base.Camera)
	defer rl.EndMode2D()
	for _, v := range base.Floor {
		v.Draw()
	}
	base.drawObjects()
}

func (base *World) drawObjects() {
	var playerDrawn = false
	var layer = base.layersStatic.firstLayer
	var i = 0
	for {
		if layer == nil {
			break
		}
		if !playerDrawn && base.Player.Position.Y < layer.Index {
			playerDrawn = true
			base.Player.Draw()
		}
		for _, v := range layer.Objects {
			v.Draw()
		}
		layer = layer.Next()
		i++
	}
	// Ensure that the player was drawn
	if !playerDrawn {
		base.Player.Draw()
	}
}

func (base *World) generateStaticLayers() {
	for _, v := range base.StaticObjects {
		base.layersStatic.Insert(v)
	}
}

func (base *World) GetMousePosition() rl.Vector2 {
	return rl.GetScreenToWorld2D(rl.GetMousePosition(), *base.Camera)
}

// The single texture drawn at level 0 of the world
type FloorTile struct {
	Position rl.Vector2
	Texture *rl.Texture2D
}

func (base *FloorTile) Draw() {
	rl.DrawTexture(
		*base.Texture,
		int32(base.Position.X), 
		int32(base.Position.Y),
		rl.White,
	)
}