litecanvas 0.79.0 → 0.79.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/src/index.js CHANGED
@@ -12,8 +12,7 @@ import './types.js'
12
12
  export default function litecanvas(settings = {}) {
13
13
  const root = globalThis,
14
14
  math = Math,
15
- PI = math.PI,
16
- TWO_PI = PI * 2,
15
+ TWO_PI = math.PI * 2,
17
16
  raf = requestAnimationFrame,
18
17
  /** @type {Function[]} */
19
18
  _browserEventListeners = [],
@@ -24,7 +23,7 @@ export default function litecanvas(settings = {}) {
24
23
  elem.removeEventListener(evt, callback, false)
25
24
  )
26
25
  },
27
- isFinite = Number.isFinite,
26
+ isNumber = Number.isFinite,
28
27
  /** @type {LitecanvasOptions} */
29
28
  defaults = {
30
29
  width: null,
@@ -49,12 +48,10 @@ export default function litecanvas(settings = {}) {
49
48
  /** @type {Function[]} */
50
49
  _plugins = [],
51
50
  /** @type {HTMLCanvasElement|string} _canvas */
52
- _canvas = settings.canvas || document.createElement('canvas'),
53
- /** @type {boolean} */
54
- _animated = settings.animate,
51
+ _canvas,
55
52
  /** @type {number} */
56
53
  _scale = 1,
57
- /** @type {CanvasRenderingContext2D} */
54
+ /** @type {CanvasRenderingContext2D|OffscreenCanvasRenderingContext2D} */
58
55
  _ctx,
59
56
  /** @type {number} */
60
57
  _outline_fix = 0.5,
@@ -62,7 +59,7 @@ export default function litecanvas(settings = {}) {
62
59
  _timeScale = 1,
63
60
  /** @type {number} */
64
61
  _lastFrameTime,
65
- /** @type {number} */
62
+ /** @type {number} duration of a frame at 60 FPS (default) */
66
63
  _deltaTime = 1 / 60,
67
64
  /** @type {number} */
68
65
  _accumulated = 0,
@@ -74,21 +71,19 @@ export default function litecanvas(settings = {}) {
74
71
  _fontSize = 20,
75
72
  /** @type {number} */
76
73
  _rng_seed = Date.now(),
77
- /** @type {boolean} */
78
- _global = settings.global,
79
74
  /**
80
75
  * default game events
81
76
  * @type {Object<string,Set<Function>>}
82
77
  */
83
78
  _events = {
84
- init: null,
85
- update: null,
86
- draw: null,
87
- resized: null,
88
- tap: null,
89
- untap: null,
90
- tapping: null,
91
- tapped: null,
79
+ init: false,
80
+ update: false,
81
+ draw: false,
82
+ resized: false,
83
+ tap: false,
84
+ untap: false,
85
+ tapping: false,
86
+ tapped: false,
92
87
  },
93
88
  /**
94
89
  * Helpers to be used by plugins
@@ -103,13 +98,13 @@ export default function litecanvas(settings = {}) {
103
98
  /** @type {LitecanvasInstance} */
104
99
  const instance = {
105
100
  /** @type {number} */
106
- WIDTH: settings.width,
101
+ WIDTH: 0,
107
102
 
108
103
  /** @type {number} */
109
- HEIGHT: settings.height || settings.width,
104
+ HEIGHT: 0,
110
105
 
111
106
  /** @type {HTMLCanvasElement} */
112
- CANVAS: null,
107
+ CANVAS: false,
113
108
 
114
109
  /** @type {number} */
115
110
  ELAPSED: 0,
@@ -127,7 +122,7 @@ export default function litecanvas(settings = {}) {
127
122
  MOUSEY: -1,
128
123
 
129
124
  /** @type {number[]} */
130
- DEFAULT_SFX: [0.5, , 1675, , 0.06, 0.2, 1, 1.8, , , 637, 0.06],
125
+ DEFAULT_SFX: [0.5, 0, 1750, , , 0.3, 1, , , , 600, 0.1],
131
126
 
132
127
  /** MATH API */
133
128
  /**
@@ -147,7 +142,7 @@ export default function litecanvas(settings = {}) {
147
142
  *
148
143
  * @type {number}
149
144
  */
150
- HALF_PI: PI / 2,
145
+ HALF_PI: math.PI / 2,
151
146
 
152
147
  /**
153
148
  * Calculates a linear (interpolation) value over t%.
@@ -159,9 +154,9 @@ export default function litecanvas(settings = {}) {
159
154
  * @tutorial https://gamedev.net/tutorials/programming/general-and-gameplay-programming/a-brief-introduction-to-lerp-r4954/
160
155
  */
161
156
  lerp: (start, end, t) => {
162
- DEV: assert(isFinite(start), 'lerp: 1st param must be a number')
163
- DEV: assert(isFinite(end), 'lerp: 2nd param must be a number')
164
- DEV: assert(isFinite(t), 'lerp: 3rd param must be a number')
157
+ DEV: assert(isNumber(start), 'lerp: 1st param must be a number')
158
+ DEV: assert(isNumber(end), 'lerp: 2nd param must be a number')
159
+ DEV: assert(isNumber(t), 'lerp: 3rd param must be a number')
165
160
 
166
161
  return t * (end - start) + start
167
162
  },
@@ -173,9 +168,9 @@ export default function litecanvas(settings = {}) {
173
168
  * @returns {number} the value in radians
174
169
  */
175
170
  deg2rad: (degs) => {
176
- DEV: assert(isFinite(degs), 'deg2rad: 1st param must be a number')
171
+ DEV: assert(isNumber(degs), 'deg2rad: 1st param must be a number')
177
172
 
178
- return (PI / 180) * degs
173
+ return (math.PI / 180) * degs
179
174
  },
180
175
 
181
176
  /**
@@ -185,9 +180,9 @@ export default function litecanvas(settings = {}) {
185
180
  * @returns {number} the value in degrees
186
181
  */
187
182
  rad2deg: (rads) => {
188
- DEV: assert(isFinite(rads), 'rad2deg: 1st param must be a number')
183
+ DEV: assert(isNumber(rads), 'rad2deg: 1st param must be a number')
189
184
 
190
- return (180 / PI) * rads
185
+ return (180 / math.PI) * rads
191
186
  },
192
187
 
193
188
  /**
@@ -200,9 +195,9 @@ export default function litecanvas(settings = {}) {
200
195
  * @returns {number} rounded number.
201
196
  */
202
197
  round: (n, precision = 0) => {
203
- DEV: assert(isFinite(n), 'round: 1st param must be a number')
198
+ DEV: assert(isNumber(n), 'round: 1st param must be a number')
204
199
  DEV: assert(
205
- null === precision || (isFinite(precision) && precision >= 0),
200
+ null == precision || (isNumber(precision) && precision >= 0),
206
201
  'round: 2nd param must be a positive number or zero'
207
202
  )
208
203
  if (!precision) {
@@ -221,9 +216,9 @@ export default function litecanvas(settings = {}) {
221
216
  * @returns {number}
222
217
  */
223
218
  clamp: (value, min, max) => {
224
- DEV: assert(isFinite(value), 'clamp: 1st param must be a number')
225
- DEV: assert(isFinite(min), 'clamp: 2nd param must be a number')
226
- DEV: assert(isFinite(max), 'clamp: 3rd param must be a number')
219
+ DEV: assert(isNumber(value), 'clamp: 1st param must be a number')
220
+ DEV: assert(isNumber(min), 'clamp: 2nd param must be a number')
221
+ DEV: assert(isNumber(max), 'clamp: 3rd param must be a number')
227
222
  DEV: assert(
228
223
  max > min,
229
224
  'randi: the 2nd param must be less than the 3rd param'
@@ -243,9 +238,9 @@ export default function litecanvas(settings = {}) {
243
238
  * @returns {number}
244
239
  */
245
240
  wrap: (value, min, max) => {
246
- DEV: assert(isFinite(value), 'wrap: 1st param must be a number')
247
- DEV: assert(isFinite(min), 'wrap: 2nd param must be a number')
248
- DEV: assert(isFinite(max), 'wrap: 3rd param must be a number')
241
+ DEV: assert(isNumber(value), 'wrap: 1st param must be a number')
242
+ DEV: assert(isNumber(min), 'wrap: 2nd param must be a number')
243
+ DEV: assert(isNumber(max), 'wrap: 3rd param must be a number')
249
244
  DEV: assert(
250
245
  max > min,
251
246
  'randi: the 2nd param must be less than the 3rd param'
@@ -270,11 +265,11 @@ export default function litecanvas(settings = {}) {
270
265
  * @returns {number} the remapped number
271
266
  */
272
267
  map(value, start1, stop1, start2, stop2, withinBounds) {
273
- DEV: assert(isFinite(value), 'map: 1st param must be a number')
274
- DEV: assert(isFinite(start1), 'map: 2nd param must be a number')
275
- DEV: assert(isFinite(stop1), 'map: 3rd param must be a number')
276
- DEV: assert(isFinite(start2), 'map: 4th param must be a number')
277
- DEV: assert(isFinite(stop2), 'map: 5th param must be a number')
268
+ DEV: assert(isNumber(value), 'map: 1st param must be a number')
269
+ DEV: assert(isNumber(start1), 'map: 2nd param must be a number')
270
+ DEV: assert(isNumber(stop1), 'map: 3rd param must be a number')
271
+ DEV: assert(isNumber(start2), 'map: 4th param must be a number')
272
+ DEV: assert(isNumber(stop2), 'map: 5th param must be a number')
278
273
 
279
274
  // prettier-ignore
280
275
  const result = ((value - start1) / (stop1 - start1)) * (stop2 - start2) + start2
@@ -292,9 +287,9 @@ export default function litecanvas(settings = {}) {
292
287
  * @returns {number} the normalized number.
293
288
  */
294
289
  norm: (value, start, stop) => {
295
- DEV: assert(isFinite(value), 'norm: 1st param must be a number')
296
- DEV: assert(isFinite(start), 'norm: 2nd param must be a number')
297
- DEV: assert(isFinite(stop), 'norm: 3rd param must be a number')
290
+ DEV: assert(isNumber(value), 'norm: 1st param must be a number')
291
+ DEV: assert(isNumber(start), 'norm: 2nd param must be a number')
292
+ DEV: assert(isNumber(stop), 'norm: 3rd param must be a number')
298
293
 
299
294
  return instance.map(value, start, stop, 0, 1)
300
295
  },
@@ -309,8 +304,8 @@ export default function litecanvas(settings = {}) {
309
304
  * @returns {number} the random number
310
305
  */
311
306
  rand: (min = 0.0, max = 1.0) => {
312
- DEV: assert(isFinite(min), 'rand: 1st param must be a number')
313
- DEV: assert(isFinite(max), 'rand: 2nd param must be a number')
307
+ DEV: assert(isNumber(min), 'rand: 1st param must be a number')
308
+ DEV: assert(isNumber(max), 'rand: 2nd param must be a number')
314
309
  DEV: assert(
315
310
  max > min,
316
311
  'rand: the 1st param must be less than the 2nd param'
@@ -333,8 +328,8 @@ export default function litecanvas(settings = {}) {
333
328
  * @returns {number} the random number
334
329
  */
335
330
  randi: (min = 0, max = 1) => {
336
- DEV: assert(isFinite(min), 'randi: 1st param must be a number')
337
- DEV: assert(isFinite(max), 'randi: 2nd param must be a number')
331
+ DEV: assert(isNumber(min), 'randi: 1st param must be a number')
332
+ DEV: assert(isNumber(max), 'randi: 2nd param must be a number')
338
333
  DEV: assert(
339
334
  max > min,
340
335
  'randi: the 1st param must be less than the 2nd param'
@@ -352,7 +347,7 @@ export default function litecanvas(settings = {}) {
352
347
  */
353
348
  seed: (value) => {
354
349
  DEV: assert(
355
- null == value || (isFinite(value) && value >= 0),
350
+ null == value || (isNumber(value) && value >= 0),
356
351
  'seed: 1st param must be a positive number or zero'
357
352
  )
358
353
 
@@ -363,11 +358,11 @@ export default function litecanvas(settings = {}) {
363
358
  /**
364
359
  * Clear the game screen with an optional color
365
360
  *
366
- * @param {number?} color The background color (index) or null/undefined (for transparent)
361
+ * @param {number} [color] The background color (index) or null/undefined (for transparent)
367
362
  */
368
363
  cls(color) {
369
364
  DEV: assert(
370
- null == color || (isFinite(color) && color >= 0),
365
+ null == color || (isNumber(color) && color >= 0),
371
366
  'cls: 1st param must be a positive number or zero or undefined'
372
367
  )
373
368
 
@@ -394,24 +389,24 @@ export default function litecanvas(settings = {}) {
394
389
  * @param {number} [color=0] the color index
395
390
  * @param {number|number[]} [radii] A number or list specifying the radii used to draw a rounded-borders rectangle
396
391
  */
397
- rect(x, y, width, height, color, radii = null) {
398
- DEV: assert(isFinite(x), 'rect: 1st param must be a number')
399
- DEV: assert(isFinite(y), 'rect: 2nd param must be a number')
392
+ rect(x, y, width, height, color, radii) {
393
+ DEV: assert(isNumber(x), 'rect: 1st param must be a number')
394
+ DEV: assert(isNumber(y), 'rect: 2nd param must be a number')
400
395
  DEV: assert(
401
- isFinite(width) && width > 0,
396
+ isNumber(width) && width > 0,
402
397
  'rect: 3rd param must be a positive number'
403
398
  )
404
399
  DEV: assert(
405
- isFinite(height) && height >= 0,
400
+ isNumber(height) && height >= 0,
406
401
  'rect: 4th param must be a positive number or zero'
407
402
  )
408
403
  DEV: assert(
409
- null == color || (isFinite(color) && color >= 0),
404
+ null == color || (isNumber(color) && color >= 0),
410
405
  'rect: 5th param must be a positive number or zero'
411
406
  )
412
407
  DEV: assert(
413
408
  null == radii ||
414
- isFinite(radii) ||
409
+ isNumber(radii) ||
415
410
  (Array.isArray(radii) && radii.length >= 1),
416
411
  'rect: 6th param must be a number or array of numbers'
417
412
  )
@@ -437,24 +432,24 @@ export default function litecanvas(settings = {}) {
437
432
  * @param {number} [color=0] the color index
438
433
  * @param {number|number[]} [radii] A number or list specifying the radii used to draw a rounded-borders rectangle
439
434
  */
440
- rectfill(x, y, width, height, color, radii = null) {
441
- DEV: assert(isFinite(x), 'rectfill: 1st param must be a number')
442
- DEV: assert(isFinite(y), 'rectfill: 2nd param must be a number')
435
+ rectfill(x, y, width, height, color, radii) {
436
+ DEV: assert(isNumber(x), 'rectfill: 1st param must be a number')
437
+ DEV: assert(isNumber(y), 'rectfill: 2nd param must be a number')
443
438
  DEV: assert(
444
- isFinite(width) && width >= 0,
439
+ isNumber(width) && width >= 0,
445
440
  'rectfill: 3rd param must be a positive number or zero'
446
441
  )
447
442
  DEV: assert(
448
- isFinite(height) && height >= 0,
443
+ isNumber(height) && height >= 0,
449
444
  'rectfill: 4th param must be a positive number or zero'
450
445
  )
451
446
  DEV: assert(
452
- null == color || (isFinite(color) && color >= 0),
447
+ null == color || (isNumber(color) && color >= 0),
453
448
  'rectfill: 5th param must be a positive number or zero'
454
449
  )
455
450
  DEV: assert(
456
451
  null == radii ||
457
- isFinite(radii) ||
452
+ isNumber(radii) ||
458
453
  (Array.isArray(radii) && radii.length >= 1),
459
454
  'rectfill: 6th param must be a number or array of at least 2 numbers'
460
455
  )
@@ -479,14 +474,14 @@ export default function litecanvas(settings = {}) {
479
474
  * @param {number} [color=0] the color index
480
475
  */
481
476
  circ(x, y, radius, color) {
482
- DEV: assert(isFinite(x), 'circ: 1st param must be a number')
483
- DEV: assert(isFinite(y), 'circ: 2nd param must be a number')
477
+ DEV: assert(isNumber(x), 'circ: 1st param must be a number')
478
+ DEV: assert(isNumber(y), 'circ: 2nd param must be a number')
484
479
  DEV: assert(
485
- isFinite(radius) && radius >= 0,
480
+ isNumber(radius) && radius >= 0,
486
481
  'circ: 3rd param must be a positive number or zero'
487
482
  )
488
483
  DEV: assert(
489
- null == color || (isFinite(color) && color >= 0),
484
+ null == color || (isNumber(color) && color >= 0),
490
485
  'circ: 4th param must be a positive number or zero'
491
486
  )
492
487
 
@@ -504,14 +499,14 @@ export default function litecanvas(settings = {}) {
504
499
  * @param {number} [color=0] the color index
505
500
  */
506
501
  circfill(x, y, radius, color) {
507
- DEV: assert(isFinite(x), 'circfill: 1st param must be a number')
508
- DEV: assert(isFinite(y), 'circfill: 2nd param must be a number')
502
+ DEV: assert(isNumber(x), 'circfill: 1st param must be a number')
503
+ DEV: assert(isNumber(y), 'circfill: 2nd param must be a number')
509
504
  DEV: assert(
510
- isFinite(radius) && radius >= 0,
505
+ isNumber(radius) && radius >= 0,
511
506
  'circfill: 3rd param must be a positive number or zero'
512
507
  )
513
508
  DEV: assert(
514
- null == color || (isFinite(color) && color >= 0),
509
+ null == color || (isNumber(color) && color >= 0),
515
510
  'circfill: 4th param must be a positive number or zero'
516
511
  )
517
512
 
@@ -530,18 +525,18 @@ export default function litecanvas(settings = {}) {
530
525
  * @param {number} [color=0] the color index
531
526
  */
532
527
  line(x1, y1, x2, y2, color) {
533
- DEV: assert(isFinite(x1), 'line: 1st param must be a number')
534
- DEV: assert(isFinite(y1), 'line: 2nd param must be a number')
528
+ DEV: assert(isNumber(x1), 'line: 1st param must be a number')
529
+ DEV: assert(isNumber(y1), 'line: 2nd param must be a number')
535
530
  DEV: assert(
536
- isFinite(x2),
531
+ isNumber(x2),
537
532
  'line: 3rd param must be a positive number or zero'
538
533
  )
539
534
  DEV: assert(
540
- isFinite(y2),
535
+ isNumber(y2),
541
536
  'line: 4th param must be a positive number or zero'
542
537
  )
543
538
  DEV: assert(
544
- null == color || (isFinite(color) && color >= 0),
539
+ null == color || (isNumber(color) && color >= 0),
545
540
  'line: 5th param must be a positive number or zero'
546
541
  )
547
542
 
@@ -564,12 +559,12 @@ export default function litecanvas(settings = {}) {
564
559
  */
565
560
  linewidth(value) {
566
561
  DEV: assert(
567
- isFinite(value) && ~~value > 0,
562
+ isNumber(value) && ~~value > 0,
568
563
  'linewidth: 1st param must be a positive number'
569
564
  )
570
565
 
571
566
  _ctx.lineWidth = ~~value
572
- _outline_fix = ~~value % 2 === 0 ? 0 : 0.5
567
+ _outline_fix = 0 === ~~value % 2 ? 0 : 0.5
573
568
  },
574
569
 
575
570
  /**
@@ -586,7 +581,7 @@ export default function litecanvas(settings = {}) {
586
581
  'linedash: 1st param must be an array of numbers'
587
582
  )
588
583
  DEV: assert(
589
- isFinite(offset),
584
+ isNumber(offset),
590
585
  'linedash: 2nd param must be a number'
591
586
  )
592
587
 
@@ -605,14 +600,14 @@ export default function litecanvas(settings = {}) {
605
600
  * @param {string} [fontStyle] can be "normal" (default), "italic" and/or "bold".
606
601
  */
607
602
  text(x, y, message, color = 3, fontStyle = 'normal') {
608
- DEV: assert(isFinite(x), 'text: 1st param must be a number')
609
- DEV: assert(isFinite(y), 'text: 2nd param must be a number')
603
+ DEV: assert(isNumber(x), 'text: 1st param must be a number')
604
+ DEV: assert(isNumber(y), 'text: 2nd param must be a number')
610
605
  // DEV: assert(
611
606
  // 'string' === typeof message,
612
607
  // 'text: 3rd param must be a string'
613
608
  // )
614
609
  DEV: assert(
615
- null == color || (isFinite(color) && color >= 0),
610
+ null == color || (isNumber(color) && color >= 0),
616
611
  'text: 4th param must be a positive number or zero'
617
612
  )
618
613
  DEV: assert(
@@ -645,7 +640,7 @@ export default function litecanvas(settings = {}) {
645
640
  * @param {number} size
646
641
  */
647
642
  textsize(size) {
648
- DEV: assert(isFinite(size), 'textsize: 1st param must be a number')
643
+ DEV: assert(isNumber(size), 'textsize: 1st param must be a number')
649
644
 
650
645
  _fontSize = size
651
646
  },
@@ -690,14 +685,14 @@ export default function litecanvas(settings = {}) {
690
685
  * @param {OffscreenCanvas|HTMLImageElement|HTMLCanvasElement} source
691
686
  */
692
687
  image(x, y, source) {
693
- DEV: assert(isFinite(x), 'image: 1st param must be a number')
694
- DEV: assert(isFinite(y), 'image: 2nd param must be a number')
688
+ DEV: assert(isNumber(x), 'image: 1st param must be a number')
689
+ DEV: assert(isNumber(y), 'image: 2nd param must be a number')
695
690
 
696
691
  _ctx.drawImage(source, ~~x, ~~y)
697
692
  },
698
693
 
699
694
  /**
700
- * Creates a offscreen canvas to draw on it
695
+ * Draw in an OffscreenCanvas and returns its image.
701
696
  *
702
697
  * @param {number} width
703
698
  * @param {number} height
@@ -705,22 +700,23 @@ export default function litecanvas(settings = {}) {
705
700
  * @param {object} [options]
706
701
  * @param {number} [options.scale=1]
707
702
  * @param {OffscreenCanvas | HTMLCanvasElement} [options.canvas]
708
- * @returns {OffscreenCanvas}
703
+ * @returns {ImageBitmap}
709
704
  * @see https://developer.mozilla.org/en-US/docs/Web/API/OffscreenCanvas
710
705
  */
711
706
  paint(width, height, drawing, options = {}) {
712
- DEV: assert(isFinite(width), 'paint: 1st param must be a number')
713
- DEV: assert(isFinite(height), 'paint: 2nd param must be a number')
707
+ DEV: assert(isNumber(width), 'paint: 1st param must be a number')
708
+ DEV: assert(isNumber(height), 'paint: 2nd param must be a number')
714
709
  DEV: assert(
715
710
  'function' === typeof drawing || Array.isArray(drawing),
716
711
  'paint: 3rd param must be a function or array'
717
712
  )
718
713
  DEV: assert(
719
- (options && !options.scale) || isFinite(options.scale),
714
+ (options && !options.scale) || isNumber(options.scale),
720
715
  'paint: 4th param (options.scale) must be a number'
721
716
  )
722
717
 
723
- const canvas = options.canvas || new OffscreenCanvas(1, 1),
718
+ const /** @type {OffscreenCanvas} */
719
+ canvas = options.canvas || new OffscreenCanvas(1, 1),
724
720
  scale = options.scale || 1,
725
721
  contextOriginal = _ctx
726
722
 
@@ -754,7 +750,7 @@ export default function litecanvas(settings = {}) {
754
750
 
755
751
  _ctx = contextOriginal // restore the context
756
752
 
757
- return canvas
753
+ return canvas.transferToImageBitmap()
758
754
  },
759
755
 
760
756
  /** ADVANCED GRAPHICS API */
@@ -793,8 +789,8 @@ export default function litecanvas(settings = {}) {
793
789
  * @param {number} y
794
790
  */
795
791
  translate: (x, y) => {
796
- DEV: assert(isFinite(x), 'translate: 1st param must be a number')
797
- DEV: assert(isFinite(y), 'translate: 2nd param must be a number')
792
+ DEV: assert(isNumber(x), 'translate: 1st param must be a number')
793
+ DEV: assert(isNumber(y), 'translate: 2nd param must be a number')
798
794
 
799
795
  return _ctx.translate(~~x, ~~y)
800
796
  },
@@ -806,9 +802,9 @@ export default function litecanvas(settings = {}) {
806
802
  * @param {number} [y]
807
803
  */
808
804
  scale: (x, y) => {
809
- DEV: assert(isFinite(x), 'scale: 1st param must be a number')
805
+ DEV: assert(isNumber(x), 'scale: 1st param must be a number')
810
806
  DEV: assert(
811
- y == null || isFinite(y),
807
+ null == y || isNumber(y),
812
808
  'scale: 2nd param must be a number'
813
809
  )
814
810
 
@@ -821,7 +817,7 @@ export default function litecanvas(settings = {}) {
821
817
  * @param {number} radians
822
818
  */
823
819
  rotate: (radians) => {
824
- DEV: assert(isFinite(radians), 'rotate: 1st param must be a number')
820
+ DEV: assert(isNumber(radians), 'rotate: 1st param must be a number')
825
821
 
826
822
  return _ctx.rotate(radians)
827
823
  },
@@ -833,7 +829,7 @@ export default function litecanvas(settings = {}) {
833
829
  * @see https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalAlpha
834
830
  */
835
831
  alpha(value) {
836
- DEV: assert(isFinite(value), 'alpha: 1st param must be a number')
832
+ DEV: assert(isNumber(value), 'alpha: 1st param must be a number')
837
833
 
838
834
  _ctx.globalAlpha = instance.clamp(value, 0, 1)
839
835
  },
@@ -864,7 +860,7 @@ export default function litecanvas(settings = {}) {
864
860
  */
865
861
  fill(color, path) {
866
862
  DEV: assert(
867
- null == color || (isFinite(color) && color >= 0),
863
+ null == color || (isNumber(color) && color >= 0),
868
864
  'fill: 1st param must be a positive number or zero'
869
865
  )
870
866
  DEV: assert(
@@ -888,7 +884,7 @@ export default function litecanvas(settings = {}) {
888
884
  */
889
885
  stroke(color, path) {
890
886
  DEV: assert(
891
- null == color || (isFinite(color) && color >= 0),
887
+ null == color || (isNumber(color) && color >= 0),
892
888
  'stroke: 1st param must be a positive number or zero'
893
889
  )
894
890
  DEV: assert(
@@ -936,9 +932,9 @@ export default function litecanvas(settings = {}) {
936
932
  null == zzfxParams || Array.isArray(zzfxParams),
937
933
  'sfx: 1st param must be an array'
938
934
  )
939
- DEV: assert(isFinite(pitchSlide), 'sfx: 2nd param must be a number')
935
+ DEV: assert(isNumber(pitchSlide), 'sfx: 2nd param must be a number')
940
936
  DEV: assert(
941
- isFinite(volumeFactor),
937
+ isNumber(volumeFactor),
942
938
  'sfx: 3rd param must be a number'
943
939
  )
944
940
 
@@ -971,7 +967,7 @@ export default function litecanvas(settings = {}) {
971
967
  * @param {number} value
972
968
  */
973
969
  volume(value) {
974
- DEV: assert(isFinite(value), 'volume: 1st param must be a number')
970
+ DEV: assert(isNumber(value), 'volume: 1st param must be a number')
975
971
 
976
972
  root.zzfxV = value
977
973
  },
@@ -1050,7 +1046,7 @@ export default function litecanvas(settings = {}) {
1050
1046
  */
1051
1047
  getcolor: (index) => {
1052
1048
  DEV: assert(
1053
- null == index || (isFinite(index) && index >= 0),
1049
+ null == index || (isNumber(index) && index >= 0),
1054
1050
  'getcolor: 1st param must be a number'
1055
1051
  )
1056
1052
 
@@ -1068,12 +1064,12 @@ export default function litecanvas(settings = {}) {
1068
1064
  'string' === typeof key,
1069
1065
  'setvar: 1st param must be a string'
1070
1066
  )
1071
- if (value == null) {
1067
+ if (null == value) {
1072
1068
  console.warn(`setvar: key "${key}" was defined as ${value}`)
1073
1069
  }
1074
1070
 
1075
1071
  instance[key] = value
1076
- if (_global) {
1072
+ if (settings.global) {
1077
1073
  root[key] = value
1078
1074
  }
1079
1075
  },
@@ -1087,7 +1083,7 @@ export default function litecanvas(settings = {}) {
1087
1083
  */
1088
1084
  timescale(value) {
1089
1085
  DEV: assert(
1090
- isFinite(value),
1086
+ isNumber(value),
1091
1087
  'timescale: 1st param must be a number'
1092
1088
  )
1093
1089
 
@@ -1101,7 +1097,7 @@ export default function litecanvas(settings = {}) {
1101
1097
  */
1102
1098
  setfps(value) {
1103
1099
  DEV: assert(
1104
- isFinite(value) && value >= 1,
1100
+ isNumber(value) && value >= 1,
1105
1101
  'setfps: 1st param must be a positive number'
1106
1102
  )
1107
1103
 
@@ -1127,7 +1123,7 @@ export default function litecanvas(settings = {}) {
1127
1123
  }
1128
1124
 
1129
1125
  // maybe clear global context
1130
- if (_global) {
1126
+ if (settings.global) {
1131
1127
  for (const key in instance) {
1132
1128
  delete root[key]
1133
1129
  }
@@ -1293,7 +1289,7 @@ export default function litecanvas(settings = {}) {
1293
1289
 
1294
1290
  /**
1295
1291
  * @param {Set<string>} keysSet
1296
- * @param {string?} key
1292
+ * @param {string} [key]
1297
1293
  * @returns {boolean}
1298
1294
  */
1299
1295
  const keyCheck = (keysSet, key) => {
@@ -1324,7 +1320,7 @@ export default function litecanvas(settings = {}) {
1324
1320
  * Checks if a which key is pressed (down) on the keyboard.
1325
1321
  * Note: use `iskeydown()` to check for any key.
1326
1322
  *
1327
- * @param {string?} key
1323
+ * @param {string} [key]
1328
1324
  * @returns {boolean}
1329
1325
  */
1330
1326
  (key) => {
@@ -1342,7 +1338,7 @@ export default function litecanvas(settings = {}) {
1342
1338
  * Checks if a which key just got pressed on the keyboard.
1343
1339
  * Note: use `iskeypressed()` to check for any key.
1344
1340
  *
1345
- * @param {string?} key
1341
+ * @param {string} [key]
1346
1342
  * @returns {boolean}
1347
1343
  */
1348
1344
  (key) => {
@@ -1384,7 +1380,7 @@ export default function litecanvas(settings = {}) {
1384
1380
 
1385
1381
  _lastFrameTime = now
1386
1382
 
1387
- if (_animated) {
1383
+ if (settings.animate) {
1388
1384
  // request the next frame
1389
1385
  _rafid = raf(drawFrame)
1390
1386
 
@@ -1418,6 +1414,8 @@ export default function litecanvas(settings = {}) {
1418
1414
  }
1419
1415
 
1420
1416
  function setupCanvas() {
1417
+ _canvas = settings.canvas || document.createElement('canvas')
1418
+
1421
1419
  /** @type {HTMLCanvasElement} */
1422
1420
  _canvas =
1423
1421
  'string' === typeof _canvas
@@ -1444,12 +1442,12 @@ export default function litecanvas(settings = {}) {
1444
1442
  function resizeCanvas() {
1445
1443
  DEV: assert(
1446
1444
  null == settings.width ||
1447
- (isFinite(settings.width) && settings.width > 0),
1445
+ (isNumber(settings.width) && settings.width > 0),
1448
1446
  'Litecanvas\' option "width" should be a positive number when defined'
1449
1447
  )
1450
1448
  DEV: assert(
1451
1449
  null == settings.height ||
1452
- (isFinite(settings.height) && settings.height > 0),
1450
+ (isNumber(settings.height) && settings.height > 0),
1453
1451
  'Litecanvas\' option "height" should be a positive number when defined'
1454
1452
  )
1455
1453
  DEV: assert(
@@ -1493,7 +1491,7 @@ export default function litecanvas(settings = {}) {
1493
1491
  instance.emit('resized', _scale)
1494
1492
 
1495
1493
  // force redraw
1496
- if (!_animated) {
1494
+ if (!settings.animate) {
1497
1495
  raf(drawFrame)
1498
1496
  }
1499
1497
  }
@@ -1521,9 +1519,9 @@ export default function litecanvas(settings = {}) {
1521
1519
  }
1522
1520
  }
1523
1521
 
1524
- if (_global) {
1522
+ if (settings.global) {
1525
1523
  if (root.ENGINE) {
1526
- throw 'two global litecanvas detected'
1524
+ throw new Error('two global litecanvas detected')
1527
1525
  }
1528
1526
  Object.assign(root, instance)
1529
1527
  root.ENGINE = instance