@@ -12,6 +12,7 @@ function GameEngine(opts) {
12
12
width : 640
13
13
, height : 480
14
14
}
15
+ , config = opts . config || { resumeOnDrop : false }
15
16
, ctx // canvas context
16
17
, stars = [ ]
17
18
, gameData = { }
@@ -350,19 +351,51 @@ try {
350
351
, getLevelData = function ( ) { return gameData . levels [ level ] ; }
351
352
, getLevel = function ( ) { return level ; }
352
353
353
- , addWaveToLevel = function ( spriteIndex , x ) {
354
+ , addWaveToLevel = function ( spriteIndex , x , y ) {
355
+ var wasTicking = checkTicking ( )
356
+ if ( wasTicking ) stopTicking ( ) ;
357
+
358
+ // FIXME: calculations (calcTime, calcX) seem off a bit... almost right
354
359
var time = ticks - engine . levelStartTicks
360
+ , screenYOffset = parseInt ( window . getComputedStyle ( $ ( '#game-container' ) ) . top )
361
+ , yOffset = ( y - screenYOffset ) // cancel out screen's y-offset
362
+ , calcTime = time - yOffset // figure out tick to generate wave at if y > 0
363
+ , calcX = x || 0 // figure out what x would have been if y == 0
355
364
, levelData = gameData . levels [ level ]
356
- , waveData = {
357
- sprite : sprites . queue [ spriteIndex ] . getInfo ( ) . name
365
+ , spriteData = sprites . queue [ spriteIndex ] . getInfo ( )
366
+ , xDelta = ( spriteData . dx * spriteData . speed ) * yOffset
367
+ , yDelta = ( spriteData . dy * spriteData . speed ) * yOffset
368
+ ;
369
+
370
+ if ( calcTime < 0 ) calcTime = 0 ;
371
+ calcX -= xDelta ;
372
+
373
+ var waveData = {
374
+ sprite : spriteData . name
358
375
, class : 1
359
- , at : time
360
- , x : x
376
+ , at : calcTime
377
+ , x : calcX
378
+ , y : 0
361
379
}
362
380
;
363
381
364
- console . log ( 'create waveData' , waveData ) ;
382
+ // console.log('create waveData', waveData, 'using spriteData', spriteData, ' with spriteSpec', levelData.sprites[spriteData.name] );
365
383
levelData . waves . push ( waveData ) ;
384
+
385
+ // drop specified sprite at x,y
386
+ var spritesheetName = 'level-' + level + '-sprites'
387
+ , sprite = sprites . addSprite ( spritesheetName , levelData . sprites [ spriteData . name ] )
388
+ ;
389
+
390
+ sprite . moveTo ( x , yOffset ) ;
391
+
392
+ // resume ticking if we were previously
393
+ if ( config . resumeOnDrop && wasTicking )
394
+ startTicking ( )
395
+
396
+ // otherwise tick once to update the display
397
+ else
398
+ update ( ) ;
366
399
}
367
400
368
401
, getEngineState = function ( ) { return engine ; }
@@ -485,6 +518,7 @@ try {
485
518
486
519
// public api
487
520
return {
521
+ // methods
488
522
update : update
489
523
, getCtx : getCtx
490
524
, getTicks : getTicks
@@ -495,13 +529,16 @@ try {
495
529
, loadGame : loadGame
496
530
, getGameData : getGameData
497
531
, nextLevel : nextLevel
498
- , getLevelData : getLevelData
532
+ , getLevelData : getLevelData // should just export engine with other objects below
499
533
, getLevel : getLevel
500
- , audio : audio
501
- , sprites : sprites
502
534
, getEngineState : getEngineState
503
535
, playerEventStart : playerEventStart
504
536
, playerEventStop : playerEventStop
505
537
, addWaveToLevel : addWaveToLevel
538
+
539
+ // objects
540
+ , audio : audio
541
+ , sprites : sprites // SpriteManager
542
+ , config : config
506
543
} ;
507
544
}
0 commit comments