1
1
use std:: { collections:: HashMap , io:: Read , sync:: Mutex } ;
2
2
3
- use ggez:: {
4
- audio:: { SoundSource , Source } ,
5
- event:: KeyCode ,
6
- graphics:: { self , Color , DrawParam , Shader } ,
7
- mint,
8
- nalgebra:: Point2 ,
9
- timer, Context , GameResult ,
10
- } ;
3
+ use ggez:: { Context , GameResult , audio:: { SoundSource , Source } , event:: KeyCode , graphics:: { self , Color , DrawParam , Shader , Text } , mint, nalgebra:: Point2 , timer} ;
11
4
use ggez_goodies:: {
12
5
camera:: { Camera , CameraDraw } ,
13
6
nalgebra_glm:: Vec2 ,
14
7
particle:: { EmissionShape , ParticleSystem , ParticleSystemBuilder , Transition } ,
15
8
} ;
16
- use graphics:: { Font , GlBackendSpec , Image , ShaderGeneric } ;
9
+ use graphics:: { Font , GlBackendSpec , Image , Scale , ShaderGeneric , TextFragment } ;
17
10
use mint:: Vector2 ;
18
11
use rand:: Rng ;
19
12
@@ -24,9 +17,10 @@ use crate::{
24
17
cloud:: Cloud ,
25
18
enemy:: Enemy ,
26
19
player:: { Direction , Player } ,
27
- tile:: { Tile , TileType } ,
20
+ tile:: Tile ,
28
21
} ,
29
22
utils:: { lerp, remap} ,
23
+ map:: Map ,
30
24
Screen , HEIGHT , WIDTH ,
31
25
} ;
32
26
@@ -56,7 +50,6 @@ pub struct Game {
56
50
barrel_resources : Vec < Image > ,
57
51
cloud_resources : Vec < Image > ,
58
52
59
- #[ allow( dead_code) ]
60
53
consolas : Font ,
61
54
62
55
camera : Camera ,
@@ -68,6 +61,10 @@ pub struct Game {
68
61
69
62
dim_shader : ShaderGeneric < GlBackendSpec , Dim > ,
70
63
dim_constant : Dim ,
64
+
65
+ end : Option < String > ,
66
+
67
+ draw_end_text : ( bool , Option < usize > , bool , bool ) // Thread Sleeped?, Current Iters, Done?, Win?
71
68
}
72
69
73
70
impl Game {
@@ -80,15 +77,16 @@ impl Game {
80
77
let mut buffer = String :: new ( ) ;
81
78
map. read_to_string ( & mut buffer) . unwrap ( ) ;
82
79
83
- let mut ground = vec ! [ ] ;
84
- let mut enemies = vec ! [ ] ;
85
- let mut barrels = vec ! [ ] ;
86
- let mut clouds = vec ! [ ] ;
80
+ let mut map_1 = Map :: new ( ) ;
87
81
88
- let mut player = None ;
82
+ map_1 . parse ( buffer ) ;
89
83
90
- let mut draw_pos = 0. ;
91
- let draw_inc = 64. ;
84
+ let ground = map_1. ground ;
85
+ let enemies = map_1. enemies ;
86
+ let barrels = map_1. barrels ;
87
+ let mut clouds = vec ! [ ] ;
88
+
89
+ let player = map_1. player ;
92
90
93
91
let dim_constant = Dim { rate : 1.0 } ;
94
92
@@ -102,55 +100,6 @@ impl Game {
102
100
)
103
101
. unwrap ( ) ;
104
102
105
- for id in buffer. chars ( ) {
106
- match id {
107
- '[' => {
108
- ground. push ( Tile :: new ( draw_pos, TileType :: LEFT ) ) ;
109
-
110
- draw_pos += draw_inc;
111
- }
112
-
113
- '-' => {
114
- ground. push ( Tile :: new ( draw_pos, TileType :: CENTER ) ) ;
115
-
116
- draw_pos += draw_inc;
117
- }
118
-
119
- ']' => {
120
- ground. push ( Tile :: new ( draw_pos, TileType :: RIGHT ) ) ;
121
-
122
- draw_pos += draw_inc;
123
- }
124
-
125
- '_' => {
126
- draw_pos += draw_inc;
127
- }
128
-
129
- '8' => {
130
- ground. push ( Tile :: new ( draw_pos, TileType :: CENTER ) ) ;
131
- enemies. push ( Enemy :: new ( draw_pos) ) ;
132
-
133
- draw_pos += draw_inc;
134
- }
135
-
136
- '4' => {
137
- ground. push ( Tile :: new ( draw_pos, TileType :: CENTER ) ) ;
138
- player = Some ( Player :: new ( draw_pos) ) ;
139
-
140
- draw_pos += draw_inc;
141
- }
142
-
143
- '*' => {
144
- ground. push ( Tile :: new ( draw_pos, TileType :: CENTER ) ) ;
145
- barrels. push ( Barrel :: new ( draw_pos) ) ;
146
-
147
- draw_pos += draw_inc;
148
- }
149
-
150
- _ => { }
151
- }
152
- }
153
-
154
103
let mut player = player. expect ( "No player found!" ) ;
155
104
let mut ui_lerp = HashMap :: new ( ) ;
156
105
@@ -223,17 +172,55 @@ impl Game {
223
172
224
173
dim_shader,
225
174
dim_constant,
175
+ draw_end_text : ( false , None , false , false ) ,
176
+
177
+ end : map_1. end ,
226
178
} )
227
179
}
228
180
229
181
pub fn draw ( & mut self , ctx : & mut Context ) -> GameResult < ( ) > {
230
182
if let Some ( _t) = self . tics {
231
- let _lock = graphics:: use_shader ( ctx, & self . dim_shader ) ;
183
+ {
184
+ let _lock = graphics:: use_shader ( ctx, & self . dim_shader ) ;
185
+
186
+ self . inner_draw ( ctx) ?;
187
+ }
232
188
233
- self . inner_draw ( ctx)
189
+ if self . draw_end_text . 0 && self . draw_end_text . 3 {
190
+ let mut draw_pos = 0. ;
191
+
192
+ // You Win
193
+ let end_frag = & Text :: new ( TextFragment :: new ( "You Win!" )
194
+ . font ( self . consolas )
195
+ . scale ( Scale :: uniform ( 50. ) )
196
+ ) ;
197
+
198
+ let end_dimensions = end_frag. dimensions ( ctx) ;
199
+
200
+ graphics:: draw ( ctx, end_frag, DrawParam :: default ( )
201
+ . dest ( Point2 :: new ( ( WIDTH / 2.0 ) - ( end_dimensions. 0 / 2 ) as f32 , 50.0 ) )
202
+ ) ?;
203
+
204
+ // End quote
205
+ for line in self . end . as_ref ( ) . unwrap ( ) . split ( "\\ n" ) . collect :: < Vec < _ > > ( ) {
206
+ let end_frag = & Text :: new ( TextFragment :: new ( line)
207
+ . font ( self . consolas )
208
+ ) ;
209
+
210
+ let end_dimensions = end_frag. dimensions ( ctx) ;
211
+
212
+ graphics:: draw ( ctx, end_frag, DrawParam :: default ( )
213
+ . dest ( Point2 :: new ( ( WIDTH / 2.0 ) - ( end_dimensions. 0 / 2 ) as f32 , HEIGHT / 2. + draw_pos) )
214
+ ) ?;
215
+
216
+ draw_pos += 20.0 ;
217
+ }
218
+ }
234
219
} else {
235
- self . inner_draw ( ctx)
220
+ self . inner_draw ( ctx) ? ;
236
221
}
222
+
223
+ graphics:: present ( ctx)
237
224
}
238
225
239
226
fn inner_draw ( & mut self , ctx : & mut Context ) -> GameResult < ( ) > {
@@ -277,7 +264,7 @@ impl Game {
277
264
// User Profile, etc..
278
265
self . draw_ui ( ctx) ?;
279
266
280
- graphics :: present ( ctx )
267
+ Ok ( ( ) )
281
268
}
282
269
283
270
fn draw_ui ( & mut self , ctx : & mut Context ) -> GameResult < ( ) > {
@@ -379,6 +366,30 @@ impl Game {
379
366
}
380
367
381
368
pub fn inner_update ( & mut self , ctx : & mut Context ) -> GameResult < Option < crate :: Screen > > {
369
+ if self . enemies . len ( ) == 0 {
370
+ self . draw_end_text . 3 = true ;
371
+
372
+ if self . draw_end_text . 1 . is_none ( ) {
373
+ self . draw_end_text . 1 = Some ( timer:: ticks ( ctx) ) ;
374
+ }
375
+
376
+ else if !self . draw_end_text . 2 {
377
+ if timer:: ticks ( ctx) - self . draw_end_text . 1 . unwrap ( ) > 30 {
378
+ self . draw_end_text . 0 = true ;
379
+ self . draw_end_text . 2 = true ;
380
+ }
381
+ }
382
+
383
+ else {
384
+ self . tics = Some ( 1 ) ;
385
+
386
+ if self . dim_constant . rate != 0.0 {
387
+ self . dim_constant . rate = lerp ( self . dim_constant . rate , 0.0 , 0.1 ) ;
388
+ self . dim_shader . send ( ctx, self . dim_constant ) ?;
389
+ }
390
+ }
391
+ }
392
+
382
393
let ferris_pos_x = self . player . pos_x ;
383
394
let ferris_pos_y = self . player . pos_y ;
384
395
@@ -556,6 +567,8 @@ impl Game {
556
567
557
568
if sys. 3 > 6 {
558
569
self . particles . remove ( i) ;
570
+
571
+ break ;
559
572
}
560
573
}
561
574
0 commit comments