@@ -16,6 +16,7 @@ typedef float real32;
16
16
typedef double real64;
17
17
18
18
*/
19
+ type bool32 = i32 ;
19
20
use std:: convert:: TryInto ;
20
21
use std:: ffi:: c_void;
21
22
use std:: ptr:: null_mut;
@@ -46,6 +47,27 @@ pub struct GameInput {
46
47
pub struct thread_context {
47
48
pub place_hodler : i32 ,
48
49
}
50
+
51
+ struct tile_map {
52
+ pub CountX : i32 ,
53
+ pub CountY : i32 ,
54
+
55
+ pub UpperLeftX : f32 ,
56
+ pub UpperLeftY : f32 ,
57
+ pub TileWidth : f32 ,
58
+ pub TileHeight : f32 ,
59
+
60
+ pub Tiles : * const u32 , //look into making it so type implements trait Sized?
61
+ }
62
+
63
+ struct world {
64
+ // TODO(casey): Beginner's sparseness
65
+ pub TileMapCountX : i32 ,
66
+ pub TileMapCountY : i32 ,
67
+
68
+ pub TileMaps : * const tile_map ,
69
+ }
70
+
49
71
#[ derive( Default ) ]
50
72
pub struct GameControllerInput {
51
73
pub is_connected : i32 ,
@@ -131,6 +153,76 @@ pub struct DebugReadFile {
131
153
pub contents : * mut c_void ,
132
154
}
133
155
156
+ unsafe fn GetTileMap ( World : & world , TileMapX : i32 , TileMapY : i32 ) -> * mut tile_map {
157
+ let mut TileMap = 0 as * mut tile_map ;
158
+
159
+ if ( TileMapX >= 0 )
160
+ && ( TileMapX < World . TileMapCountX )
161
+ && ( TileMapY >= 0 )
162
+ && ( TileMapY < World . TileMapCountY . try_into ( ) . unwrap ( ) )
163
+ {
164
+ TileMap = World . TileMaps . offset (
165
+ ( TileMapY * World . TileMapCountX + TileMapX )
166
+ . try_into ( )
167
+ . unwrap ( ) ,
168
+ ) as * mut tile_map ;
169
+ }
170
+
171
+ return TileMap ;
172
+ }
173
+
174
+ unsafe fn GetTileValueUnchecked ( TileMap : & tile_map , TileX : i32 , TileY : i32 ) -> u32 {
175
+ let TileMapValue = TileMap
176
+ . Tiles
177
+ . offset ( ( TileY * TileMap . CountX + TileX ) . try_into ( ) . unwrap ( ) ) ;
178
+ return * TileMapValue ;
179
+ }
180
+
181
+ unsafe fn IsTileMapPointEmpty ( TileMap : & tile_map , TestX : f32 , TestY : f32 ) -> bool32 {
182
+ let mut Empty : bool32 = false as i32 ;
183
+
184
+ let PlayerTileX = ( ( TestX - TileMap . UpperLeftX ) / TileMap . TileWidth ) as i32 ;
185
+ let PlayerTileY = ( ( TestY - TileMap . UpperLeftY ) / TileMap . TileHeight ) as i32 ;
186
+
187
+ if ( PlayerTileX >= 0 )
188
+ && ( PlayerTileX < TileMap . CountX )
189
+ && ( PlayerTileY >= 0 )
190
+ && ( PlayerTileY < TileMap . CountY )
191
+ {
192
+ let TileMapValue = GetTileValueUnchecked ( & TileMap , PlayerTileX , PlayerTileY ) ;
193
+ Empty = ( TileMapValue == 0 ) as i32 ;
194
+ }
195
+
196
+ return Empty ;
197
+ }
198
+
199
+ unsafe fn IsWorldPointEmpty (
200
+ World : & world ,
201
+ TileMapX : i32 ,
202
+ TileMapY : i32 ,
203
+ TestX : f32 ,
204
+ TestY : f32 ,
205
+ ) -> bool32 {
206
+ let mut Empty : bool32 = false as bool32 ;
207
+
208
+ let TileMap = GetTileMap ( World , TileMapX , TileMapY ) ;
209
+ if TileMap != null_mut ( ) {
210
+ let PlayerTileX = ( ( TestX - ( * TileMap ) . UpperLeftX ) / ( * TileMap ) . TileWidth ) as i32 ;
211
+ let PlayerTileY = ( ( TestY - ( * TileMap ) . UpperLeftY ) / ( * TileMap ) . TileHeight ) as i32 ;
212
+
213
+ if ( PlayerTileX >= 0 )
214
+ && ( PlayerTileX < ( * TileMap ) . CountX )
215
+ && ( PlayerTileY >= 0 )
216
+ && ( PlayerTileY < ( * TileMap ) . CountY )
217
+ {
218
+ let TileMapValue = GetTileValueUnchecked ( & ( * TileMap ) , PlayerTileX , PlayerTileY ) ;
219
+ Empty = ( TileMapValue == 0 ) as bool32 ;
220
+ }
221
+ }
222
+
223
+ return Empty ;
224
+ }
225
+
134
226
#[ no_mangle]
135
227
pub extern "C" fn game_update_and_render (
136
228
thread : & thread_context ,
@@ -139,17 +231,119 @@ pub extern "C" fn game_update_and_render(
139
231
mut buffer : & mut GameOffScreenBuffer ,
140
232
) {
141
233
unsafe {
234
+ let TILE_MAP_COUNT_X = 17 ;
235
+ let TILE_MAP_COUNT_Y = 9 ;
236
+ //[9][17]
237
+ let Tiles00 = [
238
+ [ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ] ,
239
+ [ 1 , 1 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 1 ] ,
240
+ [ 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 1 ] ,
241
+ [ 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ] ,
242
+ [ 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] ,
243
+ [ 1 , 1 , 0 , 0 , 0 , 1 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 1 ] ,
244
+ [ 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 1 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 1 ] ,
245
+ [ 1 , 1 , 1 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 1 ] ,
246
+ [ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ] ,
247
+ ] ;
248
+
249
+ let Tiles01 = [
250
+ [ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ] ,
251
+ [ 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ] ,
252
+ [ 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ] ,
253
+ [ 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ] ,
254
+ [ 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] ,
255
+ [ 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ] ,
256
+ [ 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ] ,
257
+ [ 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ] ,
258
+ [ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ] ,
259
+ ] ;
260
+
261
+ let Tiles10 = [
262
+ [ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ] ,
263
+ [ 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ] ,
264
+ [ 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ] ,
265
+ [ 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ] ,
266
+ [ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ] ,
267
+ [ 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ] ,
268
+ [ 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ] ,
269
+ [ 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ] ,
270
+ [ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ] ,
271
+ ] ;
272
+
273
+ let Tiles11 = [
274
+ [ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ] ,
275
+ [ 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ] ,
276
+ [ 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ] ,
277
+ [ 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ] ,
278
+ [ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ] ,
279
+ [ 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ] ,
280
+ [ 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ] ,
281
+ [ 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ] ,
282
+ [ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ] ,
283
+ ] ;
284
+
285
+ // let mut TileMaps[2][2];
286
+ let tilemap00 = tile_map {
287
+ Tiles : Tiles00 . as_ptr ( ) as * mut u32 ,
288
+ CountX : TILE_MAP_COUNT_X ,
289
+ CountY : TILE_MAP_COUNT_Y ,
290
+ UpperLeftX : -30.0 ,
291
+ UpperLeftY : 0.0 ,
292
+ TileWidth : 60.0 ,
293
+ TileHeight : 60.0 ,
294
+ } ;
295
+ let mut TileMaps = [ [ tilemap00] ] ;
296
+
297
+
298
+ /* TileMaps[0][0].Tiles = (uint32 *)Tiles00;
299
+
300
+ TileMaps[0][1] = TileMaps[0][0];
301
+ TileMaps[0][1].Tiles = (uint32 *)Tiles01;
302
+
303
+ TileMaps[1][0] = TileMaps[0][0];
304
+ TileMaps[1][0].Tiles = (uint32 *)Tiles10;
305
+
306
+ TileMaps[1][1] = TileMaps[0][0];
307
+ TileMaps[1][1].Tiles = (uint32 *)Tiles11;
308
+
309
+ tile_map *TileMap = &TileMaps[0][0];
310
+ */
311
+ let TileMap = & TileMaps [ 0 ] [ 0 ] ;
312
+ let World = world {
313
+ TileMapCountX : 2 ,
314
+ TileMapCountY : 2 ,
315
+
316
+ TileMaps : TileMaps . as_ptr ( ) as * mut tile_map ,
317
+ } ;
318
+
319
+ let mut PlayerWidth = 0.75 * TileMap . TileWidth as f32 ;
320
+ let mut PlayerHeight = TileMap . TileHeight ;
142
321
let mut game_state = memory. permanent_storage as * mut GameState ;
322
+
143
323
if memory. is_initalized == 0 {
324
+ ( * game_state) . PlayerX = 150.0 ;
325
+ ( * game_state) . PlayerY = 150.0 ;
144
326
memory. is_initalized = 1 ;
145
327
}
328
+
329
+ let PlayerWidth = 0.75 * TileMap . TileWidth ;
330
+ let PlayerHeight = TileMap . TileHeight ;
331
+
332
+ let UpperLeftX : f32 = -30.0 ;
333
+ let UpperLeftY : f32 = 0.0 ;
334
+ let TileWidth : f32 = 60.0 ;
335
+ let TileHeight : f32 = 60.0 ;
336
+
337
+ let width = buffer. width ;
338
+ let height = buffer. height ;
339
+
146
340
for controller_index in 0 ..input. controllers . len ( ) {
147
341
let controller = & mut input. controllers [ controller_index] ;
148
342
if controller. is_analog != 0 {
149
343
} else {
150
344
// NOTE(casey): Use digital movement tuning
151
- let mut dPlayerX = 0.0 ; // pixels/second
152
- let mut dPlayerY = 0.0 ; // pixels/second
345
+ let mut dPlayerX: f32 = 0.0 ; // pixels/second
346
+ let mut dPlayerY: f32 = 0.0 ; // pixels/second
153
347
154
348
if controller. move_up ( ) . ended_down != 0 {
155
349
dPlayerY = -1.0 ;
@@ -167,30 +361,19 @@ pub extern "C" fn game_update_and_render(
167
361
dPlayerY *= 64.0 ;
168
362
169
363
// TODO(casey): Diagonal will be faster! Fix once we have vectors :)
170
- ( * game_state) . PlayerX += input. dtForFrame * dPlayerX as f32 ;
171
- ( * game_state) . PlayerY += input. dtForFrame * dPlayerY as f32 ;
172
- } ;
364
+ let NewPlayerX = ( * game_state) . PlayerX + input. dtForFrame * dPlayerX as f32 ;
365
+ let NewPlayerY = ( * game_state) . PlayerY + input. dtForFrame * dPlayerY as f32 ;
366
+
367
+ if IsTileMapPointEmpty ( & TileMap , NewPlayerX - 0.5 * PlayerWidth , NewPlayerY ) != 0
368
+ && IsTileMapPointEmpty ( & TileMap , NewPlayerX + 0.5 * PlayerWidth , NewPlayerY )
369
+ != 0
370
+ && IsTileMapPointEmpty ( & TileMap , NewPlayerX , NewPlayerY ) != 0
371
+ {
372
+ ( * game_state) . PlayerX = NewPlayerX ;
373
+ ( * game_state) . PlayerY = NewPlayerY ;
374
+ }
375
+ }
173
376
}
174
- //[9][17]
175
- let TileMap = [
176
- [ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ] ,
177
- [ 1 , 1 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 1 ] ,
178
- [ 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 1 ] ,
179
- [ 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ] ,
180
- [ 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] ,
181
- [ 1 , 1 , 0 , 0 , 0 , 1 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 1 ] ,
182
- [ 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 1 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 1 ] ,
183
- [ 1 , 1 , 1 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 1 ] ,
184
- [ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ] ,
185
- ] ;
186
-
187
- let UpperLeftX : f32 = -30.0 ;
188
- let UpperLeftY : f32 = 0.0 ;
189
- let TileWidth : f32 = 60.0 ;
190
- let TileHeight : f32 = 60.0 ;
191
-
192
- let width = buffer. width ;
193
- let height = buffer. height ;
194
377
195
378
DrawRectangle (
196
379
& mut buffer,
@@ -203,28 +386,28 @@ pub extern "C" fn game_update_and_render(
203
386
0.1 ,
204
387
) ;
205
388
206
- for ( row_index, row) in TileMap . iter ( ) . enumerate ( ) {
389
+ for ( row_index, row) in Tiles00 . iter ( ) . enumerate ( ) {
207
390
for ( column_index, column) in row. iter ( ) . enumerate ( ) {
208
- let tileID = column ;
391
+ let tileID = GetTileValueUnchecked ( & TileMap , column_index . try_into ( ) . unwrap ( ) , row_index . try_into ( ) . unwrap ( ) ) ;
209
392
let mut Gray = 0.5 ;
210
393
match tileID {
211
394
1 => Gray = 1.0 ,
212
395
_ => { }
213
396
}
214
- let mut MinX = UpperLeftX + ( column_index as f32 ) * TileWidth ;
215
- let mut MinY = UpperLeftY + ( row_index as f32 ) * TileHeight ;
216
- let mut MaxX = MinX + TileWidth ;
217
- let mut MaxY = MinY + TileHeight ;
397
+ let mut MinX = TileMap . UpperLeftX + ( column_index as f32 ) * TileWidth ;
398
+ let mut MinY = TileMap . UpperLeftY + ( row_index as f32 ) * TileHeight ;
399
+ let mut MaxX = MinX + TileMap . TileWidth ;
400
+ let mut MaxY = MinY + TileMap . TileHeight ;
218
401
DrawRectangle ( buffer, MinX , MinY , MaxX , MaxY , Gray , Gray , Gray ) ;
219
402
}
220
403
}
221
404
let PlayerR = 1.0 ;
222
405
let PlayerG = 1.0 ;
223
406
let mut PlayerB = 0.0 ;
224
- let mut PlayerWidth = 0.75 * TileWidth as f32 ;
225
- let mut PlayerHeight = TileHeight ;
407
+
226
408
let mut PlayerLeft = ( * game_state) . PlayerX - 0.5 * PlayerWidth ;
227
409
let mut PlayerTop = ( * game_state) . PlayerY - PlayerHeight as f32 ;
410
+
228
411
DrawRectangle (
229
412
buffer,
230
413
PlayerLeft ,
0 commit comments