/
main.go
175 lines (149 loc) · 4.32 KB
/
main.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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
// author: João Maia
package main
import (
"fmt"
"github.com/veandco/go-sdl2/sdl"
"github.com/veandco/go-sdl2/sdl_image"
"github.com/veandco/go-sdl2/sdl_mixer"
"github.com/veandco/go-sdl2/sdl_ttf"
"os"
"time"
"wander/eng"
)
var (
winTitle string = "Go-SDL2 Wander"
imageName string = "assets/textures/ts1.png"
event sdl.Event
currScene *eng.Scene
sp1 *eng.SpriteSheet
// TODO passar para struct eng.Cam
camDZUp sdl.Rect = sdl.Rect{0, 0, winWidth, camDZO}
camDZDown sdl.Rect = sdl.Rect{0, winHeight - camDZO, winWidth, camDZO}
camDZLeft sdl.Rect = sdl.Rect{0, 0, camDZO, winHeight}
camDZRight sdl.Rect = sdl.Rect{winWidth - camDZO, 0, camDZO, winHeight}
font *ttf.Font
)
const (
winWidth, winHeight int32 = 1920, 1040
tileSize int32 = 32
camOffSetX int32 = (winWidth / 2) + (tileSize / 2)
camOffSetY int32 = (winHeight / 2) + (tileSize / 2)
camDZO int32 = 120
)
func handleKeyEvent(key sdl.Keycode) {
//fmt.Printf("%d pressed \n", key)
var m eng.Vector2d
switch key {
case 1073741906:
m = eng.MVSpeed.Up
if eng.CheckColl(eng.WorldToScreen(currScene.PC.Pos, currScene.Cam), camDZUp, eng.Vector2d{}) {
currScene.Cam.WY += (m.Y * currScene.PC.Speed.Y)
}
case 1073741905:
m = eng.MVSpeed.Down
if eng.CheckColl(eng.WorldToScreen(currScene.PC.Pos, currScene.Cam), camDZDown, eng.Vector2d{}) {
currScene.Cam.WY += (m.Y * currScene.PC.Speed.Y)
}
case 1073741904:
m = eng.MVSpeed.Left
if eng.CheckColl(eng.WorldToScreen(currScene.PC.Pos, currScene.Cam), camDZLeft, eng.Vector2d{}) {
currScene.Cam.WX += (m.X * currScene.PC.Speed.X)
}
case 1073741903:
m = eng.MVSpeed.Right
if eng.CheckColl(eng.WorldToScreen(currScene.PC.Pos, currScene.Cam), camDZRight, eng.Vector2d{}) {
currScene.Cam.WX += (m.X * currScene.PC.Speed.X)
}
}
if m.X != 0 || m.Y != 0 {
currScene.PC.Move(m, currScene)
}
}
func catchEvents() bool {
for event = sdl.PollEvent(); event != nil; event = sdl.PollEvent() {
switch t := event.(type) {
case *sdl.QuitEvent:
return false
case *sdl.KeyDownEvent:
handleKeyEvent(t.Keysym.Sym)
}
}
return true
}
// Initialize
func main() {
var window *sdl.Window
var renderer *sdl.Renderer
var err error
window, err = sdl.CreateWindow(winTitle, sdl.WINDOWPOS_UNDEFINED, sdl.WINDOWPOS_UNDEFINED,
int(winWidth), int(winHeight), sdl.WINDOW_SHOWN)
if err != nil {
fmt.Fprintf(os.Stderr, "Failed to create window: %s\n", err)
os.Exit(1)
}
defer window.Destroy()
renderer, err = sdl.CreateRenderer(window, -1, sdl.RENDERER_ACCELERATED)
if err != nil {
fmt.Fprintf(os.Stderr, "Failed to create renderer: %s\n", err)
os.Exit(2)
}
defer renderer.Destroy()
tilesetImg, err := img.Load("assets/textures/ts1.png")
if err != nil {
fmt.Fprintf(os.Stderr, "Failed to load PNG: %s\n", err)
os.Exit(3)
}
defer tilesetImg.Free()
tilesetTxt, err := renderer.CreateTextureFromSurface(tilesetImg)
if err != nil {
fmt.Fprintf(os.Stderr, "Failed to create texture: %s\n", err)
os.Exit(4)
}
defer tilesetTxt.Destroy()
spritesheetImg, err := img.Load("assets/textures/actor3.png")
if err != nil {
fmt.Fprintf(os.Stderr, "Failed to load PNG: %s\n", err)
os.Exit(3)
}
defer spritesheetImg.Free()
spritesheetTxt, err := renderer.CreateTextureFromSurface(spritesheetImg)
if err != nil {
fmt.Fprintf(os.Stderr, "Failed to create texture: %s\n", err)
os.Exit(4)
}
defer spritesheetTxt.Destroy()
err = ttf.Init()
font, err = ttf.OpenFont("assets/textures/PressStart2P.ttf", 18)
if err != nil {
fmt.Fprintf(os.Stderr, "Failed to load font file: %s\n", err)
os.Exit(6)
}
if err := sdl.Init(sdl.INIT_AUDIO); err != nil {
fmt.Fprintf(os.Stderr, "Failed to load music file: %s\n", err)
os.Exit(7)
}
if err := mix.Init(mix.INIT_MP3); err != nil {
fmt.Fprintf(os.Stderr, "Failed to load music file: %s\n", err)
os.Exit(8)
}
currScene = &eng.Scene{
Window: eng.Window{winWidth, winHeight},
StartTime: time.Now(),
Cam: eng.Camera{0, 0},
EnemyCount: 99,
TsTxt: tilesetTxt,
SsTxt: spritesheetTxt,
Font: font,
}
currScene.Init(renderer)
var running bool = true
for running {
then := time.Now()
running = catchEvents()
//currScene.Update()
currScene.Render(renderer)
dur := time.Since(then)
sdl.Delay(40 - uint32(dur.Nanoseconds()/1000000))
currScene.FrameCounter++
}
}