q5 3.9.4 → 4.0.1

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/defs/q5-es.d.ts DELETED
@@ -1,4352 +0,0 @@
1
- declare global {
2
-
3
- // ⭐ núcleo
4
-
5
- /**
6
- * Bienvenido al contenido de q5! 🤩
7
- *
8
- * ¿Primera vez programando? Revisa la [guía para principiantes de q5](https://github.com/q5js/q5.js/wiki/q5-Beginner's-Brief).
9
- *
10
- * En estas páginas de "Aprender" puedes experimentar editando los mini ejemplos. ¡Diviértete! 😎
11
- *
12
- * [![](/assets/Authored-By-Humans-Not-By-AI-Badge.png)](https://notbyai.fyi/)
13
- */
14
-
15
- /** ⭐
16
- * Crea un elemento de lienzo, una sección de la pantalla donde tu programa
17
- * puede dibujar.
18
- *
19
- * ¡Ejecuta esta función para empezar a usar q5!
20
- *
21
- * Ten en cuenta que en este ejemplo, el círculo se encuentra en la posición [0, 0], el origen del lienzo.
22
- * @param {number} [ancho] ancho del lienzo en píxeles
23
- * @param {number} [alto] alto del lienzo en píxeles
24
- * @param {object} [opciones] opciones para el contexto 2d
25
- * @return {Promise<HTMLCanvasElement>} una promesa que se resuelve con el elemento canvas creado
26
- * @example
27
- * // WebGPU
28
- * await Lienzo(200, 100);
29
- * fondo('silver');
30
- * círculo(0, 0, 80);
31
- */
32
- function Lienzo(ancho?: number, alto?: number, opciones?: object): Promise<HTMLCanvasElement>;
33
-
34
- /** ⭐
35
- * Función a declarar. Se ejecutará 60 veces por segundo de forma predeterminada. Tiene comportamiento de bucle, lo que permite hacer animaciones cuadro a cuadro.
36
- * @example
37
- * q5.dibujar = function () {
38
- * fondo('silver');
39
- * círculo(ratónX, ratónY, 80);
40
- * };
41
- */
42
- function dibujar(): void;
43
-
44
- /** ⭐
45
- * Imprime un mensaje en la consola de JavaScript. Atajo para `console.log()`.
46
- *
47
- * Para acceder a las herramientas del navegador (DevTools) generalmente es con click derecho + "inspeccionar", o presionando las teclas `ctrl + shift + i` o `command + option + i`. La consola se encuentra en la pestaña "console".
48
- * @param {any} mensaje a imprimir
49
- * @example
50
- * q5.dibujar = function () {
51
- * círculo(ratónX, ratónY, 80);
52
- * log('El ratón está en:', ratónX, ratónY);
53
- * };
54
- */
55
- function log(mensaje: any): void;
56
-
57
- // 🧑‍🎨 formas
58
-
59
- /** 🧑‍🎨
60
- * Dibuja un círculo en la posición (x, y) con el diámetro especificado.
61
- * @param {number} x posición x del centro del círculo
62
- * @param {number} y posición y del centro del círculo
63
- * @param {number} diámetro del círculo
64
- * @example
65
- * await Lienzo(200, 100);
66
- * círculo(0, 0, 80);
67
- */
68
- function círculo(x: number, y: number, diámetro: number): void;
69
-
70
- /** 🧑‍🎨
71
- * Dibuja una elipse.
72
- * @param {number} x posición x
73
- * @param {number} y posición y
74
- * @param {number} ancho ancho de la elipse
75
- * @param {number} [alto] alto de la elipse
76
- * @example
77
- * await Lienzo(200, 100);
78
- * elipse(0, 0, 160, 80);
79
- */
80
- function elipse(x: number, y: number, ancho: number, alto?: number): void;
81
-
82
- /** 🧑‍🎨
83
- * Dibuja un rectángulo o un rectángulo redondeado.
84
- * @param {number} x posición x
85
- * @param {number} y posición y
86
- * @param {number} w ancho del rectángulo
87
- * @param {number} [h] alto del rectángulo
88
- * @param {number} [redondeado] radio para todas las esquinas
89
- * @example
90
- * await Lienzo(200);
91
- * fondo(0.8);
92
- *
93
- * rect(-70, -80, 40, 60);
94
- * rect(-20, -30, 40, 60, 10);
95
- * rect(30, 20, 40, 60, 30);
96
- */
97
- function rect(x: number, y: number, ancho: number, alto?: number, redondeado?: number): void;
98
-
99
- /** 🧑‍🎨
100
- * Dibuja un cuadrado o un cuadrado redondeado.
101
- * @param {number} x posición x
102
- * @param {number} y posición y
103
- * @param {number} tamaño tamaño de los lados del cuadrado
104
- * @param {number} [redondeado] radio para todas las esquinas
105
- * @example
106
- * await Lienzo(200);
107
- * fondo(0.8);
108
- *
109
- * cuadrado(-70, -70, 40);
110
- * cuadrado(-20, -20, 40, 10);
111
- * cuadrado(30, 30, 40, 30);
112
- */
113
- function cuadrado(x: number, y: number, tamaño: number, redondeado?: number): void;
114
-
115
- /** 🧑‍🎨
116
- * Dibuja un punto en el lienzo.
117
- * @param {number} x posición x
118
- * @param {number} y posición y
119
- * @example
120
- * await Lienzo(200, 100);
121
- * trazo('white');
122
- * punto(-25, 0);
123
- *
124
- * grosorTrazo(10);
125
- * punto(25, 0);
126
- */
127
- function punto(x: number, y: number): void;
128
-
129
- /** 🧑‍🎨
130
- * Dibuja una línea en el lienzo.
131
- * @param {number} x1 posición x del primer punto
132
- * @param {number} y1 posición y del primer punto
133
- * @param {number} x2 posición x del segundo punto
134
- * @param {number} y2 posición y del segundo punto
135
- * @example
136
- * await Lienzo(200, 100);
137
- * trazo('lime');
138
- * línea(-80, -30, 80, 30);
139
- */
140
- function línea(x1: number, y1: number, x2: number, y2: number): void;
141
-
142
- /** 🧑‍🎨
143
- * Dibuja una cápsula.
144
- * @param {number} x1 posición x del primer punto
145
- * @param {number} y1 posición y del primer punto
146
- * @param {number} x2 posición x del segundo punto
147
- * @param {number} y2 posición y del segundo punto
148
- * @param {number} r radio de los extremos semicirculares de la cápsula
149
- * @example
150
- * await Lienzo(200, 100);
151
- * fondo(0.8);
152
- * grosorTrazo(5);
153
- * cápsula(-60, -10, 60, 10, 10);
154
- * @example
155
- * q5.dibujar = function () {
156
- * fondo(0.8);
157
- * relleno('cyan');
158
- * grosorTrazo(10);
159
- * cápsula(0, 0, ratónX, ratónY, 20);
160
- * };
161
- */
162
- function cápsula(x1: number, y1: number, x2: number, y2: number, r: number): void;
163
-
164
- /** 🧑‍🎨
165
- * Establecer a `ESQUINA` (por defecto), `CENTRO`, `RADIO`, o `ESQUINAS`.
166
- *
167
- * Cambia cómo se interpretan las primeras cuatro entradas para
168
- * `rect` y `cuadrado`.
169
- * @param {string} modo
170
- * @example
171
- * await Lienzo(200, 100);
172
- * fondo(0.8);
173
- * modoRect(ESQUINA);
174
- *
175
- * // ( x, y, w, h)
176
- * rect(-50, -25, 100, 50);
177
- * @example
178
- * await Lienzo(200, 100);
179
- * fondo(0.8);
180
- * modoRect(CENTRO);
181
- *
182
- * // ( cX, cY, w, h)
183
- * rect(0, 0, 100, 50);
184
- * @example
185
- * await Lienzo(200, 100);
186
- * fondo(0.8);
187
- * modoRect(RADIO);
188
- *
189
- * // ( cX, cY, rX, rY)
190
- * rect(0, 0, 50, 25);
191
- * @example
192
- * await Lienzo(200, 100);
193
- * fondo(0.8);
194
- * modoRect(ESQUINAS);
195
- *
196
- * // ( x1, y1, x2, y2)
197
- * rect(-50, -25, 50, 25);
198
- */
199
- function modoRect(modo: string): void;
200
-
201
- /** 🧑‍🎨
202
- * Establecer a `CENTRO` (por defecto), `RADIO`, `ESQUINA`, o `ESQUINAS`.
203
- *
204
- * Cambia cómo se interpretan las primeras cuatro entradas para
205
- * `elipse`, `círculo`, y `arco`.
206
- * @param {string} modo
207
- * @example
208
- * await Lienzo(200, 100);
209
- * fondo(0.8);
210
- * modoEliptico(CENTRO);
211
- *
212
- * // ( x, y, w, h)
213
- * elipse(0, 0, 100, 50);
214
- * @example
215
- * await Lienzo(200, 100);
216
- * fondo(0.8);
217
- * modoEliptico(RADIO);
218
- *
219
- * // ( x, y, rX, rY)
220
- * elipse(0, 0, 50, 25);
221
- * @example
222
- * await Lienzo(200, 100);
223
- * fondo(0.8);
224
- * modoEliptico(ESQUINA);
225
- *
226
- * // (lX, tY, w, h)
227
- * elipse(-50, -25, 100, 50);
228
- * @example
229
- * await Lienzo(200, 100);
230
- * fondo(0.8);
231
- * modoEliptico(ESQUINAS);
232
- *
233
- * // ( x1, y1, x2, y2)
234
- * elipse(-50, -25, 50, 25);
235
- */
236
- function modoEliptico(modo: string): void;
237
-
238
- /** 🧑‍🎨
239
- * Modo de alineación de forma, para usar en `modoRect` y `modoEliptico`.
240
- */
241
- const ESQUINA: 'corner';
242
-
243
- /** 🧑‍🎨
244
- * Modo de alineación de forma, para usar en `modoRect` y `modoEliptico`.
245
- */
246
- const RADIO: 'radius';
247
-
248
- /** 🧑‍🎨
249
- * Modo de alineación de forma, para usar en `modoRect` y `modoEliptico`.
250
- */
251
- const ESQUINAS: 'corners';
252
-
253
- // 🌆 imagen
254
-
255
- /** 🌆
256
- * Carga una imagen desde una URL.
257
- *
258
- * Por defecto, los recursos se cargan en paralelo antes de que q5 ejecute `dibujar`. Usa `await` para esperar a que una imagen se cargue.
259
- * @param {string} url url de la imagen a cargar
260
- * @returns {Q5.Image & PromiseLike<Q5.Image>} imagen
261
- * @example
262
- * await Lienzo(200);
263
- *
264
- * let logo = cargarImagen('/q5js_logo.avif');
265
- *
266
- * q5.dibujar = function () {
267
- * fondo(logo);
268
- * };
269
- * @example
270
- * await Lienzo(200);
271
- *
272
- * let logo = await cargarImagen('/q5js_logo.avif');
273
- * fondo(logo);
274
- */
275
- function cargarImagen(url: string): Q5.Imagen & PromiseLike<Q5.Imagen>;
276
-
277
- /** 🌆
278
- * Dibuja una imagen o fotograma de video en el lienzo.
279
- * @param {Q5.Image | HTMLVideoElement} img imagen o video a dibujar
280
- * @param {number} dx posición x donde dibujar la imagen
281
- * @param {number} dy posición y donde dibujar la imagen
282
- * @param {number} [dw] ancho de la imagen de destino
283
- * @param {number} [dh] alto de la imagen de destino
284
- * @param {number} [sx] posición x en la fuente para empezar a recortar una subsección
285
- * @param {number} [sy] posición y en la fuente para empezar a recortar una subsección
286
- * @param {number} [sw] ancho de la subsección de la imagen fuente
287
- * @param {number} [sh] alto de la subsección de la imagen fuente
288
- * @example
289
- * await Lienzo(200);
290
- *
291
- * let logo = cargarImagen('/q5js_logo.avif');
292
- *
293
- * q5.dibujar = function () {
294
- * imagen(logo, -100, -100, 200, 200);
295
- * };
296
- * @example
297
- * await Lienzo(200);
298
- *
299
- * let logo = cargarImagen('/q5js_logo.avif');
300
- *
301
- * q5.dibujar = function () {
302
- * imagen(logo, -100, -100, 200, 200, 256, 256, 512, 512);
303
- * };
304
- */
305
- function imagen(): void;
306
-
307
- /** 🌆
308
- * Establecer a `CORNER` (por defecto), `CORNERS`, o `CENTER`.
309
- *
310
- * Cambia cómo se interpretan las entradas a `imagen`.
311
- * @param {string} modo
312
- * @example
313
- * await Lienzo(200);
314
- * let logo = cargarImagen('/q5js_logo.avif');
315
- *
316
- * q5.dibujar = function () {
317
- * modoImagen(CORNER);
318
- *
319
- * // ( img, x, y, w, h)
320
- * imagen(logo, -50, -50, 100, 100);
321
- * };
322
- * @example
323
- * await Lienzo(200);
324
- * let logo = cargarImagen('/q5js_logo.avif');
325
- *
326
- * q5.dibujar = function () {
327
- * modoImagen(CENTER);
328
- *
329
- * // ( img, cX, cY, w, h)
330
- * imagen(logo, 0, 0, 100, 100);
331
- * };
332
- * @example
333
- * await Lienzo(200);
334
- * let logo = cargarImagen('/q5js_logo.avif');
335
- *
336
- * q5.dibujar = function () {
337
- * modoImagen(CORNERS);
338
- *
339
- * // ( img, x1, y1, x2, y2)
340
- * imagen(logo, -50, -50, 50, 50);
341
- * };
342
- */
343
- function modoImagen(modo: string): void;
344
-
345
- /** 🌆
346
- * Establece la escala de imagen por defecto, que se aplica a las imágenes cuando
347
- * se dibujan sin un ancho o alto especificado.
348
- *
349
- * Por defecto es 0.5 para que las imágenes aparezcan en su tamaño real
350
- * cuando la densidad de píxeles es 2. Las imágenes se dibujarán a un tamaño
351
- * por defecto consistente relativo al lienzo independientemente de la densidad de píxeles.
352
- *
353
- * Esta función debe llamarse antes de que se carguen las imágenes para
354
- * tener efecto.
355
- * @param {number} escala
356
- * @returns {number} escala de imagen por defecto
357
- */
358
- function escalaImagenPorDefecto(escala: number): number;
359
-
360
- /** 🌆
361
- * Redimensiona la imagen.
362
- * @param {number} w nuevo ancho
363
- * @param {number} h nuevo alto
364
- * @example
365
- * await Lienzo(200);
366
- *
367
- * let logo = await cargar('/q5js_logo.avif');
368
- *
369
- * logo.redimensionar(128, 128);
370
- * imagen(logo, -100, -100, 200, 200);
371
- */
372
- function redimensionar(w: number, h: number): void;
373
-
374
- /** 🌆
375
- * Devuelve una imagen recortada, eliminando los píxeles transparentes de los bordes.
376
- * @returns {Q5.Image}
377
- */
378
- function recortar(): Q5.Imagen;
379
-
380
- /** 🌆
381
- * Habilita el renderizado suave de imágenes mostradas más grandes que
382
- * su tamaño real. Esta es la configuración por defecto, así que ejecutar esta
383
- * función solo tiene efecto si se ha llamado a `noSuavizar`.
384
- * @example
385
- * await Lienzo(200);
386
- * let icono = await cargar('/q5js_icon.png');
387
- * imagen(icono, -100, -100, 200, 200);
388
- */
389
- function suavizar(): void;
390
-
391
- /** 🌆
392
- * Deshabilita el renderizado suave de imágenes para un aspecto pixelado.
393
- * @example
394
- * await Lienzo(200);
395
- *
396
- * let icono = await cargar('/q5js_icon.png');
397
- *
398
- * noSuavizar();
399
- * imagen(icono, -100, -100, 200, 200);
400
- */
401
- function noSuavizar(): void;
402
-
403
- /** 🌆
404
- * Aplica un tinte (superposición de color) al dibujo.
405
- *
406
- * El valor alfa del color de tinte determina la
407
- * fuerza del tinte. Para cambiar la opacidad de una imagen,
408
- * usa la función `opacidad`.
409
- *
410
- * El teñido afecta a todas las imágenes dibujadas posteriormente. El color de tinte
411
- * se aplica a las imágenes usando el modo de mezcla "multiply".
412
- *
413
- * Dado que el proceso de teñido es intensivo en rendimiento, cada vez
414
- * que se tiñe una imagen, q5 almacena en caché el resultado. `imagen` dibujará la
415
- * imagen teñida en caché a menos que el color de tinte haya cambiado o la
416
- * imagen que se está tiñendo haya sido editada.
417
- *
418
- * Si necesitas dibujar una imagen múltiples veces cada fotograma con
419
- * diferentes tintes, considera hacer copias de la imagen y teñir
420
- * cada copia por separado.
421
- * @param {string | number} color color de tinte
422
- * @example
423
- * await Lienzo(200);
424
- *
425
- * let logo = await cargar('/q5js_logo.avif');
426
- *
427
- * teñir(1, 0, 0, 0.5);
428
- * imagen(logo, -100, -100, 200, 200);
429
- */
430
- function teñir(color: string | number): void;
431
-
432
- /** 🌆
433
- * Las imágenes dibujadas después de ejecutar esta función no serán teñidas.
434
- */
435
- function noTeñir(): void;
436
-
437
- /** 🌆
438
- * Enmascara la imagen con otra imagen.
439
- * @param {Q5.Image} img imagen a usar como máscara
440
- */
441
- function enmascarar(img: Q5.Imagen): void;
442
-
443
- /** 🌆
444
- * Devuelve una copia de la imagen.
445
- * @returns {Q5.Image}
446
- */
447
- function copiar(): Q5.Imagen;
448
-
449
- /** 🌆
450
- * Muestra una región de la imagen en otra región de la imagen.
451
- * Se puede usar para crear un detalle insertado, también conocido como efecto de lupa.
452
- * @param {number} sx coordenada x de la región fuente
453
- * @param {number} sy coordenada y de la región fuente
454
- * @param {number} sw ancho de la región fuente
455
- * @param {number} sh alto de la región fuente
456
- * @param {number} dx coordenada x de la región destino
457
- * @param {number} dy coordenada y de la región destino
458
- * @param {number} dw ancho de la región destino
459
- * @param {number} dh alto de la región destino
460
- * @example
461
- * await Lienzo(200);
462
- *
463
- * let logo = await cargar('/q5js_logo.avif');
464
- *
465
- * logo.insertado(256, 256, 512, 512, 0, 0, 256, 256);
466
- * imagen(logo, -100, -100, 200, 200);
467
- */
468
- function insertado(sx: number, sy: number, sw: number, sh: number, dx: number, dy: number, dw: number, dh: number): void;
469
-
470
- /** 🌆
471
- * Recupera una subsección de una imagen o lienzo como una nueva Imagen Q5
472
- * o el color de un píxel en la imagen o lienzo.
473
- *
474
- * Si solo se especifican x e y, esta función devuelve el color del píxel
475
- * en la coordenada dada en formato de array `[R, G, B, A]`. Si `cargarPíxeles`
476
- * nunca se ha ejecutado, es ejecutado por esta función.
477
- *
478
- * Si haces cambios en el lienzo o imagen, debes llamar a `cargarPíxeles`
479
- * antes de usar esta función para obtener los datos de color actuales.
480
- *
481
- * No aplicable a lienzos WebGPU.
482
- * @param {number} x
483
- * @param {number} y
484
- * @param {number} [w] ancho del área, por defecto es 1
485
- * @param {number} [h] alto del área, por defecto es 1
486
- * @returns {Q5.Image | number[]}
487
- * @example
488
- * await Lienzo(200);
489
- *
490
- * let logo = await cargar('/q5js_logo.avif');
491
- *
492
- * let recortada = logo.obtener(256, 256, 512, 512);
493
- * imagen(recortada, -100, -100, 200, 200);
494
- */
495
- function obtener(x: number, y: number, w?: number, h?: number): Q5.Imagen | number[];
496
-
497
- /** 🌆
498
- * Establece el color de un píxel en la imagen o lienzo. El modo de color debe ser RGB.
499
- *
500
- * O si se proporciona un lienzo o imagen, se dibuja encima de la
501
- * imagen o lienzo de destino, ignorando su configuración de tinte.
502
- *
503
- * Ejecuta `actualizarPíxeles` para aplicar los cambios.
504
- *
505
- * No aplicable a lienzos WebGPU.
506
- * @param {number} x
507
- * @param {number} y
508
- * @param {any} val color, lienzo, o imagen
509
- * @example
510
- * await Lienzo(200);
511
- *
512
- * let c = color('lime');
513
- * let img = crearImagen(50, 50);
514
- *
515
- * q5.dibujar = function () {
516
- * img.establecer(aleatorio(50), aleatorio(50), c);
517
- * img.actualizarPíxeles();
518
- *
519
- * fondo(img);
520
- * };
521
- */
522
- function establecer(x: number, y: number, val: any): void;
523
-
524
- /** 🌆
525
- * Array de datos de color de píxeles de un lienzo o imagen.
526
- *
527
- * Vacío por defecto, obtener el dato ejecutando `cargarPíxeles`.
528
- *
529
- * Cada píxel está representado por cuatro valores consecutivos en el array,
530
- * correspondientes a sus canales rojo, verde, azul y alfa.
531
- *
532
- * Los datos del píxel superior izquierdo están al principio del array
533
- * y los datos del píxel inferior derecho están al final, yendo de
534
- * izquierda a derecha y de arriba a abajo.
535
- */
536
- var píxeles: number[];
537
-
538
- /** 🌆
539
- * Carga datos de píxeles en `píxeles` desde el lienzo o imagen.
540
- *
541
- * El ejemplo a continuación establece el canal verde de algunos píxeles
542
- * a un valor aleatorio.
543
- *
544
- * No aplicable a lienzos WebGPU.
545
- * @example
546
- * frecuenciaRefresco(5);
547
- * let icono = cargarImagen('/q5js_icon.png');
548
- *
549
- * q5.dibujar = function () {
550
- * icono.cargarPíxeles();
551
- * for (let i = 0; i < icono.píxeles.length; i += 16) {
552
- * icono.píxeles[i + 1] = aleatorio(1);
553
- * }
554
- * icono.actualizarPíxeles();
555
- * fondo(icono);
556
- * };
557
- */
558
- function cargarPíxeles(): void;
559
-
560
- /** 🌆
561
- * Aplica cambios en el array `píxeles` al lienzo o imagen.
562
- *
563
- * No aplicable a lienzos WebGPU.
564
- * @example
565
- * await Lienzo(200);
566
- * let c = color('pink');
567
- *
568
- * let img = crearImagen(50, 50);
569
- * for (let x = 0; x < 50; x += 3) {
570
- * for (let y = 0; y < 50; y += 3) {
571
- * img.establecer(x, y, c);
572
- * }
573
- * }
574
- * img.actualizarPíxeles();
575
- *
576
- * fondo(img);
577
- */
578
- function actualizarPíxeles(): void;
579
-
580
- /** 🌆
581
- * Aplica un filtro a la imagen.
582
- *
583
- * Mira la documentación de las constantes de filtro de q5 a continuación para más información.
584
- *
585
- * También se puede usar una cadena de filtro CSS.
586
- * https://developer.mozilla.org/docs/Web/CSS/filter
587
- *
588
- * No aplicable a lienzos WebGPU.
589
- * @param {string} tipo tipo de filtro o una cadena de filtro CSS
590
- * @param {number} [valor] valor opcional, depende del tipo de filtro
591
- * @example
592
- * await Lienzo(200);
593
- * let logo = await cargar('/q5js_logo.avif');
594
- * logo.filtro(INVERTIR);
595
- * imagen(logo, -100, -100, 200, 200);
596
- */
597
- function filtro(tipo: string, valor?: number): void;
598
-
599
- /** 🌆
600
- * Convierte la imagen a píxeles blancos y negros dependiendo si están por encima o por debajo de cierto umbral.
601
- */
602
- const UMBRAL: 1;
603
-
604
- /** 🌆
605
- * Convierte la imagen a escala de grises estableciendo cada píxel a su luminancia.
606
- */
607
- const GRIS: 2;
608
-
609
- /** 🌆
610
- * Establece el canal alfa a totalmente opaco.
611
- */
612
- const OPACO: 3;
613
-
614
- /** 🌆
615
- * Invierte el color de cada píxel.
616
- */
617
- const INVERTIR: 4;
618
-
619
- /** 🌆
620
- * Limita cada canal de la imagen al número de colores especificado como argumento.
621
- */
622
- const POSTERIZAR: 5;
623
-
624
- /** 🌆
625
- * Aumenta el tamaño de las áreas brillantes.
626
- */
627
- const DILATAR: 6;
628
-
629
- /** 🌆
630
- * Aumenta el tamaño de las áreas oscuras.
631
- */
632
- const EROSIONAR: 7;
633
-
634
- /** 🌆
635
- * Aplica un desenfoque gaussiano a la imagen.
636
- */
637
- const DESENFOCAR: 8;
638
-
639
- /** 🌆
640
- * Crea una nueva imagen.
641
- * @param {number} w ancho
642
- * @param {number} h alto
643
- * @param {any} [opt] configuraciones opcionales para la imagen
644
- * @returns {Q5.Image}
645
- */
646
- function crearImagen(w: number, h: number, opt?: any): Q5.Imagen;
647
-
648
- /** 🌆
649
- * Crea un búfer de gráficos.
650
- *
651
- * Deshabilitado por defecto en q5 WebGPU.
652
- * Mira el issue [#104](https://github.com/q5js/q5.js/issues/104) para detalles.
653
- * @param {number} w ancho
654
- * @param {number} h alto
655
- * @param {object} [opt] opciones
656
- * @returns {Q5} un nuevo búfer de gráficos Q5
657
- */
658
- function crearGráficos(w: number, h: number, opt?: any): Q5;
659
-
660
- // 📘 texto
661
-
662
- /** 📘
663
- * Renderiza texto en el lienzo.
664
- *
665
- * El texto se puede posicionar con los parámetros x e y
666
- * y opcionalmente se puede restringir.
667
- * @param {string} str cadena de texto a mostrar
668
- * @param {number} x coordenada-x de la posición del texto
669
- * @param {number} y coordenada-y de la posición del texto
670
- * @param {number} [anchoEnvoltura] ancho máximo de línea en caracteres
671
- * @param {number} [limiteLineas] número máximo de líneas
672
- * @example
673
- * await Lienzo(200, 100);
674
- * fondo('silver');
675
- *
676
- * tamañoTexto(32);
677
- * texto('Hello, world!', -88, 10);
678
- * @example
679
- * await Lienzo(200);
680
- * fondo(0.8);
681
- * tamañoTexto(20);
682
- *
683
- * let info =
684
- * 'q5.js was designed to make creative coding fun and accessible for a new generation of artists, designers, educators, and beginners.';
685
- *
686
- * texto(info, -88, -70, 20, 6);
687
- * //
688
- * //
689
- */
690
- function texto(str: string, x: number, y: number, anchoEnvoltura?: number, limiteLineas?: number): void;
691
-
692
- /** 📘
693
- * Carga una fuente desde una URL.
694
- *
695
- * El archivo de fuente puede estar en cualquier formato aceptado en CSS, como
696
- * archivos .ttf y .otf. El primer ejemplo a continuación carga
697
- * [Robotica](https://www.dafont.com/robotica-courtney.font).
698
- *
699
- * También soporta cargar [fuentes de Google](https://fonts.google.com/).
700
- * El segundo ejemplo carga
701
- * [Pacifico](https://fonts.google.com/specimen/Pacifico).
702
- *
703
- * Si no se cargan fuentes, se usa la fuente sans-serif por defecto.
704
- *
705
- * Por defecto, los recursos se cargan en paralelo antes de que q5 ejecute `dibujar`. Usa `await` para esperar a que una fuente se cargue.
706
- *
707
- * En q5 WebGPU, las fuentes en [formato MSDF](https://github.com/q5js/q5.js/wiki/q5-WebGPU-renderer#text-rendering)
708
- * con el archivo terminando en "-msdf.json" se pueden usar para renderizado de texto de alto rendimiento. Haz la tuya usando el [convertidor de fuentes MSDF](https://msdf-bmfont.donmccurdy.com/).
709
- * @param {string} url URL de la fuente a cargar
710
- * @returns {FontFace & PromiseLike<FontFace>} fuente
711
- * @example
712
- * await Lienzo(200, 56);
713
- *
714
- * await cargarFuente('/assets/Robotica.ttf');
715
- *
716
- * relleno('skyblue');
717
- * tamañoTexto(64);
718
- * imagenTexto('Hello!', -98, 24);
719
- * @example
720
- * await Lienzo(200, 74);
721
- *
722
- * cargarFuente('fonts.googleapis.com/css2?family=Pacifico');
723
- *
724
- * q5.dibujar = function () {
725
- * relleno('hotpink');
726
- * tamañoTexto(68);
727
- * imagenTexto('Hello!', -98, 31);
728
- * };
729
- * @example
730
- * await Lienzo(200, 74);
731
- *
732
- * await cargarFuente('sans-serif'); // msdf
733
- *
734
- * relleno('white');
735
- * tamañoTexto(68);
736
- * imagenTexto('Hello!', -98, 31);
737
- */
738
- function cargarFuente(url: string): FontFace & PromiseLike<FontFace>;
739
-
740
- /** 📘
741
- * Establece la fuente actual a usar para renderizar texto.
742
- *
743
- * Por defecto, la fuente se establece a la [familia de fuentes CSS](https://developer.mozilla.org/docs/Web/CSS/font-family)
744
- * "sans-serif" o la última fuente cargada.
745
- * @param {string} nombreFuente nombre de la familia de fuentes o un objeto FontFace
746
- * @example
747
- * await Lienzo(200, 160);
748
- * fondo(0.8);
749
- *
750
- * fuenteTexto('serif');
751
- *
752
- * q5.dibujar = function () {
753
- * tamañoTexto(32);
754
- * texto('Hello, world!', -96, 10);
755
- * };
756
- * @example
757
- * await Lienzo(200);
758
- * fondo(0.8);
759
- *
760
- * fuenteTexto('monospace');
761
- *
762
- * q5.dibujar = function () {
763
- * texto('Hello, world!', -68, 10);
764
- * };
765
- */
766
- function fuenteTexto(nombreFuente: string): void;
767
-
768
- /** 📘
769
- * Establece u obtiene el tamaño de fuente actual. Si no se proporciona argumento, devuelve el tamaño de fuente actual.
770
- * @param {number} [tamaño] tamaño de la fuente en píxeles
771
- * @returns {number | void} tamaño de fuente actual cuando no se proporciona argumento
772
- * @example
773
- * q5.dibujar = function () {
774
- * fondo(0.8);
775
- *
776
- * tamañoTexto(abs(ratónX));
777
- * texto('A', -90, 90);
778
- * };
779
- */
780
- function tamañoTexto(tamaño?: number): number | void;
781
-
782
- /** 📘
783
- * Establece u obtiene la altura de línea actual. Si no se proporciona argumento, devuelve la altura de línea actual.
784
- * @param {number} [interlineado] altura de línea en píxeles
785
- * @returns {number | void} altura de línea actual cuando no se proporciona argumento
786
- * @example
787
- * q5.dibujar = function () {
788
- * fondo(0.8);
789
- *
790
- * tamañoTexto(abs(ratónX));
791
- * texto('A', -90, 90);
792
- * rect(-90, 90, 5, -interlineado());
793
- * };
794
- */
795
- function interlineado(interlineado?: number): number | void;
796
-
797
- /** 📘
798
- * Establece el estilo de texto actual.
799
- *
800
- * No aplicable a WebGPU cuando se usan fuentes MSDF.
801
- * @param {'normal' | 'italic' | 'bold' | 'bolditalic'} estilo estilo de fuente
802
- * @example
803
- * await Lienzo(200);
804
- * fondo(0.8);
805
- *
806
- * estiloTexto(CURSIVA);
807
- *
808
- * tamañoTexto(32);
809
- * texto('Hello, world!', -88, 6);
810
- */
811
- function estiloTexto(estilo: 'normal' | 'italic' | 'bold' | 'bolditalic'): void;
812
-
813
- /** 📘
814
- * Establece la alineación horizontal y vertical del texto.
815
- * @param {'left' | 'center' | 'right'} horiz alineación horizontal
816
- * @param {'top' | 'middle' | 'bottom' | 'alphabetic'} [vert] alineación vertical
817
- * @example
818
- * await Lienzo(200);
819
- * fondo(0.8);
820
- * tamañoTexto(32);
821
- *
822
- * alineaciónTexto(CENTRO, MEDIO);
823
- * texto('Hello, world!', 0, 0);
824
- */
825
- function alineaciónTexto(horiz: 'left' | 'center' | 'right', vert?: 'top' | 'middle' | 'bottom' | 'alphabetic'): void;
826
-
827
- /** 📘
828
- * Establece el peso del texto.
829
- *
830
- * - 100: delgado
831
- * - 200: extra-ligero
832
- * - 300: ligero
833
- * - 400: normal/regular
834
- * - 500: medio
835
- * - 600: semi-negrita
836
- * - 700: negrita
837
- * - 800: más negrita/extra-negrita
838
- * - 900: negro/pesado
839
- * @param {number | string} peso peso de la fuente
840
- * @example
841
- * await Lienzo(200);
842
- * fondo(0.8);
843
- * tamañoTexto(32);
844
- * alineaciónTexto(CENTRO, MEDIO);
845
- *
846
- * pesoTexto(100);
847
- * texto('Hello, world!', 0, 0);
848
- */
849
- function pesoTexto(peso: number | string): void;
850
-
851
- /** 📘
852
- * Calcula y devuelve el ancho de una cadena de texto dada.
853
- * @param {string} str cadena a medir
854
- * @returns {number} ancho del texto en píxeles
855
- * @example
856
- * q5.dibujar = function () {
857
- * fondo(0.8);
858
- *
859
- * tamañoTexto(abs(ratónX));
860
- * rect(-90, 90, anchoTexto('A'), -interlineado());
861
- * texto('A', -90, 90);
862
- * };
863
- */
864
- function anchoTexto(str: string): number;
865
-
866
- /** 📘
867
- * Calcula y devuelve el ascenso (la distancia desde la línea base hasta la parte superior del carácter más alto) de la fuente actual.
868
- * @param {string} str cadena a medir
869
- * @returns {number} ascenso del texto en píxeles
870
- * @example
871
- * q5.dibujar = function () {
872
- * fondo(0.8);
873
- *
874
- * tamañoTexto(abs(ratónX));
875
- * rect(-90, 90, anchoTexto('A'), -ascensoTexto());
876
- * texto('A', -90, 90);
877
- * };
878
- */
879
- function ascensoTexto(str: string): number;
880
-
881
- /** 📘
882
- * Calcula y devuelve el descenso (la distancia desde la línea base hasta la parte inferior del carácter más bajo) de la fuente actual.
883
- * @param {string} str cadena a medir
884
- * @returns {number} descenso del texto en píxeles
885
- * @example
886
- * await Lienzo(200);
887
- * fondo(0.8);
888
- * tamañoTexto(64);
889
- *
890
- * rect(-100, 0, 200, descensoTexto('q5'));
891
- * texto('q5', -90, 0);
892
- */
893
- function descensoTexto(str: string): number;
894
-
895
- /** 📘
896
- * Crea una imagen a partir de una cadena de texto.
897
- * @param {string} str cadena de texto
898
- * @param {number} [anchoEnvoltura] ancho máximo de línea en caracteres
899
- * @param {number} [limiteLineas] número máximo de líneas
900
- * @returns {Q5.Image} un objeto de imagen representando el texto renderizado
901
- * @example
902
- * await Lienzo(200);
903
- * tamañoTexto(96);
904
- *
905
- * let img = crearImagenTexto('🐶');
906
- * img.filtro(INVERTIR);
907
- *
908
- * q5.dibujar = function () {
909
- * imagen(img, -45, -90);
910
- * };
911
- */
912
- function crearImagenTexto(str: string, anchoEnvoltura: number, limiteLineas: number): Q5.Imagen;
913
-
914
- /** 📘
915
- * Renderiza una imagen generada a partir de texto en el lienzo.
916
- *
917
- * Si el primer parámetro es una cadena, se creará y almacenará en caché automáticamente
918
- * una imagen del texto.
919
- *
920
- * El posicionamiento de la imagen se ve afectado por la configuración actual de
921
- * alineación de texto y línea base.
922
- *
923
- * En q5 WebGPU, esta función es la única forma de dibujar texto multicolor,
924
- * como emojis, y de usar fuentes que no están en formato MSDF.
925
- * Usar esta función para dibujar texto que cambia cada fotograma tiene
926
- * un costo de rendimiento muy alto.
927
- * @param {Q5.Image | string} img imagen o texto
928
- * @param {number} x coordenada-x donde se debe colocar la imagen
929
- * @param {number} y coordenada-y donde se debe colocar la imagen
930
- * @example
931
- * await Lienzo(200);
932
- * fondo(0.8);
933
- * tamañoTexto(96);
934
- * alineaciónTexto(CENTRO, CENTRO);
935
- *
936
- * imagenTexto('🐶', 0, 0);
937
- * @example
938
- * await Lienzo(200);
939
- *
940
- * await cargar('/assets/Robotica.ttf');
941
- *
942
- * fondo(0.8);
943
- * tamañoTexto(66);
944
- * imagenTexto('Hello!', -100, 100);
945
- */
946
- function imagenTexto(img: Q5.Imagen | String, x: number, y: number): void;
947
-
948
- /** 📘
949
- * Formateador de números, se puede usar para mostrar un número como una cadena con
950
- * un número especificado de dígitos antes y después del punto decimal,
951
- * opcionalmente añadiendo relleno con ceros.
952
- * @param {number} n número a formatear
953
- * @param {number} l número mínimo de dígitos que aparecen antes del punto decimal; el número se rellena con ceros si es necesario
954
- * @param {number} r número de dígitos que aparecen después del punto decimal
955
- * @returns {string} una representación de cadena del número, formateada en consecuencia
956
- * @example
957
- * await Lienzo(200, 100);
958
- * fondo(0.8);
959
- *
960
- * tamañoTexto(32);
961
- * texto(nf(PI, 4, 5), -90, 10);
962
- */
963
- function nf(num: number, digitos: number): string;
964
-
965
- /** 📘
966
- * Estilo de fuente normal.
967
- */
968
- const NORMAL: 'normal';
969
-
970
- /** 📘
971
- * Estilo de fuente cursiva.
972
- */
973
- const CURSIVA: 'italic';
974
-
975
- /** 📘
976
- * Peso de fuente negrita.
977
- */
978
- const NEGRILLA: 'bold';
979
-
980
- /** 📘
981
- * Estilo de fuente negrita y cursiva.
982
- */
983
- const NEGRILLA_CURSIVA: 'italic bold';
984
-
985
- /** 📘
986
- * Alinear texto a la izquierda.
987
- */
988
- const IZQUIERDA: 'left';
989
-
990
- /** 📘
991
- * Alinear texto al centro.
992
- */
993
- const CENTRO: 'center';
994
-
995
- /** 📘
996
- * Alinear texto a la derecha.
997
- */
998
- const DERECHA: 'right';
999
-
1000
- /** 📘
1001
- * Alinear texto arriba.
1002
- */
1003
- const ARRIBA: 'top';
1004
-
1005
- /** 📘
1006
- * Alinear texto abajo.
1007
- */
1008
- const ABAJO: 'bottom';
1009
-
1010
- /** 📘
1011
- * Alinear texto a la línea base (alfabética).
1012
- */
1013
- const LINEA_BASE: 'alphabetic';
1014
-
1015
- // 🖲 entrada
1016
-
1017
- /**
1018
- * El manejo de entrada de q5 es muy básico.
1019
- *
1020
- * Para un mejor manejo de entrada, incluyendo soporte para controladores de juegos, considera usar el addon [p5play](https://p5play.org/) con q5.
1021
- *
1022
- * Ten en cuenta que las respuestas de entrada dentro de `dibujar` pueden retrasarse
1023
- * hasta un ciclo de fotograma: desde el momento exacto en que ocurre un evento de entrada
1024
- * hasta la próxima vez que se dibuja un fotograma.
1025
- *
1026
- * Reproduce sonidos o activa otra retroalimentación no visual inmediatamente
1027
- * respondiendo a eventos de entrada dentro de funciones como
1028
- * `alPresionarRatón` y `alPresionarTecla`.
1029
- */
1030
-
1031
- /** 🖲
1032
- * Posición X actual del ratón.
1033
- * @example
1034
- * q5.dibujar = function () {
1035
- * fondo(0.8);
1036
- * tamañoTexto(64);
1037
- * texto(redondear(ratónX), -50, 20);
1038
- * };
1039
- */
1040
- let ratónX: number;
1041
-
1042
- /** 🖲
1043
- * Posición Y actual del ratón.
1044
- * @example
1045
- * q5.dibujar = function () {
1046
- * fondo(0.8);
1047
- * círculo(0, ratónY, 100);
1048
- * };
1049
- */
1050
- let ratónY: number;
1051
-
1052
- /** 🖲
1053
- * Posición X previa del ratón.
1054
- */
1055
- let pRatónX: number;
1056
-
1057
- /** 🖲
1058
- * Posición Y previa del ratón.
1059
- */
1060
- let pRatónY: number;
1061
-
1062
- /** 🖲
1063
- * El botón actual siendo presionado: 'left', 'right', 'center').
1064
- *
1065
- * El valor por defecto es una cadena vacía.
1066
- * @example
1067
- * q5.dibujar = function () {
1068
- * fondo(0.8);
1069
- * tamañoTexto(64);
1070
- * texto(botónRatón, -80, 20);
1071
- * };
1072
- */
1073
- let botónRatón: string;
1074
-
1075
- /** 🖲
1076
- * Verdadero si el ratón está actualmente presionado, falso de lo contrario.
1077
- * @example
1078
- * q5.dibujar = function () {
1079
- * if (ratónPresionado) fondo(0.4);
1080
- * else fondo(0.8);
1081
- * };
1082
- */
1083
- let ratónPresionado: boolean;
1084
-
1085
- /** 🖲
1086
- * Define esta función para responder a eventos de presionar el ratón.
1087
- * @example
1088
- * await Lienzo(200);
1089
- * let gris = 0.4;
1090
- *
1091
- * q5.alPresionarRatón = function () {
1092
- * fondo(gris);
1093
- * gris = (gris + 0.1) % 1;
1094
- * };
1095
- */
1096
- function alPresionarRatón(): void;
1097
-
1098
- /** 🖲
1099
- * Define esta función para responder a eventos de soltar el ratón.
1100
- * @example
1101
- * await Lienzo(200);
1102
- * let gris = 0.4;
1103
- *
1104
- * q5.alSoltarRatón = function () {
1105
- * fondo(gris);
1106
- * gris = (gris + 0.1) % 1;
1107
- * };
1108
- */
1109
- function alSoltarRatón(): void;
1110
-
1111
- /** 🖲
1112
- * Define esta función para responder a eventos de mover el ratón.
1113
- *
1114
- * En dispositivos con pantalla táctil esta función no se llama
1115
- * cuando el usuario arrastra su dedo en la pantalla.
1116
- * @example
1117
- * await Lienzo(200);
1118
- * let gris = 0.4;
1119
- *
1120
- * q5.alMoverRatón = function () {
1121
- * fondo(gris);
1122
- * gris = (gris + 0.005) % 1;
1123
- * };
1124
- */
1125
- function alMoverRatón(): void;
1126
-
1127
- /** 🖲
1128
- * Define esta función para responder a eventos de arrastrar el ratón.
1129
- *
1130
- * Arrastrar el ratón se define como mover el ratón
1131
- * mientras un botón del ratón está presionado.
1132
- * @example
1133
- * await Lienzo(200);
1134
- * let gris = 0.4;
1135
- *
1136
- * q5.alArrastrarRatón = function () {
1137
- * fondo(gris);
1138
- * gris = (gris + 0.005) % 1;
1139
- * };
1140
- */
1141
- function alArrastrarRatón(): void;
1142
-
1143
- /** 🖲
1144
- * Define esta función para responder a eventos de doble clic del ratón.
1145
- * @example
1146
- * await Lienzo(200);
1147
- * let gris = 0.4;
1148
- *
1149
- * q5.dobleClic = function () {
1150
- * fondo(gris);
1151
- * gris = (gris + 0.1) % 1;
1152
- * };
1153
- */
1154
- function dobleClic(): void;
1155
-
1156
- /** 🖲
1157
- * El nombre de la última tecla presionada.
1158
- * @example
1159
- * q5.dibujar = function () {
1160
- * fondo(0.8);
1161
- * tamañoTexto(64);
1162
- * texto(tecla, -80, 20);
1163
- * };
1164
- */
1165
- let tecla: string;
1166
-
1167
- /** 🖲
1168
- * Verdadero si una tecla está actualmente presionada, falso de lo contrario.
1169
- * @example
1170
- * q5.dibujar = function () {
1171
- * if (teclaPresionada) fondo(0.4);
1172
- * else fondo(0.8);
1173
- * };
1174
- */
1175
- let teclaPresionada: boolean;
1176
-
1177
- /** 🖲
1178
- * Devuelve verdadero si el usuario está presionando la tecla especificada, falso
1179
- * de lo contrario. Acepta nombres de teclas insensibles a mayúsculas.
1180
- * @param {string} tecla tecla a comprobar
1181
- * @returns {boolean} verdadero si la tecla está presionada, falso de lo contrario
1182
- * @example
1183
- * q5.dibujar = function () {
1184
- * fondo(0.8);
1185
- *
1186
- * if (teclaEstaPresionada('f') && teclaEstaPresionada('j')) {
1187
- * rect(-50, -50, 100, 100);
1188
- * }
1189
- * };
1190
- */
1191
- function teclaEstaPresionada(tecla: string): boolean;
1192
-
1193
- /** 🖲
1194
- * Define esta función para responder a eventos de presionar tecla.
1195
- * @example
1196
- * await Lienzo(200);
1197
- * let gris = 0.4;
1198
- *
1199
- * q5.alPresionarTecla = function () {
1200
- * fondo(gris);
1201
- * gris = (gris + 0.1) % 1;
1202
- * };
1203
- */
1204
- function alPresionarTecla(): void;
1205
-
1206
- /** 🖲
1207
- * Define esta función para responder a eventos de soltar tecla.
1208
- * @example
1209
- * await Lienzo(200);
1210
- * let gris = 0.4;
1211
- *
1212
- * q5.alSoltarTecla = function () {
1213
- * fondo(gris);
1214
- * gris = (gris + 0.1) % 1;
1215
- * };
1216
- */
1217
- function alSoltarTecla(): void;
1218
-
1219
- /** 🖲
1220
- * Array que contiene todos los puntos de toque actuales dentro de la
1221
- * ventana del navegador. Cada toque es un objeto con
1222
- * propiedades `id`, `x`, e `y`.
1223
- * @example
1224
- * q5.dibujar = function () {
1225
- * fondo(0.8);
1226
- * for (let toque of toques) {
1227
- * círculo(toque.x, toque.y, 100);
1228
- * }
1229
- * };
1230
- */
1231
- let toques: any[];
1232
-
1233
- /** 🖲
1234
- * Define esta función para responder a eventos de inicio de toque
1235
- * en el lienzo.
1236
- *
1237
- * Devuelve true para habilitar gestos táctiles como pellizcar para hacer zoom
1238
- * y desplazarse, que q5 deshabilita en el lienzo por defecto.
1239
- * @example
1240
- * await Lienzo(200);
1241
- * let gris = 0.4;
1242
- *
1243
- * q5.alEmpezarToque = function () {
1244
- * fondo(gris);
1245
- * gris = (gris + 0.1) % 1;
1246
- * };
1247
- */
1248
- function alEmpezarToque(): void;
1249
-
1250
- /** 🖲
1251
- * Define esta función para responder a eventos de fin de toque
1252
- * en el lienzo.
1253
- *
1254
- * Devuelve true para habilitar gestos táctiles como pellizcar para hacer zoom
1255
- * y desplazarse, que q5 deshabilita en el lienzo por defecto.
1256
- * @example
1257
- * await Lienzo(200);
1258
- * let gris = 0.4;
1259
- *
1260
- * q5.alTerminarToque = function () {
1261
- * fondo(gris);
1262
- * gris = (gris + 0.1) % 1;
1263
- * };
1264
- */
1265
- function alTerminarToque(): void;
1266
-
1267
- /** 🖲
1268
- * Define esta función para responder a eventos de movimiento de toque
1269
- * en el lienzo.
1270
- *
1271
- * Devuelve true para habilitar gestos táctiles como pellizcar para hacer zoom
1272
- * y desplazarse, que q5 deshabilita en el lienzo por defecto.
1273
- * @example
1274
- * await Lienzo(200);
1275
- * let gris = 0.4;
1276
- *
1277
- * q5.alMoverToque = function () {
1278
- * fondo(gris);
1279
- * gris = (gris + 0.005) % 1;
1280
- * };
1281
- */
1282
- function alMoverToque(): void;
1283
-
1284
- /** 🖲
1285
- * Objeto que contiene todos los punteros actuales dentro de la
1286
- * ventana del navegador.
1287
- *
1288
- * Esto incluye ratón, toque y punteros de lápiz.
1289
- *
1290
- * Cada puntero es un objeto con
1291
- * propiedades `event`, `x`, e `y`.
1292
- * La propiedad `event` contiene el
1293
- * [PointerEvent](https://developer.mozilla.org/docs/Web/API/PointerEvent) original.
1294
- * @example
1295
- * q5.dibujar = function () {
1296
- * fondo(0.8);
1297
- * for (let punteroID in punteros) {
1298
- * let puntero = punteros[punteroID];
1299
- * círculo(puntero.x, puntero.y, 100);
1300
- * }
1301
- * };
1302
- */
1303
- let punteros: {};
1304
-
1305
- /** 🖲
1306
- * Establece el cursor a un [tipo de cursor CSS](https://developer.mozilla.org/docs/Web/CSS/cursor) o imagen.
1307
- * Si se proporciona una imagen, las coordenadas x e y opcionales pueden
1308
- * especificar el punto activo del cursor.
1309
- * @param {string} nombre nombre del cursor o la url a una imagen
1310
- * @param {number} [x] coordenada x del punto del cursor
1311
- * @param {number} [y] coordenada y del punto del cursor
1312
- * @example
1313
- * await Lienzo(200, 100);
1314
- * cursor('pointer');
1315
- */
1316
- function cursor(nombre: string, x?: number, y?: number): void;
1317
-
1318
- /** 🖲
1319
- * Oculta el cursor dentro de los límites del lienzo.
1320
- * @example
1321
- * await Lienzo(200, 100);
1322
- * sinCursor();
1323
- */
1324
- function sinCursor(): void;
1325
-
1326
- /** 🖲
1327
- * Define esta función para responder a eventos de la rueda del ratón.
1328
- *
1329
- * `event.deltaX` y `event.deltaY` son las cantidades de desplazamiento horizontal y vertical,
1330
- * respectivamente.
1331
- *
1332
- * Devuelve true para permitir el comportamiento por defecto de desplazar la página.
1333
- * @example
1334
- * let x = (y = 0);
1335
- * q5.dibujar = function () {
1336
- * círculo(x, y, 10);
1337
- * };
1338
- * q5.ruedaRatón = function (e) {
1339
- * x += e.deltaX;
1340
- * y += e.deltaY;
1341
- * return false;
1342
- * };
1343
- */
1344
- function ruedaRatón(evento: any): void;
1345
-
1346
- /** 🖲
1347
- * Solicita que el puntero se bloquee al cuerpo del documento, ocultando
1348
- * el cursor y permitiendo un movimiento ilimitado.
1349
- *
1350
- * Los sistemas operativos habilitan la aceleración del ratón por defecto, lo cual es útil cuando a veces quieres un movimiento lento y preciso (piensa en cómo usarías un paquete de gráficos), pero también quieres moverte grandes distancias con un movimiento de ratón más rápido (piensa en desplazarte y seleccionar varios archivos). Para algunos juegos, sin embargo, se prefieren los datos de entrada de ratón sin procesar para controlar la rotación de la cámara — donde el mismo movimiento de distancia, rápido o lento, resulta en la misma rotación.
1351
- *
1352
- * Para salir del modo de bloqueo de puntero, llama a `document.exitPointerLock()`.
1353
- * @param {boolean} movimientoNoAjustado establecer a true para deshabilitar la aceleración del ratón a nivel de SO y acceder a la entrada de ratón sin procesar
1354
- * @example
1355
- * q5.dibujar = function () {
1356
- * círculo(ratónX / 10, ratónY / 10, 10);
1357
- * };
1358
- *
1359
- * q5.dobleClic = function () {
1360
- * if (!document.pointerLockElement) {
1361
- * bloqueoPuntero();
1362
- * } else {
1363
- * document.exitPointerLock();
1364
- * }
1365
- * };
1366
- */
1367
- function bloqueoPuntero(movimientoNoAjustado: boolean): void;
1368
-
1369
- // 🎨 color
1370
-
1371
- /** 🎨
1372
- * Crea un nuevo objeto `Color`, el cual es útil principalmente para almacenar
1373
- * un color que tu sketch reutilizará o modificará más tarde.
1374
- *
1375
- * Con el modo de color por defecto, RGB, los colores tienen componentes `r`/`red` (rojo), `g`/`green` (verde),
1376
- * `b`/`blue` (azul), y `a`/`alpha` (alfa).
1377
- *
1378
- * Las funciones [`relleno`](https://q5js.org/learn/#fill), [`trazo`](https://q5js.org/learn/#stroke), y [`fondo`](https://q5js.org/learn/#background)
1379
- * aceptan la misma amplia gama de representaciones de color que esta función.
1380
- *
1381
- * El formato de color por defecto es "flotante" ("float"), así que
1382
- * establece los componentes de color a valores entre 0 y 1.
1383
- *
1384
- * Aquí hay algunos ejemplos de uso válido:
1385
- *
1386
- * - `color(1)` (escala de grises)
1387
- * - `color(1, 0.8)` (escala de grises, alfa)
1388
- * - `color(1, 0, 0)` (r, g, b)
1389
- * - `color(1, 0, 0, 0.1)` (r, g, b, a)
1390
- * - `color('red')` (nombre de color)
1391
- * - `color('#ff0000')` (color hex)
1392
- * - `color([1, 0, 0])` (componentes de color)
1393
- * @param {string | number | Color | number[]} c0 color o primer componente de color
1394
- * @param {number} [c1] segundo componente de color
1395
- * @param {number} [c2] tercer componente de color
1396
- * @param {number} [c3] cuarto componente de color (alfa)
1397
- * @returns {Color} un nuevo objeto `Color`
1398
- * @example
1399
- * await Lienzo(200);
1400
- * rect(-100, -100, 100, 200);
1401
- *
1402
- * // ( r, g, b, a)
1403
- * let botella = color(0.35, 0.39, 1, 0.4);
1404
- * relleno(botella);
1405
- * trazo(botella);
1406
- * grosorTrazo(30);
1407
- * círculo(0, 0, 155);
1408
- * @example
1409
- * await Lienzo(200);
1410
- * // (gris, alfa)
1411
- * let c = color(0.8, 0.2);
1412
- *
1413
- * q5.dibujar = function () {
1414
- * fondo(c);
1415
- * círculo(ratónX, ratónY, 50);
1416
- * c.g = (c.g + 0.005) % 1;
1417
- * };
1418
- * @example
1419
- * await Lienzo(200);
1420
- *
1421
- * // (r, g, b, a)
1422
- * let c = color(0, 1, 1, 0.2);
1423
- *
1424
- * q5.dibujar = function () {
1425
- * relleno(c);
1426
- * círculo(ratónX, ratónY, 50);
1427
- * };
1428
- */
1429
- function color(c0: string | number | Color | number[], c1?: number, c2?: number, c3?: number): Color;
1430
-
1431
- /** 🎨
1432
- * Establece el modo de color para el sketch, lo cual cambia cómo se
1433
- * interpretan y muestran los colores.
1434
- *
1435
- * La gama de color es 'display-p3' por defecto, si el dispositivo soporta HDR.
1436
- *
1437
- * El modo de color por defecto es RGB en formato flotante.
1438
- * @param {'rgb' | 'oklch' | 'hsl' | 'hsb'} modo modo de color
1439
- * @param {1 | 255} formato formato de color (1 para flotante, 255 para entero)
1440
- * @param {'srgb' | 'display-p3'} [gama] gama de color
1441
- * @example
1442
- * await Lienzo(200);
1443
- *
1444
- * modoColor(RGB, 1);
1445
- * relleno(1, 0, 0);
1446
- * rect(-100, -100, 66, 200);
1447
- * relleno(0, 1, 0);
1448
- * rect(-34, -100, 67, 200);
1449
- * relleno(0, 0, 1);
1450
- * rect(33, -100, 67, 200);
1451
- * @example
1452
- * await Lienzo(200);
1453
- *
1454
- * modoColor(OKLCH);
1455
- *
1456
- * relleno(0.25, 0.15, 0);
1457
- * rect(-100, -100, 100, 200);
1458
- *
1459
- * relleno(0.75, 0.15, 0);
1460
- * rect(0, -100, 100, 200);
1461
- */
1462
- function modoColor(modo: 'rgb' | 'oklch', formato: 1 | 255, gama: 'srgb' | 'display-p3'): void;
1463
-
1464
- /** 🎨
1465
- * Los colores RGB tienen componentes `r`/`red` (rojo), `g`/`green` (verde), `b`/`blue` (azul),
1466
- * y `a`/`alpha` (alfa).
1467
- *
1468
- * Por defecto cuando un lienzo está usando el espacio de color HDR "display-p3",
1469
- * los colores rgb son mapeados a la gama completa P3, incluso cuando usan el
1470
- * formato entero legado 0-255.
1471
- * @example
1472
- * await Lienzo(200, 100);
1473
- *
1474
- * modoColor(RGB);
1475
- *
1476
- * fondo(1, 0, 0);
1477
- */
1478
- const RGB: 'rgb';
1479
-
1480
- /** 🎨
1481
- * Los colores OKLCH tienen componentes `l`/`lightness` (luminosidad), `c`/`chroma` (croma),
1482
- * `h`/`hue` (tono), y `a`/`alpha` (alfa). Es más intuitivo para los humanos
1483
- * trabajar con color en estos términos que con RGB.
1484
- *
1485
- * OKLCH es perceptualmente uniforme, lo que significa que los colores con la
1486
- * misma luminosidad y croma (colorido) parecerán tener
1487
- * igual luminancia, independientemente del tono.
1488
- *
1489
- * OKLCH puede representar con precisión todos los colores visibles para el
1490
- * ojo humano, a diferencia de muchos otros espacios de color que están limitados
1491
- * a una gama. Los valores máximos de luminosidad y croma que
1492
- * corresponden a los límites de la gama sRGB o P3 varían dependiendo del
1493
- * tono. Los colores que están fuera de la gama serán recortados al
1494
- * color dentro de la gama más cercano.
1495
- *
1496
- * Usa el [selector de color OKLCH](https://oklch.com) para encontrar
1497
- * colores dentro de la gama.
1498
- *
1499
- * - `lightness`: 0 a 1
1500
- * - `chroma`: 0 a ~0.4
1501
- * - `hue`: 0 a 360
1502
- * - `alpha`: 0 a 1
1503
- * @example
1504
- * await Lienzo(200, 100);
1505
- *
1506
- * modoColor(OKLCH);
1507
- *
1508
- * fondo(0.64, 0.3, 30);
1509
- * @example
1510
- * await Lienzo(200);
1511
- * modoColor(OKLCH);
1512
- *
1513
- * q5.dibujar = function () {
1514
- * fondo(0.7, 0.16, cuadroActual % 360);
1515
- * };
1516
- */
1517
- const OKLCH: 'oklch';
1518
-
1519
- /** 🎨
1520
- * Los colores HSL tienen componentes `h`/`hue` (tono), `s`/`saturation` (saturación),
1521
- * `l`/`lightness` (luminosidad), y `a`/`alpha` (alfa).
1522
- *
1523
- * HSL fue creado en la década de 1970 para aproximar la percepción humana
1524
- * del color, intercambiando precisión por cálculos más simples. No es
1525
- * perceptualmente uniforme, por lo que colores con la misma luminosidad
1526
- * pueden parecer más oscuros o más claros, dependiendo de su tono
1527
- * y saturación. Sin embargo, los valores de luminosidad y saturación que
1528
- * corresponden a los límites de la gama siempre son 100, independientemente del
1529
- * tono. Esto puede hacer que HSL sea más fácil de trabajar que OKLCH.
1530
- *
1531
- * Los colores HSL son mapeados a la gama completa P3 cuando
1532
- * se usa el espacio de color "display-p3".
1533
- *
1534
- * - `hue`: 0 a 360
1535
- * - `saturation`: 0 a 100
1536
- * - `lightness`: 0 a 100
1537
- * - `alpha`: 0 a 1
1538
- * @example
1539
- * await Lienzo(200, 100);
1540
- *
1541
- * modoColor(HSL);
1542
- *
1543
- * fondo(0, 100, 50);
1544
- * @example
1545
- * await Lienzo(200, 220);
1546
- * sinTrazo();
1547
- *
1548
- * modoColor(HSL);
1549
- * for (let h = 0; h < 360; h += 10) {
1550
- * for (let l = 0; l <= 100; l += 10) {
1551
- * relleno(h, 100, l);
1552
- * rect(h * (11 / 20) - 100, l * 2 - 110, 6, 20);
1553
- * }
1554
- * }
1555
- */
1556
- const HSL: 'hsl';
1557
-
1558
- /** 🎨
1559
- * Los colores HSB tienen componentes `h`/`hue` (tono), `s`/`saturation` (saturación),
1560
- * `b`/`brightness` (brillo) (también conocido como `v`/`value` (valor)), y `a`/`alpha` (alfa).
1561
- *
1562
- * HSB es similar a HSL, pero en lugar de luminosidad
1563
- * (negro a blanco), usa brillo (negro a
1564
- * color completo). Para producir blanco, establece el brillo
1565
- * a 100 y la saturación a 0.
1566
- *
1567
- * - `hue`: 0 a 360
1568
- * - `saturation`: 0 a 100
1569
- * - `brightness`: 0 a 100
1570
- * - `alpha`: 0 a 1
1571
- * @example
1572
- * await Lienzo(200, 100);
1573
- *
1574
- * modoColor(HSB);
1575
- *
1576
- * fondo(0, 100, 100);
1577
- * @example
1578
- * await Lienzo(200, 220);
1579
- * sinTrazo();
1580
- *
1581
- * modoColor(HSB);
1582
- * for (let h = 0; h < 360; h += 10) {
1583
- * for (let b = 0; b <= 100; b += 10) {
1584
- * relleno(h, 100, b);
1585
- * rect(h * (11 / 20) - 100, b * 2 - 110, 6, 20);
1586
- * }
1587
- * }
1588
- */
1589
- const HSB: 'hsb';
1590
-
1591
- /** 🎨
1592
- * Limita la gama de color al espacio de color sRGB.
1593
- *
1594
- * Si tu pantalla es capaz de HDR, nota que el rojo completo aparece
1595
- * menos saturado y oscuro en este ejemplo, como lo haría en
1596
- * una pantalla SDR.
1597
- * @example
1598
- * await Lienzo(200, 100);
1599
- *
1600
- * modoColor(RGB, 1, SRGB);
1601
- *
1602
- * fondo(1, 0, 0);
1603
- */
1604
- const SRGB: 'srgb';
1605
-
1606
- /** 🎨
1607
- * Expande la gama de color al espacio de color P3.
1608
- *
1609
- * Esta es la gama de color por defecto en dispositivos que soportan HDR.
1610
- *
1611
- * Si tu pantalla es capaz de HDR, nota que el rojo completo aparece
1612
- * totalmente saturado y brillante en el siguiente ejemplo.
1613
- * @example
1614
- * await Lienzo(200, 100);
1615
- *
1616
- * modoColor(RGB, 1, DISPLAY_P3);
1617
- *
1618
- * fondo(1, 0, 0);
1619
- */
1620
- const DISPLAY_P3: 'display-p3';
1621
-
1622
- /** 🎨
1623
- * Dibuja sobre todo el lienzo con un color o una imagen.
1624
- *
1625
- * Al igual que la función [`color`](https://q5js.org/learn/#color),
1626
- * esta función puede aceptar colores en una amplia gama de formatos:
1627
- * cadena de color CSS, valor de escala de grises y valores de componentes de color.
1628
- * @param {Color | Q5.Image} relleno un color o una imagen para dibujar
1629
- * @example
1630
- * await Lienzo(200, 100);
1631
- * fondo('crimson');
1632
- * @example
1633
- * q5.dibujar = function () {
1634
- * fondo(0.5, 0.2);
1635
- * círculo(ratónX, ratónY, 20);
1636
- * };
1637
- */
1638
- function fondo(relleno: Color | Q5.Imagen): void;
1639
-
1640
- class Color {
1641
-
1642
- /** 🎨
1643
- * Este constructor acepta estrictamente 4 números, que son los componentes del color.
1644
- *
1645
- * Usa la función `color` para mayor flexibilidad, ejecuta
1646
- * este constructor internamente.
1647
- *
1648
- * `Color` no es realmente una clase en si misma, es una referencia a una
1649
- * clase de color Q5 basada en el modo de color, formato y gama.
1650
- */
1651
- constructor(c0: number, c1: number, c2: number, c3: number);
1652
-
1653
- /** 🎨
1654
- * Comprueba si este color es exactamente igual a otro color.
1655
- */
1656
- igual(otro: Color): boolean;
1657
-
1658
- /** 🎨
1659
- * Comprueba si el color es el mismo que otro color,
1660
- * ignorando sus valores alfa.
1661
- */
1662
- esMismoColor(otro: Color): boolean;
1663
-
1664
- /** 🎨
1665
- * Produce una representación de cadena de color CSS.
1666
- */
1667
- toString(): string;
1668
-
1669
- /** 🎨
1670
- * Un array de los componentes del color.
1671
- */
1672
- niveles: number[];
1673
- }
1674
-
1675
- // 💅 estilos
1676
-
1677
- /** 💅
1678
- * Establece el color de relleno. El defecto es blanco.
1679
- *
1680
- * Como la función [`color`](https://q5js.org/learn/#color), esta función
1681
- * puede aceptar colores en una amplia gama de formatos: como una cadena de color CSS,
1682
- * un objeto `Color`, valor de escala de grises, o valores de componentes de color.
1683
- * @param {Color} color color de relleno
1684
- * @example
1685
- * await Lienzo(200);
1686
- * fondo(0.8);
1687
- *
1688
- * relleno('red');
1689
- * círculo(-20, -20, 80);
1690
- *
1691
- * relleno('lime');
1692
- * cuadrado(-20, -20, 80);
1693
- */
1694
- function relleno(color: Color): void;
1695
-
1696
- /** 💅
1697
- * Establece el color del trazo (contorno). El defecto es negro.
1698
- *
1699
- * Como la función [`color`](https://q5js.org/learn/#color), esta función
1700
- * puede aceptar colores en una amplia gama de formatos: como una cadena de color CSS,
1701
- * un objeto `Color`, valor de escala de grises, o valores de componentes de color.
1702
- * @param {Color} color color de trazo
1703
- * @example
1704
- * await Lienzo(200);
1705
- * fondo(0.8);
1706
- * relleno(0.14);
1707
- *
1708
- * trazo('red');
1709
- * círculo(-20, -20, 80);
1710
- *
1711
- * trazo('lime');
1712
- * cuadrado(-20, -20, 80);
1713
- */
1714
- function trazo(color: Color): void;
1715
-
1716
- /** 💅
1717
- * Después de llamar a esta función, el dibujo no será rellenado.
1718
- * @example
1719
- * await Lienzo(200);
1720
- * fondo(0.8);
1721
- *
1722
- * sinRelleno();
1723
- *
1724
- * trazo('red');
1725
- * círculo(-20, -20, 80);
1726
- * trazo('lime');
1727
- * cuadrado(-20, -20, 80);
1728
- */
1729
- function sinRelleno(): void;
1730
-
1731
- /** 💅
1732
- * Después de llamar a esta función, el dibujo no tendrá un trazo (contorno).
1733
- * @example
1734
- * await Lienzo(200);
1735
- * fondo(0.8);
1736
- * relleno(0.14);
1737
- * trazo('red');
1738
- * círculo(-20, -20, 80);
1739
- *
1740
- * sinTrazo();
1741
- * cuadrado(-20, -20, 80);
1742
- */
1743
- function sinTrazo(): void;
1744
-
1745
- /** 💅
1746
- * Establece el tamaño del trazo usado para líneas y el borde alrededor de dibujos.
1747
- * @param {number} grosor tamaño del trazo en píxeles
1748
- * @example
1749
- * await Lienzo(200);
1750
- * fondo(0.8);
1751
- * trazo('red');
1752
- * círculo(-50, 0, 80);
1753
- *
1754
- * grosorTrazo(12);
1755
- * círculo(50, 0, 80);
1756
- */
1757
- function grosorTrazo(grosor: number): void;
1758
-
1759
- /** 💅
1760
- * Establece la opacidad global, que afecta a todas las operaciones de dibujo posteriores, excepto `fondo`. El defecto es 1, totalmente opaco.
1761
- *
1762
- * En q5 WebGPU esta función solo afecta a imágenes.
1763
- * @param {number} alfa nivel de opacidad, variando de 0 a 1
1764
- * @example
1765
- * await Lienzo(200);
1766
- * fondo(0.8);
1767
- *
1768
- * opacidad(1);
1769
- * círculo(-20, -20, 80);
1770
- *
1771
- * opacidad(0.2);
1772
- * cuadrado(-20, -20, 80);
1773
- */
1774
- function opacidad(alfa: number): void;
1775
-
1776
- /** 💅
1777
- * Establece el color de la sombra. El defecto es transparente (sin sombra).
1778
- *
1779
- * Las sombras se aplican a cualquier cosa dibujada en el lienzo, incluyendo formas rellenas,
1780
- * trazos, texto, e imágenes.
1781
- *
1782
- * Como la función [`color`](https://q5js.org/learn/#color), esta función
1783
- * puede aceptar colores en una amplia gama de formatos: como una cadena de color CSS,
1784
- * un objeto `Color`, valor de escala de grises, o valores de componentes de color.
1785
- *
1786
- * No disponible en q5 WebGPU.
1787
- * @param {Color} color color de sombra
1788
- */
1789
- function sombra(color: string | Color): void;
1790
-
1791
- /** 💅
1792
- * Deshabilita el efecto de sombra.
1793
- *
1794
- * No disponible en q5 WebGPU.
1795
- */
1796
- function sinSombra(): void;
1797
-
1798
- /** 💅
1799
- * Establece el desplazamiento de la sombra y el radio de desenfoque.
1800
- *
1801
- * Cuando q5 comienza, el desplazamiento de la sombra es (10, 10) con un desenfoque de 10.
1802
- *
1803
- * No disponible en q5 WebGPU.
1804
- * @param {number} offsetX desplazamiento horizontal de la sombra
1805
- * @param {number} offsetY desplazamiento vertical de la sombra, por defecto es el mismo que offsetX
1806
- * @param {number} desenfoque radio de desenfoque de la sombra, por defecto es 0
1807
- */
1808
- function cajaSombra(offsetX: number, offsetY: number, desenfoque: number): void;
1809
-
1810
- /** 💅
1811
- * Establece la operación de composición global para el contexto del lienzo.
1812
- *
1813
- * No disponible en q5 WebGPU.
1814
- * @param {string} val operación de composición
1815
- */
1816
- function modoMezcla(val: string): void;
1817
-
1818
- /** 💅
1819
- * Establece el estilo de terminación de línea a `ROUND`, `SQUARE`, o `PROJECT`.
1820
- *
1821
- * No disponible en q5 WebGPU.
1822
- * @param {CanvasLineCap} val estilo de terminación de línea
1823
- */
1824
- function terminaciónTrazo(val: CanvasLineCap): void;
1825
-
1826
- /** 💅
1827
- * Establece el estilo de unión de línea a `ROUND`, `BEVEL`, o `MITER`.
1828
- *
1829
- * No disponible en q5 WebGPU.
1830
- * @param {CanvasLineJoin} val estilo de unión de línea
1831
- */
1832
- function uniónTrazo(val: CanvasLineJoin): void;
1833
-
1834
- /** 💅
1835
- * Establece el lienzo en modo borrar, donde las formas borrarán lo que está
1836
- * debajo de ellas en lugar de dibujar sobre ello.
1837
- *
1838
- * No disponible en q5 WebGPU.
1839
- * @param {number} [rellenoAlfa] nivel de opacidad del color de relleno
1840
- * @param {number} [trazoAlfa] nivel de opacidad del color de trazo
1841
- */
1842
- function borrar(rellenoAlfa?: number, trazoAlfa?: number): void;
1843
-
1844
- /** 💅
1845
- * Reinicia el lienzo del modo borrar al modo de dibujo normal.
1846
- *
1847
- * No disponible en q5 WebGPU.
1848
- */
1849
- function noBorrar(): void;
1850
-
1851
- /** 💅
1852
- * Guarda la configuración de estilo de dibujo actual.
1853
- *
1854
- * Esto incluye el relleno, trazo, grosor de trazo, tinte, modo de imagen,
1855
- * modo de rectángulo, modo de elipse, tamaño de texto, alineación de texto, línea base de texto, y
1856
- * configuración de sombra.
1857
- * @example
1858
- * await Lienzo(200);
1859
- * fondo(0.8);
1860
- *
1861
- * guardarEstilos();
1862
- * relleno('blue');
1863
- * círculo(-50, -50, 80);
1864
- *
1865
- * recuperarEstilos();
1866
- * círculo(50, 50, 80);
1867
- */
1868
- function guardarEstilos(): void;
1869
-
1870
- /** 💅
1871
- * Restaura la configuración de estilo de dibujo guardada previamente.
1872
- * @example
1873
- * await Lienzo(200);
1874
- * fondo(0.8);
1875
- *
1876
- * guardarEstilos();
1877
- * relleno('blue');
1878
- * círculo(-50, -50, 80);
1879
- *
1880
- * recuperarEstilos();
1881
- * círculo(50, 50, 80);
1882
- */
1883
- function recuperarEstilos(): void;
1884
-
1885
- /** 💅
1886
- * Limpia el lienzo, haciendo que cada píxel sea completamente transparente.
1887
- *
1888
- * Ten en cuenta que el lienzo solo se puede ver a través si tiene un canal alfa.
1889
- * @example
1890
- * await Lienzo(200, { alpha: true });
1891
- *
1892
- * q5.dibujar = function () {
1893
- * limpiar();
1894
- * círculo((frameCount % 200) - 100, 0, 80);
1895
- * };
1896
- */
1897
- function limpiar(): void;
1898
-
1899
- /** 💅
1900
- * Comprueba si un punto dado está dentro del área de relleno del camino actual.
1901
- *
1902
- * No disponible en q5 WebGPU.
1903
- * @param {number} x coordenada-x del punto
1904
- * @param {number} y coordenada-y del punto
1905
- * @returns {boolean} verdadero si el punto está dentro del área de relleno, falso de lo contrario
1906
- */
1907
- function enRelleno(x: number, y: number): boolean;
1908
-
1909
- /** 💅
1910
- * Comprueba si un punto dado está dentro del trazo del camino actual.
1911
- *
1912
- * No disponible en q5 WebGPU.
1913
- * @param {number} x coordenada-x del punto
1914
- * @param {number} y coordenada-y del punto
1915
- * @returns {boolean} verdadero si el punto está dentro del trazo, falso de lo contrario
1916
- */
1917
- function enTrazo(x: number, y: number): boolean;
1918
-
1919
- // 🦋 transformaciones
1920
-
1921
- /** 🦋
1922
- * Traslada el origen del contexto de dibujo.
1923
- * @param {number} x traslación a lo largo del eje x
1924
- * @param {number} y traslación a lo largo del eje y
1925
- * @example
1926
- * q5.dibujar = function () {
1927
- * fondo(0.8);
1928
- *
1929
- * trasladar(50, 50);
1930
- * círculo(0, 0, 80);
1931
- * };
1932
- */
1933
- function trasladar(x: number, y: number): void;
1934
-
1935
- /** 🦋
1936
- * Rota el contexto de dibujo.
1937
- * @param {number} angulo ángulo de rotación en radianes
1938
- * @example
1939
- * q5.dibujar = function () {
1940
- * fondo(0.8);
1941
- *
1942
- * rotar(ratónX / 50);
1943
- *
1944
- * modoRect(CENTER);
1945
- * cuadrado(0, 0, 120);
1946
- * };
1947
- */
1948
- function rotar(angulo: number): void;
1949
-
1950
- /** 🦋
1951
- * Escala el contexto de dibujo.
1952
- *
1953
- * Si solo se proporciona un parámetro de entrada,
1954
- * el contexto de dibujo se escalará uniformemente.
1955
- * @param {number} x factor de escala a lo largo del eje x
1956
- * @param {number} [y] factor de escala a lo largo del eje y
1957
- * @example
1958
- * q5.dibujar = function () {
1959
- * fondo(0.8);
1960
- *
1961
- * escalar(ratónX / 10);
1962
- * círculo(0, 0, 20);
1963
- * };
1964
- */
1965
- function escalar(x: number, y?: number): void;
1966
-
1967
- /** 🦋
1968
- * Cizalla el contexto de dibujo a lo largo del eje x.
1969
- * @param {number} angulo ángulo de cizallamiento en radianes
1970
- * @example
1971
- * q5.dibujar = function () {
1972
- * fondo(0.8);
1973
- *
1974
- * trasladar(-75, -40);
1975
- * cizallarX(ratónX / 100);
1976
- * cuadrado(0, 0, 80);
1977
- * };
1978
- */
1979
- function cizallarX(angulo: number): void;
1980
-
1981
- /** 🦋
1982
- * Cizalla el contexto de dibujo a lo largo del eje y.
1983
- * @param {number} angulo ángulo de cizallamiento en radianes
1984
- * @example
1985
- * q5.dibujar = function () {
1986
- * fondo(0.8);
1987
- *
1988
- * trasladar(-75, -40);
1989
- * cizallarY(ratónX / 100);
1990
- * cuadrado(0, 0, 80);
1991
- * };
1992
- */
1993
- function cizallarY(angulo: number): void;
1994
-
1995
- /** 🦋
1996
- * Aplica una matriz de transformación.
1997
- *
1998
- * Acepta una matriz de 3x3 como un array o múltiples argumentos.
1999
- *
2000
- * Ten en cuenta que en q5 WebGPU, la matriz de identidad (por defecto)
2001
- * tiene una escala y negativa para voltear el eje y para coincidir con
2002
- * el renderizador Canvas2D.
2003
- * @param {number} a
2004
- * @param {number} b
2005
- * @param {number} c
2006
- * @param {number} d
2007
- * @param {number} e
2008
- * @param {number} f
2009
- * @example
2010
- * q5.dibujar = function () {
2011
- * fondo(0.8);
2012
- *
2013
- * aplicarMatriz(2, -1, 1, -1);
2014
- * círculo(0, 0, 80);
2015
- * };
2016
- */
2017
- function aplicarMatriz(a: number, b: number, c: number, d: number, e: number, f: number): void;
2018
-
2019
- /** 🦋
2020
- * Reinicia la matriz de transformación.
2021
- *
2022
- * q5 ejecuta esta función antes de cada vez que se ejecuta la función `dibujar`,
2023
- * para que las transformaciones no se trasladen al siguiente fotograma.
2024
- * @example
2025
- * await Lienzo(200);
2026
- * fondo(0.8);
2027
- *
2028
- * trasladar(50, 50);
2029
- * círculo(0, 0, 80);
2030
- *
2031
- * reiniciarMatriz();
2032
- * cuadrado(0, 0, 50);
2033
- */
2034
- function reiniciarMatriz(): void;
2035
-
2036
- /** 🦋
2037
- * Guarda la matriz de transformación actual.
2038
- * @example
2039
- * await Lienzo(200);
2040
- * fondo(0.8);
2041
- *
2042
- * guardarMatriz();
2043
- * rotar(CUARTO_PI);
2044
- * elipse(0, 0, 120, 40);
2045
- * recuperarMatriz();
2046
- *
2047
- * elipse(0, 0, 120, 40);
2048
- */
2049
- function guardarMatriz(): void;
2050
-
2051
- /** 🦋
2052
- * Restaura la matriz de transformación guardada previamente.
2053
- * @example
2054
- * await Lienzo(200);
2055
- * fondo(0.8);
2056
- *
2057
- * guardarMatriz();
2058
- * rotar(CUARTO_PI);
2059
- * elipse(0, 0, 120, 40);
2060
- * recuperarMatriz();
2061
- *
2062
- * elipse(0, 0, 120, 40);
2063
- */
2064
- function recuperarMatriz(): void;
2065
-
2066
- /** 🦋
2067
- * Guarda la configuración de estilo de dibujo y transformaciones actuales.
2068
- * @example
2069
- * await Lienzo(200);
2070
- *
2071
- * apilar();
2072
- * relleno('blue');
2073
- * trasladar(50, 50);
2074
- * círculo(0, 0, 80);
2075
- * desapilar();
2076
- *
2077
- * cuadrado(0, 0, 50);
2078
- */
2079
- function apilar(): void;
2080
-
2081
- /** 🦋
2082
- * Restaura la configuración de estilo de dibujo y transformaciones guardadas previamente.
2083
- * @example
2084
- * await Lienzo(200);
2085
- *
2086
- * apilar();
2087
- * relleno('blue');
2088
- * trasladar(50, 50);
2089
- * círculo(0, 0, 80);
2090
- * desapilar();
2091
- *
2092
- * cuadrado(0, 0, 50);
2093
- */
2094
- function desapilar(): void;
2095
-
2096
- function recuperar(): void;
2097
-
2098
- // 💻 visualización
2099
-
2100
- /** 💻
2101
- * Personaliza cómo se presenta tu lienzo.
2102
- * @param {string} modo NORMAL, CENTRO, o MAXIMIZADO
2103
- * @param {string} calidadRenderizado SUAVE o PIXELADO
2104
- * @param {number} escala también se puede dar como una cadena (por ejemplo "x2")
2105
- * @example
2106
- * await Lienzo(50, 25);
2107
- *
2108
- * modoVisualización(CENTRO, PIXELADO, 4);
2109
- *
2110
- * círculo(0, 0, 16);
2111
- */
2112
- function modoVisualización(modo: string, calidadRender: string, escala: string | number): void;
2113
-
2114
- /** 💻
2115
- * Una configuración de `modoVisualización`.
2116
- *
2117
- * El lienzo se escalará para llenar el elemento padre,
2118
- * con bandas negras si es necesario para preservar su relación de aspecto.
2119
- */
2120
- const MAXIMIZADO: 'maxed';
2121
-
2122
- /** 💻
2123
- * Una calidad de renderizado de `modoVisualización`.
2124
- *
2125
- * Se usa escalado suave si el lienzo se escala.
2126
- */
2127
- const SUAVE: 'smooth';
2128
-
2129
- /** 💻
2130
- * Una calidad de renderizado de `modoVisualización`.
2131
- *
2132
- * Los píxeles se renderizan como cuadrados nítidos si el lienzo se escala.
2133
- */
2134
- const PIXELADO: 'pixelated';
2135
-
2136
- /** 💻
2137
- * Habilita o deshabilita el modo de pantalla completa.
2138
- * @param {boolean} [v] booleano indicando si habilitar o deshabilitar el modo de pantalla completa
2139
- */
2140
- function pantallaCompleta(v?: boolean): void;
2141
-
2142
- /** 💻
2143
- * El ancho de la ventana.
2144
- * @example
2145
- * q5.dibujar = function () {
2146
- * fondo(0.8);
2147
- * tamañoTexto(64);
2148
- * alineaciónTexto(CENTRO, CENTRO);
2149
- * texto(anchoVentana, 0, 0);
2150
- * };
2151
- */
2152
- var anchoVentana: number;
2153
-
2154
- /** 💻
2155
- * El alto de la ventana.
2156
- * @example
2157
- * q5.dibujar = function () {
2158
- * fondo(0.8);
2159
- * tamañoTexto(64);
2160
- * alineaciónTexto(CENTRO, CENTRO);
2161
- * texto(altoVentana, 0, 0);
2162
- * };
2163
- */
2164
- var altoVentana: number;
2165
-
2166
- /** 💻
2167
- * El ancho del lienzo.
2168
- * @example
2169
- * await Lienzo(200, 120);
2170
- * círculo(0, 0, ancho);
2171
- */
2172
- var ancho: number;
2173
-
2174
- /** 💻
2175
- * El alto del lienzo.
2176
- * @example
2177
- * await Lienzo(200, 80);
2178
- * círculo(0, 0, alto);
2179
- */
2180
- var alto: number;
2181
-
2182
- /** 💻
2183
- * La mitad del ancho del lienzo.
2184
- * @example
2185
- * await Lienzo(200, 80);
2186
- * círculo(0, 0, medioAncho);
2187
- */
2188
- var medioAncho: number;
2189
-
2190
- /** 💻
2191
- * La mitad del alto del lienzo.
2192
- * @example
2193
- * await Lienzo(200, 80);
2194
- * círculo(0, 0, medioAlto);
2195
- */
2196
- var medioAlto: number;
2197
-
2198
- /** 💻
2199
- * El elemento lienzo asociado con la instancia Q5.
2200
- *
2201
- * Si no se crea un lienzo explícitamente con `crearLienzo()`, pero se define una función q5 como `dibujar` o `alPresionarRatón`, se creará automáticamente un lienzo por defecto de tamaño 200x200.
2202
- */
2203
- var lienzo: HTMLCanvasElement;
2204
-
2205
- /** 💻
2206
- * Redimensiona el lienzo al ancho y alto especificados.
2207
- * @param {number} w ancho del lienzo
2208
- * @param {number} h alto del lienzo
2209
- * @example
2210
- * await Lienzo(200, 100);
2211
- *
2212
- * q5.dibujar = function () {
2213
- * fondo(0.8);
2214
- * };
2215
- *
2216
- * q5.alPresionarRatón = function () {
2217
- * redimensionarLienzo(200, 200);
2218
- * };
2219
- */
2220
- function redimensionarLienzo(w: number, h: number): void;
2221
-
2222
- /** 💻
2223
- * El número de cuadros que se han mostrado desde que comenzó el programa.
2224
- * @example
2225
- * q5.dibujar = function () {
2226
- * fondo(0.8);
2227
- * tamañoTexto(64);
2228
- * texto(cuadroActual, -92, 20);
2229
- * };
2230
- */
2231
- var cuadroActual: number;
2232
-
2233
- /** 💻
2234
- * Detiene el bucle de dibujo.
2235
- * @example
2236
- * q5.dibujar = function () {
2237
- * círculo(cuadroActual * 5 - 100, 0, 80);
2238
- * pausar();
2239
- * };
2240
- */
2241
- function pausar(): void;
2242
-
2243
- /** 💻
2244
- * Redibuja el lienzo n veces. Si no se proporciona ningún parámetro de entrada,
2245
- * llama a la función de dibujo una vez.
2246
- *
2247
- * Esta es una función asíncrona.
2248
- * @param {number} [n] número de veces para redibujar el lienzo, por defecto es 1
2249
- * @example
2250
- * await Lienzo(200);
2251
- * pausar();
2252
- *
2253
- * q5.dibujar = function () {
2254
- * círculo(cuadroActual * 5 - 100, 0, 80);
2255
- * };
2256
- * q5.alPresionarRatón = function () {
2257
- * redibujar(10);
2258
- * };
2259
- */
2260
- function redibujar(n?: number): void;
2261
-
2262
- /** 💻
2263
- * Inicia el bucle de dibujo de nuevo si estaba detenido.
2264
- * @example
2265
- * await Lienzo(200);
2266
- * pausar();
2267
- *
2268
- * q5.dibujar = function () {
2269
- * círculo(cuadroActual * 5 - 100, 0, 80);
2270
- * };
2271
- * q5.alPresionarRatón = function () {
2272
- * reanudar();
2273
- * };
2274
- */
2275
- function reanudar(): void;
2276
-
2277
- /** 💻
2278
- * Establece la frecuencia de fotogramas objetivo u obtiene una aproximación de la
2279
- * frecuencia de fotogramas actual del sketch.
2280
- *
2281
- * Incluso cuando el sketch se está ejecutando a una frecuencia de fotogramas consistente,
2282
- * el valor actual de la frecuencia de fotogramas fluctuará. Usa las herramientas de desarrollador
2283
- * de tu navegador web para un análisis de rendimiento más preciso.
2284
- * @param {number} [hertz] frecuencia de fotogramas objetivo, por defecto es 60
2285
- * @returns {number} frecuencia de fotogramas actual
2286
- * @example
2287
- * q5.dibujar = function () {
2288
- * fondo(0.8);
2289
- *
2290
- * if (ratónPresionado) frecuenciaRefresco(10);
2291
- * else frecuenciaRefresco(60);
2292
- *
2293
- * círculo((cuadroActual % 200) - 100, 0, 80);
2294
- * };
2295
- * @example
2296
- * q5.dibujar = function () {
2297
- * fondo(0.8);
2298
- * tamañoTexto(64);
2299
- * texto(redondear(frecuenciaRefresco()), -35, 20);
2300
- * };
2301
- */
2302
- function frecuenciaRefresco(hertz?: number): number;
2303
-
2304
- /** 💻
2305
- * La frecuencia de fotogramas deseada del sketch.
2306
- * @returns {number} frecuencia de fotogramas objetivo
2307
- * @example
2308
- * q5.dibujar = function () {
2309
- * fondo(0.8);
2310
- * tamañoTexto(64);
2311
- *
2312
- * texto(obtenerTasaFotogramasObjetivo(), -35, 20);
2313
- * };
2314
- */
2315
- function obtenerTasaFotogramasObjetivo(): number;
2316
-
2317
- /** 💻
2318
- * Obtiene los FPS actuales, en términos de cuántos fotogramas podrían generarse
2319
- * en un segundo, lo cual puede ser más alto que la frecuencia de fotogramas objetivo.
2320
- *
2321
- * Usa las herramientas de desarrollador de tu navegador web para un análisis
2322
- * de rendimiento más profundo.
2323
- * @returns {number} fotogramas por segundo
2324
- * @example
2325
- * q5.dibujar = function () {
2326
- * fondo(0.8);
2327
- * frecuenciaRefresco(1);
2328
- * tamañoTexto(64);
2329
- *
2330
- * texto(obtenerFPS(), -92, 20);
2331
- * };
2332
- */
2333
- function obtenerFPS(): number;
2334
-
2335
- /** 💻
2336
- * Se ejecuta después de cada llamada a la función `dibujar` y procesos de addons de q5 post-dibujo, si los hay.
2337
- *
2338
- * Útil para añadir efectos de post-procesamiento cuando no es posible
2339
- * hacerlo al final de la función `dibujar`, como cuando se usan
2340
- * addons como p5play que auto-dibujan al lienzo después de que
2341
- * la función `dibujar` se ejecuta.
2342
- */
2343
- function postProcesar(): void;
2344
-
2345
- /** 💻
2346
- * Establece la densidad de píxeles del lienzo.
2347
- * @param {number} v valor de densidad de píxeles
2348
- * @returns {number} densidad de píxeles
2349
- * @example
2350
- * await Lienzo(200, 100);
2351
- * fondo(0.8);
2352
- * densidadPíxeles(1);
2353
- * círculo(0, 0, 80);
2354
- */
2355
- function densidadPíxeles(v: number): number;
2356
-
2357
- /** 💻
2358
- * Devuelve la densidad de visualización actual.
2359
- *
2360
- * En la mayoría de pantallas modernas, este valor será 2 o 3.
2361
- * @returns {number} densidad de visualización
2362
- * @example
2363
- * await Lienzo(200, 100);
2364
- * fondo(0.8);
2365
- * tamañoTexto(64);
2366
- * texto(densidadVisualización(), -90, 6);
2367
- */
2368
- function densidadVisualización(): number;
2369
-
2370
- /** 💻
2371
- * El tiempo pasado desde que se dibujó el último fotograma.
2372
- *
2373
- * Con la frecuencia de fotogramas por defecto de 60, el tiempo delta será
2374
- * aproximadamente 16.6
2375
- *
2376
- * Se puede usar para mantener movimientos atados al tiempo real si el sketch
2377
- * a menudo cae por debajo de la frecuencia de fotogramas objetivo. Aunque si las frecuencias
2378
- * de fotogramas son consistentemente bajas, considera reducir la frecuencia
2379
- * de fotogramas objetivo.
2380
- * @example
2381
- * q5.dibujar = function () {
2382
- * fondo(0.8);
2383
- * texto(deltaTiempo, -90, 6);
2384
- * };
2385
- * @example
2386
- * let x = -100;
2387
- * q5.dibujar = function () {
2388
- * fondo(0.8);
2389
- * // simular caídas de frecuencia de fotogramas
2390
- * frecuenciaRefresco(aleatorio(30, 60));
2391
- *
2392
- * x += deltaTiempo * 0.2;
2393
- * if (x > 100) x = -100;
2394
- * círculo(x, 0, 20);
2395
- * };
2396
- */
2397
- var deltaTiempo: number;
2398
-
2399
- /** 💻
2400
- * El contexto de renderizado 2D para el lienzo, si se usa el renderizador
2401
- * Canvas2D.
2402
- */
2403
- var contextoDibujo: CanvasRenderingContext2D;
2404
-
2405
- // 🧮 matemáticas
2406
-
2407
- /** 🧮
2408
- * Genera un valor aleatorio.
2409
- *
2410
- * - Si no se proporcionan entradas, devuelve un número entre 0 y 1.
2411
- * - Si se proporciona una entrada numérica, devuelve un número entre 0 y el valor proporcionado.
2412
- * - Si se proporcionan dos entradas numéricas, devuelve un número entre los dos valores.
2413
- * - Si se proporciona un array, devuelve un elemento aleatorio del array.
2414
- * @param {number | any[]} [bajo] límite inferior (inclusivo) o un array
2415
- * @param {number} [alto] límite superior (exclusivo)
2416
- * @returns {number | any} un número o elemento aleatorio
2417
- * @example
2418
- * await Lienzo(200);
2419
- * fondo(0.8);
2420
- * frecuenciaRefresco(5);
2421
- *
2422
- * q5.dibujar = function () {
2423
- * círculo(0, 0, aleatorio(200));
2424
- * };
2425
- * @example
2426
- * q5.dibujar = function () {
2427
- * círculo(aleatorio(-100, 100), aleatorio(-100, 100), 10);
2428
- * };
2429
- */
2430
- function aleatorio(bajo?: number | any[], alto?: number): number | any;
2431
-
2432
- /** 🧮
2433
- * Genera un número aleatorio dentro de un rango simétrico alrededor de cero.
2434
- *
2435
- * Se puede usar para crear un efecto de fluctuación (desplazamiento aleatorio).
2436
- *
2437
- * Equivalente a `aleatorio(-cantidad, cantidad)`.
2438
- * @param {number} cantidad cantidad máxima absoluta de fluctuación, por defecto es 1
2439
- * @returns {number} número aleatorio entre -val y val
2440
- * @example
2441
- * q5.dibujar = function () {
2442
- * círculo(ratónX + flu(3), ratónY + flu(3), 5);
2443
- * };
2444
- * @example
2445
- * await Lienzo(200);
2446
- *
2447
- * q5.dibujar = function () {
2448
- * círculo(flu(50), 0, aleatorio(50));
2449
- * };
2450
- */
2451
- function flu(cantidad: number): number;
2452
-
2453
- /** 🧮
2454
- * Genera un valor de ruido basado en las entradas x, y, y z.
2455
- *
2456
- * Usa [Ruido Perlin](https://es.wikipedia.org/wiki/Ruido_Perlin) por defecto.
2457
- * @param {number} [x] entrada coordenada-x
2458
- * @param {number} [y] entrada coordenada-y
2459
- * @param {number} [z] entrada coordenada-z
2460
- * @returns {number} un valor de ruido
2461
- * @example
2462
- * q5.dibujar = function () {
2463
- * fondo(0.8);
2464
- * let n = ruido(frameCount * 0.01);
2465
- * círculo(0, 0, n * 200);
2466
- * };
2467
- * @example
2468
- * q5.dibujar = function () {
2469
- * fondo(0.8);
2470
- * let t = (frameCount + ratónX) * 0.02;
2471
- * for (let x = -5; x < 220; x += 10) {
2472
- * let n = ruido(t, x * 0.1);
2473
- * círculo(x - 100, 0, n * 40);
2474
- * }
2475
- * };
2476
- * @example
2477
- * q5.dibujar = function () {
2478
- * sinTrazo();
2479
- * let t = millis() * 0.002;
2480
- * for (let x = -100; x < 100; x += 5) {
2481
- * for (let y = -100; y < 100; y += 5) {
2482
- * relleno(ruido(t, (ratónX + x) * 0.05, y * 0.05));
2483
- * cuadrado(x, y, 5);
2484
- * }
2485
- * }
2486
- * };
2487
- */
2488
- function ruido(x?: number, y?: number, z?: number): number;
2489
-
2490
- /** 🧮
2491
- * Calcula la distancia entre dos puntos.
2492
- *
2493
- * Esta función también acepta dos objetos con propiedades `x` e `y`.
2494
- * @param {number} x1 coordenada-x del primer punto
2495
- * @param {number} y1 coordenada-y del primer punto
2496
- * @param {number} x2 coordenada-x del segundo punto
2497
- * @param {number} y2 coordenada-y del segundo punto
2498
- * @returns {number} distancia entre los puntos
2499
- * @example
2500
- * q5.dibujar = function () {
2501
- * fondo(0.8);
2502
- * línea(0, 0, ratónX, ratónY);
2503
- *
2504
- * let d = dist(0, 0, ratónX, ratónY);
2505
- * texto(redondear(d), -80, -80);
2506
- * };
2507
- */
2508
- function dist(x1: number, y1: number, x2: number, y2: number): number;
2509
-
2510
- /** 🧮
2511
- * Mapea un número de un rango a otro.
2512
- * @param {number} val valor entrante a convertir
2513
- * @param {number} inicio1 límite inferior del rango actual del valor
2514
- * @param {number} fin1 límite superior del rango actual del valor
2515
- * @param {number} inicio2 límite inferior del rango objetivo del valor
2516
- * @param {number} fin2 límite superior del rango objetivo del valor
2517
- * @returns {number} valor mapeado
2518
- */
2519
- function mapa(val: number, inicio1: number, fin1: number, inicio2: number, fin2: number): number;
2520
-
2521
- /** 🧮
2522
- * Establece el modo para interpretar y dibujar ángulos. Puede ser 'degrees' (grados) o 'radians' (radianes).
2523
- * @param {'degrees' | 'radians'} modo modo a establecer para la interpretación de ángulos
2524
- */
2525
- function modoÁngulo(modo: 'degrees' | 'radians'): void;
2526
-
2527
- /** 🧮
2528
- * Convierte grados a radianes.
2529
- * @param {number} grados ángulo en grados
2530
- * @returns {number} ángulo en radianes
2531
- */
2532
- function radianes(grados: number): number;
2533
-
2534
- /** 🧮
2535
- * Convierte radianes a grados.
2536
- * @param {number} radianes ángulo en radianes
2537
- * @returns {number} ángulo en grados
2538
- */
2539
- function grados(radianes: number): number;
2540
-
2541
- /** 🧮
2542
- * Calcula un número entre dos números en un incremento específico.
2543
- * @param {number} inicio primer número
2544
- * @param {number} fin segundo número
2545
- * @param {number} cant cantidad a interpolar entre los dos valores
2546
- * @returns {number} número interpolado
2547
- */
2548
- function interpolar(inicio: number, fin: number, cant: number): number;
2549
-
2550
- /** 🧮
2551
- * Restringe un valor entre un valor mínimo y máximo.
2552
- * @param {number} n número a restringir
2553
- * @param {number} bajo límite inferior
2554
- * @param {number} alto límite superior
2555
- * @returns {number} valor restringido
2556
- */
2557
- function constreñir(n: number, bajo: number, alto: number): number;
2558
-
2559
- /** 🧮
2560
- * Normaliza un número de otro rango en un valor entre 0 y 1.
2561
- * @param {number} n número a normalizar
2562
- * @param {number} inicio límite inferior del rango
2563
- * @param {number} fin límite superior del rango
2564
- * @returns {number} número normalizado
2565
- */
2566
- function norm(n: number, inicio: number, fin: number): number;
2567
-
2568
- /** 🧮
2569
- * Calcula la parte fraccionaria de un número.
2570
- * @param {number} n un número
2571
- * @returns {number} parte fraccionaria del número
2572
- */
2573
- function frac(n: number): number;
2574
-
2575
- /** 🧮
2576
- * Calcula el valor absoluto de un número.
2577
- * @param {number} n un número
2578
- * @returns {number} valor absoluto del número
2579
- */
2580
- function abs(n: number): number;
2581
-
2582
- /** 🧮
2583
- * Redondea un número.
2584
- * @param {number} n número a redondear
2585
- * @param {number} [d] número de lugares decimales a redondear
2586
- * @returns {number} número redondeado
2587
- * @example
2588
- * await Lienzo(200, 100);
2589
- * fondo(0.8);
2590
- * tamañoTexto(32);
2591
- * texto(redondear(PI, 5), -90, 10);
2592
- */
2593
- function redondear(n: number, d: number): number;
2594
-
2595
- /** 🧮
2596
- * Redondea un número hacia arriba.
2597
- * @param {number} n un número
2598
- * @returns {number} número redondeado
2599
- * @example
2600
- * await Lienzo(200, 100);
2601
- * fondo(0.8);
2602
- * tamañoTexto(32);
2603
- * texto(techo(PI), -90, 10);
2604
- */
2605
- function techo(n: number): number;
2606
-
2607
- /** 🧮
2608
- * Redondea un número hacia abajo.
2609
- * @param {number} n un número
2610
- * @returns {number} número redondeado
2611
- * @example
2612
- * await Lienzo(200, 100);
2613
- * fondo(0.8);
2614
- * tamañoTexto(32);
2615
- * texto(piso(-PI), -90, 10);
2616
- */
2617
- function piso(n: number): number;
2618
-
2619
- /** 🧮
2620
- * Devuelve el valor más pequeño en una secuencia de números.
2621
- * @param {...number} args números a comparar
2622
- * @returns {number} mínimo
2623
- * @example
2624
- * q5.dibujar = function () {
2625
- * fondo(min(-ratónX / 100, 0.5));
2626
- * círculo(min(ratónX, 0), 0, 80);
2627
- * };
2628
- */
2629
- function min(...args: number[]): number;
2630
-
2631
- /** 🧮
2632
- * Devuelve el valor más grande en una secuencia de números.
2633
- * @param {...number} args números a comparar
2634
- * @returns {number} máximo
2635
- * @example
2636
- * q5.dibujar = function () {
2637
- * fondo(max(-ratónX / 100, 0.5));
2638
- * círculo(max(ratónX, 0), 0, 80);
2639
- * };
2640
- */
2641
- function max(...args: number[]): number;
2642
-
2643
- /** 🧮
2644
- * Calcula el valor de una base elevada a una potencia.
2645
- *
2646
- * Por ejemplo, `pot(2, 3)` calcula 2 _ 2 _ 2 que es 8.
2647
- * @param {number} base base
2648
- * @param {number} exponente exponente
2649
- * @returns {number} base elevada a la potencia del exponente
2650
- */
2651
- function pot(base: number, exponente: number): number;
2652
-
2653
- /** 🧮
2654
- * Calcula el cuadrado de un número.
2655
- * @param {number} n número a elevar al cuadrado
2656
- * @returns {number} cuadrado del número
2657
- */
2658
- function cuad(n: number): number;
2659
-
2660
- /** 🧮
2661
- * Calcula la raíz cuadrada de un número.
2662
- * @param {number} n un número
2663
- * @returns {number} raíz cuadrada del número
2664
- */
2665
- function raiz(n: number): number;
2666
-
2667
- /** 🧮
2668
- * Calcula el logaritmo natural (base e) de un número.
2669
- * @param {number} n un número
2670
- * @returns {number} logaritmo natural del número
2671
- */
2672
- function loge(n: number): number;
2673
-
2674
- /** 🧮
2675
- * Calcula e elevado a la potencia de un número.
2676
- * @param {number} exponente potencia a la que elevar e
2677
- * @returns {number} e elevado a la potencia del exponente
2678
- */
2679
- function exp(exponente: number): number;
2680
-
2681
- /** 🧮
2682
- * Establece la semilla para el generador de números aleatorios.
2683
- * @param {number} semilla valor de la semilla
2684
- */
2685
- function semillaAleatoria(semilla: number): void;
2686
-
2687
- /** 🧮
2688
- * Establece el método de generación de números aleatorios.
2689
- * @param {any} metodo método a usar para la generación de números aleatorios
2690
- */
2691
- function generadorAleatorio(metodo: any): void;
2692
-
2693
- /** 🧮
2694
- * Genera un número aleatorio siguiendo una distribución Gaussiana (normal).
2695
- * @param {number} media media (centro) de la distribución
2696
- * @param {number} std desviación estándar (dispersión o "ancho") de la distribución
2697
- * @returns {number} un número aleatorio siguiendo una distribución Gaussiana
2698
- */
2699
- function aleatorioGaussiano(media: number, std: number): number;
2700
-
2701
- /** 🧮
2702
- * Genera un número aleatorio siguiendo una distribución exponencial.
2703
- * @returns {number} un número aleatorio siguiendo una distribución exponencial
2704
- */
2705
- function aleatorioExponencial(): number;
2706
-
2707
- /** 🧮
2708
- * Establece el modo de generación de ruido.
2709
- *
2710
- * Solo el modo por defecto, "perlin", está incluido en q5.js. El uso de los
2711
- * otros modos requiere el módulo q5-noiser.
2712
- * @param {'perlin' | 'simplex' | 'blocky'} modo modo de generación de ruido
2713
- */
2714
- function modoRuido(modo: 'perlin' | 'simplex' | 'blocky'): void;
2715
-
2716
- /** 🧮
2717
- * Establece el valor de la semilla para la generación de ruido.
2718
- * @param {number} semilla valor de la semilla
2719
- */
2720
- function semillaRuido(semilla: number): void;
2721
-
2722
- /** 🧮
2723
- * Establece el nivel de detalle para la generación de ruido.
2724
- * @param {number} lod nivel de detalle (número de octavas)
2725
- * @param {number} caida tasa de caída para cada octava
2726
- */
2727
- function detalleRuido(lod: number, caida: number): void;
2728
-
2729
- /** 🧮
2730
- * La relación de la circunferencia de un círculo a su diámetro.
2731
- * Aproximadamente 3.14159.
2732
- */
2733
- const DOS_PI: number;
2734
-
2735
- /** 🧮
2736
- * 2 \* PI.
2737
- * Aproximadamente 6.28319.
2738
- */
2739
- const DOS_PI: number;
2740
-
2741
- /** 🧮
2742
- * 2 \* PI.
2743
- * Aproximadamente 6.28319.
2744
- */
2745
- function TAU(): void;
2746
-
2747
- /** 🧮
2748
- * Mitad de PI.
2749
- * Aproximadamente 1.5708.
2750
- */
2751
- const MEDIO_PI: number;
2752
-
2753
- /** 🧮
2754
- * Un cuarto de PI.
2755
- * Aproximadamente 0.7854.
2756
- */
2757
- const CUARTO_PI: number;
2758
-
2759
- // 🔊 sonido
2760
-
2761
- /**
2762
- * q5 incluye reproducción de sonido de baja latencia y capacidades básicas de mezcla
2763
- * impulsadas por WebAudio.
2764
- *
2765
- * Para filtrado de audio, síntesis y análisis, considera usar el
2766
- * addon [p5.sound](https://p5js.org/reference/p5.sound/) con q5.
2767
- */
2768
-
2769
- /** 🔊
2770
- * Carga datos de audio desde un archivo y devuelve un objeto `Sonido`.
2771
- *
2772
- * Usa funciones como `reproducir`, `pausar`, y `detener` para
2773
- * controlar la reproducción. ¡Ten en cuenta que los sonidos solo pueden reproducirse después de la
2774
- * primera interacción del usuario con la página!
2775
- *
2776
- * Establece `volumen` a un valor entre 0 (silencio) y 1 (volumen completo).
2777
- * Establece `pan` a un valor entre -1 (izquierda) y 1 (derecha) para ajustar
2778
- * la posición estéreo del sonido. Establece `bucle` a true para repetir el sonido.
2779
- *
2780
- * Usa `cargado`, `pausado`, y `terminado` para comprobar el estado del sonido.
2781
- *
2782
- * El archivo de sonido completo debe cargarse antes de que la reproducción pueda comenzar, usa `await` para esperar a que un sonido se cargue. Para transmitir archivos de audio más grandes usa la función `cargarAudio` en su lugar.
2783
- * @param {string} url archivo de sonido
2784
- * @returns {Sonido & PromiseLike<Sonido>} sonido
2785
- * @example
2786
- * await Lienzo(200);
2787
- *
2788
- * let sonido = cargarSonido('/assets/jump.wav');
2789
- * sonido.volumen = 0.3;
2790
- *
2791
- * q5.alPresionarRatón = function () {
2792
- * sonido.reproducir();
2793
- * };
2794
- */
2795
- function cargarSonido(url: string): Sonido & PromiseLike<Sonido>;
2796
-
2797
- /** 🔊
2798
- * Carga datos de audio desde un archivo y devuelve un [HTMLAudioElement](https://developer.mozilla.org/docs/Web/API/HTMLMediaElement).
2799
- *
2800
- * El audio se considera cargado cuando se dispara el [evento canplaythrough](https://developer.mozilla.org/docs/Web/API/HTMLMediaElement/canplaythrough_event).
2801
- *
2802
- * ¡Ten en cuenta que el audio solo puede reproducirse después de la primera interacción
2803
- * del usuario con la página!
2804
- * @param url archivo de audio
2805
- * @returns {HTMLAudioElement & PromiseLike<HTMLAudioElement>} un HTMLAudioElement
2806
- * @example
2807
- * await Lienzo(200);
2808
- *
2809
- * let audio = cargarAudio('/assets/retro.flac');
2810
- * audio.volume = 0.4;
2811
- *
2812
- * q5.alPresionarRatón = function () {
2813
- * audio.play();
2814
- * };
2815
- */
2816
- function cargarAudio(url: string): HTMLAudioElement & PromiseLike<HTMLAudioElement>;
2817
-
2818
- /** 🔊
2819
- * Devuelve el AudioContext en uso o undefined si no existe.
2820
- * @returns {AudioContext} instancia de AudioContext
2821
- */
2822
- function obtenerContextoAudio(): AudioContext | void;
2823
-
2824
- /** 🔊
2825
- * Crea un nuevo AudioContext o lo reanuda si estaba suspendido.
2826
- * @returns {Promise<void>} una promesa que se resuelve cuando el AudioContext se reanuda
2827
- */
2828
- function iniciarAudioUsuario(): Promise<void>;
2829
-
2830
- class Sonido {
2831
-
2832
- /** 🔊
2833
- * Crea un nuevo objeto `Q5.Sonido`.
2834
- */
2835
- constructor();
2836
-
2837
- /** 🔊
2838
- * Establece el volumen del sonido a un valor entre
2839
- * 0 (silencio) y 1 (volumen completo).
2840
- */
2841
- volumen: number;
2842
-
2843
- /** 🔊
2844
- * Establece la posición estéreo del sonido entre -1 (izquierda) y 1 (derecha).
2845
- */
2846
- pan: number;
2847
-
2848
- /** 🔊
2849
- * Establece a true para hacer que el sonido se repita continuamente.
2850
- */
2851
- bucle: boolean;
2852
-
2853
- /** 🔊
2854
- * Verdadero si los datos de sonido han terminado de cargarse.
2855
- */
2856
- cargado: boolean;
2857
-
2858
- /** 🔊
2859
- * Verdadero si el sonido está actualmente pausado.
2860
- */
2861
- pausado: boolean;
2862
-
2863
- /** 🔊
2864
- * Verdadero si el sonido ha terminado de reproducirse.
2865
- */
2866
- terminado: boolean;
2867
-
2868
- /** 🔊
2869
- * Reproduce el sonido.
2870
- *
2871
- * Si esta función se ejecuta cuando el sonido ya se está reproduciendo,
2872
- * comenzará una nueva reproducción, causando un efecto de capas.
2873
- *
2874
- * Si esta función se ejecuta cuando el sonido está pausado,
2875
- * todas las instancias de reproducción se reanudarán.
2876
- *
2877
- * Usa `await` para esperar a que el sonido termine de reproducirse.
2878
- * @returns {Promise<void>} una promesa que se resuelve cuando el sonido termina de reproducirse
2879
- */
2880
- reproducir(): void;
2881
-
2882
- /** 🔊
2883
- * Pausa el sonido, permitiendo que sea reanudado.
2884
- */
2885
- pausar(): void;
2886
-
2887
- /** 🔊
2888
- * Detiene el sonido, reiniciando su posición de reproducción
2889
- * al principio.
2890
- *
2891
- * Elimina todas las instancias de reproducción.
2892
- */
2893
- detener(): void;
2894
- }
2895
-
2896
- // 📑 dom
2897
-
2898
- /**
2899
- * El Modelo de Objetos del Documento (DOM) es una interfaz para
2900
- * crear y editar páginas web con JavaScript.
2901
- */
2902
-
2903
- /** 📑
2904
- * Crea un nuevo elemento HTML y lo añade a la página. `createEl` es
2905
- * un alias.
2906
- *
2907
- * Modifica el [`style`](https://developer.mozilla.org/docs/Web/API/HTMLElement/style) CSS del elemento para cambiar su apariencia.
2908
- *
2909
- * Usa [`addEventListener`](https://developer.mozilla.org/docs/Web/API/EventTarget/addEventListener) para responder a eventos como:
2910
- *
2911
- * - "click": cuando se hace clic en el elemento
2912
- * - "mouseover": cuando el ratón pasa sobre el elemento
2913
- * - "mouseout": cuando el ratón deja de pasar sobre el elemento
2914
- * - "input": cuando el valor de un elemento de formulario cambia
2915
- *
2916
- * q5 añade alguna funcionalidad extra a los elementos que crea:
2917
- *
2918
- * - la función `position` facilita colocar el elemento
2919
- * relativo al lienzo
2920
- * - la función `size` establece el ancho y alto del elemento
2921
- * - alternativamente, usa las propiedades `x`, `y`, `width`, y `height` del elemento
2922
- * @param {string} etiqueta nombre de la etiqueta del elemento
2923
- * @param {string} [contenido] contenido del elemento
2924
- * @returns {HTMLElement} elemento
2925
- * @example
2926
- * await Lienzo(200);
2927
- *
2928
- * let el = crearElemento('div', '*');
2929
- * el.position(50, 50);
2930
- * el.size(100, 100);
2931
- * el.style.fontSize = '136px';
2932
- * el.style.textAlign = 'center';
2933
- * el.style.backgroundColor = 'blue';
2934
- * el.style.color = 'white';
2935
- */
2936
- function crearElemento(etiqueta: string, contenido?: string): HTMLElement;
2937
-
2938
- /** 📑
2939
- * Crea un elemento de enlace.
2940
- * @param {string} href url
2941
- * @param {string} [texto] contenido de texto
2942
- * @param {boolean} [nuevaPestaña] si abrir el enlace en una nueva pestaña
2943
- * @example
2944
- * await Lienzo(200);
2945
- *
2946
- * let enlace = crearA('https://q5js.org', 'q5.js');
2947
- * enlace.position(16, 42);
2948
- * enlace.style.fontSize = '80px';
2949
- *
2950
- * enlace.addEventListener('mouseover', () => {
2951
- * fondo('cyan');
2952
- * });
2953
- */
2954
- function crearA(href: string, texto?: string): HTMLAnchorElement;
2955
-
2956
- /** 📑
2957
- * Crea un elemento de botón.
2958
- * @param {string} [contenido] contenido de texto
2959
- * @example
2960
- * await Lienzo(200, 100);
2961
- *
2962
- * let btn = crearBotón('¡Clic aqui!');
2963
- *
2964
- * btn.addEventListener('click', () => {
2965
- * fondo(aleatorio(0.4, 1));
2966
- * });
2967
- */
2968
- function crearBotón(contenido?: string): HTMLButtonElement;
2969
-
2970
- /** 📑
2971
- * Crea un elemento de casilla de verificación (checkbox).
2972
- *
2973
- * Usa la propiedad `checked` para obtener o establecer el estado de la casilla.
2974
- *
2975
- * La propiedad `label` es el elemento de etiqueta de texto junto a la casilla.
2976
- * @param {string} [etiqueta] etiqueta de texto colocada junto a la casilla
2977
- * @param {boolean} [marcado] estado inicial
2978
- * @example
2979
- * await Lienzo(200, 100);
2980
- *
2981
- * let casilla = crearCasilla('¡Marca aquí!');
2982
- * casilla.label.style.color = 'lime';
2983
- *
2984
- * casilla.addEventListener('input', () => {
2985
- * if (casilla.checked) fondo('lime');
2986
- * else fondo('black');
2987
- * });
2988
- */
2989
- function crearCasilla(etiqueta?: string, marcado?: boolean): HTMLInputElement;
2990
-
2991
- /** 📑
2992
- * Crea un elemento de entrada de color.
2993
- *
2994
- * Usa la propiedad `value` para obtener o establecer el valor del color.
2995
- * @param {string} [valor] valor de color inicial
2996
- * @example
2997
- * await Lienzo(200, 100);
2998
- *
2999
- * let selección = crearSelectorColor();
3000
- * selección.value = '#fd7575';
3001
- *
3002
- * q5.dibujar = function () {
3003
- * fondo(selección.value);
3004
- * };
3005
- */
3006
- function crearSelectorColor(valor?: string): HTMLInputElement;
3007
-
3008
- /** 📑
3009
- * Crea un elemento de imagen.
3010
- * @param {string} src url de la imagen
3011
- * @example
3012
- * await Lienzo(200, 100);
3013
- *
3014
- * let img = crearImg('/assets/p5play_logo.webp');
3015
- * img.position(0, 0).size(100, 100);
3016
- */
3017
- function crearImg(src: string): HTMLImageElement;
3018
-
3019
- /** 📑
3020
- * Crea un elemento de entrada (input).
3021
- *
3022
- * Usa la propiedad `value` para obtener o establecer el valor de la entrada.
3023
- *
3024
- * Usa la propiedad `placeholder` para establecer el texto de etiqueta que aparece
3025
- * dentro de la entrada cuando está vacía.
3026
- *
3027
- * Mira la [documentación de input](https://developer.mozilla.org/docs/Web/HTML/Element/input#input_types) de MDN para la lista completa de tipos de entrada.
3028
- * @param {string} [valor] valor inicial
3029
- * @param {string} [tipo] tipo de entrada de texto, puede ser 'text', 'password', 'email', 'number', 'range', 'search', 'tel', 'url'
3030
- * @example
3031
- * await Lienzo(200, 100);
3032
- * tamañoTexto(64);
3033
- *
3034
- * let entrada = crearEntrada();
3035
- * entrada.placeholder = '¡Teclea aquí!';
3036
- * entrada.size(200, 32);
3037
- *
3038
- * entrada.addEventListener('input', () => {
3039
- * fondo('orange');
3040
- * texto(entrada.value, -90, 30);
3041
- * });
3042
- */
3043
- function crearEntrada(valor?: string, tipo?: string): HTMLInputElement;
3044
-
3045
- /** 📑
3046
- * Crea un elemento de párrafo.
3047
- * @param {string} [contenido] contenido de texto
3048
- * @example
3049
- * await Lienzo(200, 50);
3050
- * fondo('coral');
3051
- *
3052
- * let p = crearP('¡Hola, mundo!');
3053
- * p.style.color = 'pink';
3054
- */
3055
- function crearP(contenido?: string): HTMLParagraphElement;
3056
-
3057
- /** 📑
3058
- * Crea un grupo de botones de radio.
3059
- *
3060
- * Usa la función `option(etiqueta, valor)` para añadir nuevos botones de radio
3061
- * al grupo.
3062
- *
3063
- * Usa la propiedad `value` para obtener o establecer el valor del botón de radio seleccionado.
3064
- * @param {string} [nombreGrupo]
3065
- * @example
3066
- * await Lienzo(200, 160);
3067
- *
3068
- * let radio = crearOpciónes();
3069
- * radio.option('cuadrado', '1').option('círculo', '2');
3070
- *
3071
- * q5.dibujar = function () {
3072
- * fondo(0.8);
3073
- * if (radio.value == '1') cuadrado(-40, -40, 80);
3074
- * if (radio.value == '2') círculo(0, 0, 80);
3075
- * };
3076
- */
3077
- function crearOpciónes(nombreGrupo?: string): HTMLDivElement;
3078
-
3079
- /** 📑
3080
- * Crea un elemento de selección (select).
3081
- *
3082
- * Usa la función `option(etiqueta, valor)` para añadir nuevas opciones al
3083
- * elemento de selección.
3084
- *
3085
- * Establece `multiple` a `true` para permitir seleccionar múltiples opciones.
3086
- *
3087
- * Usa la propiedad `value` para obtener o establecer el valor de la opción seleccionada.
3088
- *
3089
- * Usa la propiedad `selected` para obtener las etiquetas de las opciones
3090
- * seleccionadas o establecer las opciones seleccionadas por etiqueta. Puede ser una sola
3091
- * cadena o un array de cadenas.
3092
- * @param {string} [placeholder] texto opcional que aparece antes de que se seleccione una opción
3093
- * @example
3094
- * await Lienzo(200, 100);
3095
- *
3096
- * let sel = crearSelección('Seleccionar un opcion');
3097
- * sel.option('Red', '#f55').option('Green', '#5f5');
3098
- *
3099
- * sel.addEventListener('change', () => {
3100
- * fondo(sel.value);
3101
- * });
3102
- */
3103
- function crearSelección(placeholder?: string): HTMLSelectElement;
3104
-
3105
- /** 📑
3106
- * Crea un elemento deslizador (slider).
3107
- *
3108
- * Usa la propiedad `value` para obtener o establecer el valor del deslizador.
3109
- *
3110
- * Usa la función `val` para obtener el valor del deslizador como un número.
3111
- * @param {number} min valor mínimo
3112
- * @param {number} max valor máximo
3113
- * @param {number} [valor] valor inicial
3114
- * @param {number} [paso] tamaño del paso
3115
- * @example
3116
- * await Lienzo(200);
3117
- *
3118
- * let deslizador = crearDeslizador(0, 1, 0.5, 0.1);
3119
- * deslizador.position(10, 10).size(180);
3120
- *
3121
- * q5.dibujar = function () {
3122
- * fondo(deslizador.val());
3123
- * };
3124
- */
3125
- function crearDeslizador(min: number, max: number, valor?: number, paso?: number): HTMLInputElement;
3126
-
3127
- /** 📑
3128
- * Crea un elemento de video.
3129
- *
3130
- * Ten en cuenta que los videos deben estar silenciados para reproducirse automáticamente y las funciones `play` y
3131
- * `pause` solo pueden ejecutarse después de una interacción del usuario.
3132
- *
3133
- * El elemento de video puede ocultarse y su contenido puede
3134
- * mostrarse en el lienzo usando la función `imagen`.
3135
- * @param {string} src url del video
3136
- * @returns {HTMLVideoElement & PromiseLike<HTMLVideoElement>} un nuevo elemento de video
3137
- * @example
3138
- * await Lienzo(1);
3139
- *
3140
- * let vid = crearVideo('/assets/apollo4.mp4');
3141
- * vid.size(200, 150);
3142
- * vid.autoplay = vid.muted = vid.loop = true;
3143
- * vid.controls = true;
3144
- * @example
3145
- * await Lienzo(200, 150);
3146
- * let vid = crearVideo('/assets/apollo4.mp4');
3147
- * vid.hide();
3148
- *
3149
- * q5.alPresionarRatón = function () {
3150
- * vid.currentTime = 0;
3151
- * vid.play();
3152
- * };
3153
- * q5.dibujar = function () {
3154
- * imagen(vid, -100, -75, 200, 150);
3155
- * // filtro(HUE_ROTATE, 90);
3156
- * };
3157
- */
3158
- function crearVideo(src: string): HTMLVideoElement & PromiseLike<HTMLVideoElement>;
3159
-
3160
- /** 📑
3161
- * Crea una captura desde una cámara conectada, como una webcam.
3162
- *
3163
- * El elemento de video de captura puede ocultarse y su contenido puede
3164
- * mostrarse en el lienzo usando la función `imagen`.
3165
- *
3166
- * Puede precargarse para asegurar que la captura esté lista para usar cuando tu
3167
- * sketch comience.
3168
- *
3169
- * Solicita la resolución de video más alta de la cámara frontal del usuario
3170
- * por defecto. El primer parámetro de esta función se puede usar para
3171
- * especificar las restricciones para la captura. Mira [`getUserMedia`](https://developer.mozilla.org/docs/Web/API/MediaDevices/getUserMedia)
3172
- * para más información.
3173
- * @param {string} [tipo] tipo de captura, puede ser solo `VIDEO` o solo `AUDIO`, el defecto es usar ambos video y audio
3174
- * @param {boolean} [volteado] si reflejar el video verticalmente, true por defecto
3175
- * @returns {HTMLVideoElement & PromiseLike<HTMLVideoElement>} un nuevo elemento de video
3176
- * @example
3177
- * q5.alPresionarRatón = function () {
3178
- * let cap = crearCaptura(VIDEO);
3179
- * cap.size(200, 112.5);
3180
- * canvas.remove();
3181
- * };
3182
- * @example
3183
- * let cap;
3184
- * q5.alPresionarRatón = function () {
3185
- * cap = crearCaptura(VIDEO);
3186
- * cap.hide();
3187
- * };
3188
- *
3189
- * q5.dibujar = function () {
3190
- * let y = (frameCount % 200) - 100;
3191
- * imagen(cap, -100, y, 200, 200);
3192
- * };
3193
- * @example
3194
- * q5.alPresionarRatón = function () {
3195
- * let cap = crearCaptura({
3196
- * video: { width: 640, height: 480 }
3197
- * });
3198
- * cap.size(200, 150);
3199
- * canvas.remove();
3200
- * };
3201
- */
3202
- function crearCaptura(tipo?: string, volteado?: boolean): HTMLVideoElement & PromiseLike<HTMLVideoElement>;
3203
-
3204
- /** 📑
3205
- * Encuentra el primer elemento en el DOM que coincide con el [selector CSS](https://developer.mozilla.org/docs/Learn_web_development/Core/Styling_basics/Basic_selectors) dado.
3206
- * @param {string} selector
3207
- * @returns {HTMLElement} elemento
3208
- */
3209
- function encontrarElemento(selector: string): HTMLElement;
3210
-
3211
- /** 📑
3212
- * Encuentra todos los elementos en el DOM que coinciden con el [selector CSS](https://developer.mozilla.org/docs/Learn_web_development/Core/Styling_basics/Basic_selectors) dado.
3213
- * @param {string} selector
3214
- * @returns {HTMLElement[]} elementos
3215
- */
3216
- function encontrarElementos(selector: string): HTMLElement[];
3217
-
3218
- // 🎞 grabación
3219
-
3220
- /** 🎞
3221
- * Crea una grabadora. ¡Simplemente presiona grabar para empezar a grabar!
3222
- *
3223
- * Las siguientes propiedades se pueden establecer a través de la UI de la grabadora o
3224
- * programáticamente.
3225
- *
3226
- * - `format` se establece a "H.264" por defecto.
3227
- * - `bitrate` es un número en megabits por segundo (mbps). Su valor por defecto
3228
- * está determinado por la altura del lienzo. Aumentar la
3229
- * tasa de bits aumentará la calidad y el tamaño del archivo de la grabación.
3230
- * - `captureAudio` se establece a true por defecto. Establecer a false para deshabilitar
3231
- * la grabación de audio.
3232
- *
3233
- * Ten en cuenta que las grabaciones se hacen a una tasa de fotogramas variable (VFR), lo que
3234
- * hace que el video de salida sea incompatible con algún software de edición.
3235
- * Para más información, mira la página wiki
3236
- * ["Recording the Canvas"](https://github.com/q5js/q5.js/wiki/Recording-the-Canvas).
3237
- * @returns {HTMLElement} una grabadora, elemento DOM de q5
3238
- * @example
3239
- * await Lienzo(200);
3240
- *
3241
- * let grab = crearGrabadora();
3242
- * grab.bitrate = 10;
3243
- *
3244
- * q5.dibujar = function () {
3245
- * círculo(ratónX, flu(medioAlto), 10);
3246
- * };
3247
- */
3248
- function crearGrabadora(): HTMLElement;
3249
-
3250
- /** 🎞
3251
- * Comienza a grabar el lienzo o reanuda la grabación si estaba pausada.
3252
- *
3253
- * Si no existe grabadora, se crea una pero no se muestra.
3254
- */
3255
- function grabar(): void;
3256
-
3257
- /** 🎞
3258
- * Pausa la grabación del lienzo, si hay una en progreso.
3259
- */
3260
- function pausarGrabación(): void;
3261
-
3262
- /** 🎞
3263
- * Descarta la grabación actual.
3264
- */
3265
- function borrarGrabación(): void;
3266
-
3267
- /** 🎞
3268
- * Guarda la grabación actual como un archivo de video.
3269
- * @param {string} nombreArchivo
3270
- * @example
3271
- * q5.dibujar = function () {
3272
- * cuadrado(ratónX, flu(100), 10);
3273
- * };
3274
- *
3275
- * q5.alPresionarRatón = function () {
3276
- * if (!grabando) grabar();
3277
- * else guardarGrabación('squares');
3278
- * };
3279
- */
3280
- function guardarGrabación(nombreArchivo: string): void;
3281
-
3282
- /** 🎞
3283
- * Verdadero si el lienzo está siendo grabado actualmente.
3284
- */
3285
- var grabando: boolean;
3286
-
3287
- // 🛠 utilidades
3288
-
3289
- /** 🛠
3290
- * Carga un archivo o múltiples archivos.
3291
- *
3292
- * El tipo de archivo se determina por la extensión del archivo. q5 soporta cargar
3293
- * archivos de texto, json, csv, fuente, audio, e imagen.
3294
- *
3295
- * Por defecto, los recursos se cargan en paralelo antes de que q5 ejecute `dibujar`. Usa `await` para esperar a que los recursos se carguen.
3296
- * @param {...string} urls
3297
- * @returns {Promise<any[]>} una promesa que se resuelve con objetos
3298
- * @example
3299
- * await Lienzo(200);
3300
- *
3301
- * let logo = cargar('/q5js_logo.avif');
3302
- *
3303
- * q5.dibujar = function () {
3304
- * imagen(logo, -100, -100, 200, 200);
3305
- * };
3306
- * @example
3307
- * await Lienzo(200);
3308
- * fondo(0.8);
3309
- *
3310
- * await cargar('/assets/Robotica.ttf');
3311
- *
3312
- * tamañoTexto(28);
3313
- * texto('Hello, world!', -97, 100);
3314
- * @example
3315
- * await Lienzo(200);
3316
- *
3317
- * let [salto, retro] = await cargar('/assets/jump.wav', '/assets/retro.flac');
3318
- *
3319
- * q5.alPresionarRatón = function () {
3320
- * botónRatón == 'left' ? salto.reproducir() : retro.reproducir();
3321
- * };
3322
- * @example
3323
- * await Lienzo(200);
3324
- * fondo(0.8);
3325
- * tamañoTexto(32);
3326
- *
3327
- * let miXML = await cargar('/assets/animals.xml');
3328
- * let mamiferos = miXML.getElementsByTagName('mammal');
3329
- * let y = -100;
3330
- * for (let mamifero of mamiferos) {
3331
- * texto(mamifero.textContent, -100, (y += 32));
3332
- * }
3333
- */
3334
- function cargar(...urls: string[]): PromiseLike<any[]>;
3335
-
3336
- /** 🛠
3337
- * Guarda datos en un archivo.
3338
- *
3339
- * Si no se especifican datos, se guardará el lienzo.
3340
- *
3341
- * Si no se proporcionan argumentos, el lienzo se guardará como
3342
- * un archivo de imagen llamado "untitled.png".
3343
- * @param {object} [datos] lienzo, imagen, u objeto JS
3344
- * @param {string} [nombreArchivo] nombre de archivo para guardar como
3345
- * @example
3346
- * await Lienzo(200);
3347
- * fondo(0.8);
3348
- * círculo(0, 0, 50);
3349
- *
3350
- * q5.alPresionarRatón = function () {
3351
- * guardar('circle.png');
3352
- * };
3353
- * @example
3354
- * await Lienzo(200);
3355
- * fondo(0.8);
3356
- * texto('save me?', -90, 0);
3357
- * tamañoTexto(180);
3358
- * let rayo = crearImagenTexto('⚡️');
3359
- *
3360
- * q5.alPresionarRatón = function () {
3361
- * guardar(rayo, 'bolt.png');
3362
- * };
3363
- */
3364
- function guardar(datos?: object, nombreArchivo?: string): void;
3365
-
3366
- /** 🛠
3367
- * Carga un archivo de texto desde la url especificada.
3368
- *
3369
- * Se recomienda usar `await` para obtener el texto cargado como una cadena.
3370
- * @param {string} url archivo de texto
3371
- * @returns {object & PromiseLike<string>} un objeto conteniendo el texto cargado en la propiedad `obj.text` o usa `await` para obtener la cadena de texto directamente
3372
- */
3373
- function cargarTexto(url: string): object & PromiseLike<string>;
3374
-
3375
- /** 🛠
3376
- * Carga un archivo JSON desde la url especificada.
3377
- *
3378
- * Se recomienda usar `await` para obtener el objeto o array JSON cargado.
3379
- * @param {string} url archivo JSON
3380
- * @returns {any & PromiseLike<any>} un objeto o array conteniendo el JSON cargado
3381
- */
3382
- function cargarJSON(url: string): any & PromiseLike<any>;
3383
-
3384
- /** 🛠
3385
- * Carga un archivo CSV desde la url especificada.
3386
- *
3387
- * Se recomienda usar `await` para obtener el CSV cargado como un array de objetos.
3388
- * @param {string} url archivo CSV
3389
- * @returns {object[] & PromiseLike<object[]>} un array de objetos conteniendo el CSV cargado
3390
- */
3391
- function cargarCSV(url: string): object[] & PromiseLike<object[]>;
3392
-
3393
- /** 🛠
3394
- * Carga un archivo xml desde la url especificada.
3395
- *
3396
- * Se recomienda usar `await` para obtener el Elemento XML cargado.
3397
- * @param {string} url archivo xml
3398
- * @returns {Element & PromiseLike<Element>} un objeto conteniendo el Elemento XML cargado en una propiedad llamada `obj.DOM` o usa await para obtener el Elemento XML directamente
3399
- * @example
3400
- * await Lienzo(200);
3401
- * fondo(200);
3402
- * tamañoTexto(32);
3403
- *
3404
- * let animales = await cargarXML('/assets/animals.xml');
3405
- *
3406
- * let mamiferos = animales.getElementsByTagName('mammal');
3407
- * let y = 64;
3408
- * for (let mamifero of mamiferos) {
3409
- * texto(mamifero.textContent, 20, (y += 32));
3410
- * }
3411
- */
3412
- function cargarXML(url: string): object & PromiseLike<Element>;
3413
-
3414
- /** 🛠
3415
- * Espera a que cualquier recurso que comenzó a cargarse termine de cargarse. Por defecto q5 ejecuta esto antes de hacer bucle en dibujar (lo cual se llama precarga), pero se puede usar incluso después de que dibujar comience a hacer bucle.
3416
- * @returns {PromiseLike<any[]>} una promesa que se resuelve con objetos cargados
3417
- */
3418
- function cargarTodo(): PromiseLike<any[]>;
3419
-
3420
- /** 🛠
3421
- * Deshabilita la precarga automática de recursos antes de que dibujar comience a hacer bucle. Esto permite que dibujar comience inmediatamente, y los recursos se pueden cargar perezosamente o se puede usar `cargarTodo()` para esperar a que los recursos terminen de cargarse más tarde.
3422
- */
3423
- function deshabilitarPrecarga(): void;
3424
-
3425
- /** 🛠
3426
- * nf es la abreviatura de formato de número. Formatea un número
3427
- * a una cadena con un número especificado de dígitos.
3428
- * @param {number} num número a formatear
3429
- * @param {number} digitos número de dígitos a formatear
3430
- * @returns {string} número formateado
3431
- * @example
3432
- * await Lienzo(200, 100);
3433
- * fondo(0.8);
3434
- *
3435
- * tamañoTexto(32);
3436
- * texto(nf(PI, 4, 5), -90, 10);
3437
- */
3438
- function nf(num: number, digitos: number): string;
3439
-
3440
- /** 🛠
3441
- * Baraja los elementos de un array.
3442
- * @param {any[]} arr array a barajar
3443
- * @param {boolean} [modificar] si modificar el array original, falso por defecto lo cual copia el array antes de barajar
3444
- * @returns {any[]} array barajado
3445
- */
3446
- function barajar(arr: any[]): any[];
3447
-
3448
- /** 🛠
3449
- * Almacena un ítem en localStorage.
3450
- * @param {string} clave clave bajo la cual almacenar el ítem
3451
- * @param {string} val valor a almacenar
3452
- */
3453
- function guardarItem(clave: string, val: string): void;
3454
-
3455
- /** 🛠
3456
- * Recupera un ítem de localStorage.
3457
- * @param {string} clave clave del ítem a recuperar
3458
- * @returns {string} valor del ítem recuperado
3459
- */
3460
- function obtenerItem(clave: string): string;
3461
-
3462
- /** 🛠
3463
- * Elimina un ítem de localStorage.
3464
- * @param {string} clave clave del ítem a eliminar
3465
- */
3466
- function eliminarItem(clave: string): void;
3467
-
3468
- /** 🛠
3469
- * Limpia todos los ítems de localStorage.
3470
- */
3471
- function limpiarAlmacenamiento(): void;
3472
-
3473
- /** 🛠
3474
- * Devuelve el año actual.
3475
- * @returns {number} año actual
3476
- */
3477
- function año(): number;
3478
-
3479
- /** 🛠
3480
- * Devuelve el día actual del mes.
3481
- * @returns {number} día actual
3482
- */
3483
- function día(): number;
3484
-
3485
- /** 🛠
3486
- * Devuelve la hora actual.
3487
- * @returns {number} hora actual
3488
- */
3489
- function hora(): number;
3490
-
3491
- /** 🛠
3492
- * Devuelve el minuto actual.
3493
- * @returns {number} minuto actual
3494
- */
3495
- function minuto(): number;
3496
-
3497
- /** 🛠
3498
- * Devuelve el segundo actual.
3499
- * @returns {number} segundo actual
3500
- */
3501
- function segundo(): number;
3502
-
3503
- // ↗ vector
3504
-
3505
- /** ↗
3506
- * Crea un nuevo objeto Vector.
3507
- * @param {number} [x] componente x del vector
3508
- * @param {number} [y] componente y del vector
3509
- * @param {number} [z] componente z del vector
3510
- * @param {number} [w] componente w del vector
3511
- * @returns {Vector} nuevo objeto Vector
3512
- * @example
3513
- * await Lienzo(200);
3514
- * fondo(0.8);
3515
- *
3516
- * let v = crearVector(0, 0);
3517
- * círculo(v.x, v.y, 50);
3518
- */
3519
- function crearVector(): void;
3520
-
3521
- class Vector {
3522
-
3523
- /** ↗
3524
- * Una clase para describir un vector bidimensional o tridimensional, específicamente un vector euclidiano (también conocido como geométrico). Un vector es una entidad que tiene tanto magnitud como dirección. El tipo de datos almacena los componentes del vector (x, y para 2D, y z para 3D). La magnitud y dirección se pueden acceder a través de los métodos `mag()` y `heading()`.
3525
- */
3526
- constructor(x: number, y: number, z?: number);
3527
-
3528
- /** ↗
3529
- * El componente x del vector.
3530
- */
3531
- x: number;
3532
-
3533
- /** ↗
3534
- * El componente y del vector.
3535
- */
3536
- y: number;
3537
-
3538
- /** ↗
3539
- * El componente z del vector.
3540
- */
3541
- z: number;
3542
-
3543
- /** ↗
3544
- * El componente w del vector.
3545
- */
3546
- w(): void;
3547
-
3548
- /** ↗
3549
- * Establece los componentes x, y, y z del vector.
3550
- * @param {number} [x] componente x del vector
3551
- * @param {number} [y] componente y del vector
3552
- * @param {number} [z] componente z del vector
3553
- * @param {number} [w] componente w del vector
3554
- * @returns {Vector} este vector
3555
- */
3556
- set(): void;
3557
-
3558
- /** ↗
3559
- * Devuelve una copia del vector.
3560
- * @returns {Vector} copia del vector
3561
- */
3562
- copy(): void;
3563
-
3564
- /** ↗
3565
- * Suma x, y, y z componentes a un vector, suma un vector a otro, o suma dos vectores independientes.
3566
- * @param {number | Vector} x componente x del vector o Vector a sumar
3567
- * @param {number} [y] componente y del vector
3568
- * @param {number} [z] componente z del vector
3569
- * @returns {Vector} este vector
3570
- */
3571
- add(): void;
3572
-
3573
- /** ↗
3574
- * Resta x, y, y z componentes de un vector, resta un vector de otro, o resta dos vectores independientes.
3575
- * @param {number | Vector} x componente x del vector o Vector a restar
3576
- * @param {number} [y] componente y del vector
3577
- * @param {number} [z] componente z del vector
3578
- * @returns {Vector} este vector
3579
- */
3580
- sub(): void;
3581
-
3582
- /** ↗
3583
- * Multiplica el vector por un escalar.
3584
- * @param {number} n escalar por el cual multiplicar
3585
- * @returns {Vector} este vector
3586
- */
3587
- mult(n: number | Vector): Vector;
3588
-
3589
- /** ↗
3590
- * Divide el vector por un escalar.
3591
- * @param {number} n escalar por el cual dividir
3592
- * @returns {Vector} este vector
3593
- */
3594
- div(n: number | Vector): Vector;
3595
-
3596
- /** ↗
3597
- * Calcula la magnitud (longitud) del vector y devuelve el resultado como un flotante (esto es simplemente la ecuación `sqrt(x*x + y*y + z*z)`).
3598
- * @returns {number} magnitud del vector
3599
- */
3600
- mag(): number;
3601
-
3602
- /** ↗
3603
- * Calcula la magnitud (longitud) del vector al cuadrado y devuelve el resultado como un flotante (esto es simplemente la ecuación `x*x + y*y + z*z`).
3604
- * @returns {number} magnitud del vector al cuadrado
3605
- */
3606
- magSq(): void;
3607
-
3608
- /** ↗
3609
- * Calcula el producto punto de dos vectores.
3610
- * @param {Vector} v vector con el cual hacer producto punto
3611
- * @returns {number} producto punto
3612
- */
3613
- dot(): void;
3614
-
3615
- /** ↗
3616
- * Calcula el producto cruz de dos vectores.
3617
- * @param {Vector} v vector con el cual hacer producto cruz
3618
- * @returns {Vector} producto cruz
3619
- */
3620
- cross(): void;
3621
-
3622
- /** ↗
3623
- * Calcula la distancia euclidiana entre dos puntos (considerando un punto como un objeto vector).
3624
- * @param {Vector} v vector al cual calcular distancia
3625
- * @returns {number} distancia
3626
- */
3627
- dist(v: Vector): number;
3628
-
3629
- /** ↗
3630
- * Normaliza el vector a longitud 1 (hace que sea un vector unitario).
3631
- * @returns {Vector} este vector
3632
- */
3633
- normalize(): void;
3634
-
3635
- /** ↗
3636
- * Limita la magnitud de este vector al valor usado para el parámetro `max`.
3637
- * @param {number} max magnitud máxima
3638
- * @returns {Vector} este vector
3639
- */
3640
- limit(): void;
3641
-
3642
- /** ↗
3643
- * Establece la magnitud de este vector al valor usado para el parámetro `len`.
3644
- * @param {number} len nueva longitud para este vector
3645
- * @returns {Vector} este vector
3646
- */
3647
- setMag(): void;
3648
-
3649
- /** ↗
3650
- * Calcula el ángulo de rotación para este vector (solo vectores 2D).
3651
- * @returns {number} el ángulo de rotación
3652
- */
3653
- heading(): void;
3654
-
3655
- /** ↗
3656
- * Rota el vector por un ángulo (solo vectores 2D), la magnitud permanece igual.
3657
- * @param {number} ángulo ángulo de rotación
3658
- * @returns {Vector} este vector
3659
- */
3660
- rotate(): void;
3661
-
3662
- /** ↗
3663
- * Calcula y devuelve el ángulo entre dos vectores.
3664
- * @param {Vector} v el vector x, y, z
3665
- * @returns {number} el ángulo entre
3666
- */
3667
- angleBetween(): void;
3668
-
3669
- /** ↗
3670
- * Interpola linealmente el vector a otro vector.
3671
- * @param {Vector} v el vector x, y, z
3672
- * @param {number} amt la cantidad de interpolación; 0.0 es el vector antiguo, 1.0 es el nuevo vector, 0.5 está a mitad de camino
3673
- * @returns {Vector} este vector
3674
- */
3675
- lerp(v: Vector, amt: number): Vector;
3676
-
3677
- /** ↗
3678
- * Refleja el vector entrante sobre una normal al muro.
3679
- * @param {Vector} superficieNormal el vector normal a la superficie
3680
- * @returns {Vector} este vector
3681
- */
3682
- reflect(): void;
3683
-
3684
- /** ↗
3685
- * Devuelve una representación de este vector como un array de flotantes.
3686
- * @returns {number[]} array de flotantes
3687
- */
3688
- array(): void;
3689
-
3690
- /** ↗
3691
- * Comprueba si los componentes x, y, y z del vector son iguales a los componentes x, y, y z de otro vector.
3692
- * @param {Vector} v el vector a comparar
3693
- * @returns {boolean} verdadero si los vectores son iguales
3694
- */
3695
- equals(): void;
3696
-
3697
- /** ↗
3698
- * Hace un nuevo vector 2D desde un ángulo de longitud 1.
3699
- * @param {number} ángulo el ángulo deseado
3700
- * @param {number} [longitud] longitud del nuevo vector (por defecto a 1)
3701
- * @returns {Vector} nuevo objeto Vector
3702
- */
3703
- fromAngle(): void;
3704
-
3705
- /** ↗
3706
- * Hace un nuevo vector 2D aleatorio con una magnitud de 1.
3707
- * @returns {Vector} nuevo objeto Vector
3708
- */
3709
- random2D(): void;
3710
-
3711
- /** ↗
3712
- * Hace un nuevo vector 3D aleatorio con una magnitud de 1.
3713
- * @returns {Vector} nuevo objeto Vector
3714
- */
3715
- random3D(): void;
3716
- sumar(v: Vector): Vector;
3717
-
3718
- restar(v: Vector): Vector;
3719
-
3720
- normalizar(): Vector;
3721
-
3722
- establecerMag(len: number): Vector;
3723
-
3724
- punto(v: Vector): number;
3725
-
3726
- cruz(v: Vector): Vector;
3727
-
3728
- copiar(): Vector;
3729
-
3730
- establecer(x: number, y: number, z?: number): void;
3731
-
3732
- limitar(max: number): Vector;
3733
-
3734
- rumbo(): number;
3735
-
3736
- establecerRumbo(angulo: number): Vector;
3737
-
3738
- rotar(angulo: number): Vector;
3739
-
3740
- slerp(v: Vector, amt: number): Vector;
3741
-
3742
- static desdeÁngulo(angulo: number, longitud?: number): Vector;
3743
-
3744
- }
3745
-
3746
- // 🖌 modelado
3747
-
3748
- /** 🖌
3749
- * Dibuja un arco, que es una sección de una elipse.
3750
- *
3751
- * `modoEliptico` afecta cómo se dibuja el arco.
3752
- *
3753
- * q5 WebGPU solo soporta el modo por defecto `PIE_OPEN`.
3754
- * @param {number} x coordenada-x
3755
- * @param {number} y coordenada-y
3756
- * @param {number} w ancho de la elipse
3757
- * @param {number} h alto de la elipse
3758
- * @param {number} inicio ángulo para empezar el arco
3759
- * @param {number} fin ángulo para terminar el arco
3760
- * @param {number} [modo] configuración de estilo de forma y trazo, por defecto es `PIE_OPEN` para una forma de pastel con un trazo no cerrado, puede ser `PIE`, `CHORD`, o `CHORD_OPEN`
3761
- * @example
3762
- * await Lienzo(200);
3763
- * fondo(0.8);
3764
- *
3765
- * arco(0, 0, 160, 160, 0.8, -0.8);
3766
- */
3767
- function arco(x: number, y: number, w: number, h: number, inicio: number, fin: number, modo?: number): void;
3768
-
3769
- /** 🖌
3770
- * Dibuja una curva.
3771
- * @example
3772
- * await Lienzo(200, 100);
3773
- * fondo(0.8);
3774
- *
3775
- * curva(-100, -200, -50, 0, 50, 0, 100, -200);
3776
- */
3777
- function curva(x1: number, y1: number, x2: number, y2: number, x3: number, y3: number, x4: number, y4: number): void;
3778
-
3779
- /** 🖌
3780
- * Establece la cantidad de segmentos de línea recta usados para hacer una curva.
3781
- *
3782
- * Solo tiene efecto en q5 WebGPU.
3783
- * @param {number} val nivel de detalle de la curva, por defecto es 20
3784
- * @example
3785
- * await Lienzo(200);
3786
- *
3787
- * detalleCurva(4);
3788
- *
3789
- * grosorTrazo(10);
3790
- * trazo(0, 1, 1);
3791
- * curva(-100, -200, -50, 0, 50, 0, 100, -200);
3792
- */
3793
- function detalleCurva(val: number): void;
3794
-
3795
- /** 🖌
3796
- * Comienza a almacenar vértices para una forma convexa.
3797
- */
3798
- function empezarForma(): void;
3799
-
3800
- /** 🖌
3801
- * Termina de almacenar vértices para una forma convexa.
3802
- */
3803
- function terminarForma(): void;
3804
-
3805
- /** 🖌
3806
- * Comienza a almacenar vértices para un contorno.
3807
- *
3808
- * No disponible en q5 WebGPU.
3809
- */
3810
- function empezarContorno(): void;
3811
-
3812
- /** 🖌
3813
- * Termina de almacenar vértices para un contorno.
3814
- *
3815
- * No disponible en q5 WebGPU.
3816
- */
3817
- function terminarContorno(): void;
3818
-
3819
- /** 🖌
3820
- * Especifica un vértice en una forma.
3821
- * @param {number} x coordenada-x
3822
- * @param {number} y coordenada-y
3823
- */
3824
- function vértice(x: number, y: number): void;
3825
-
3826
- /** 🖌
3827
- * Especifica un vértice Bezier en una forma.
3828
- * @param {number} cp1x coordenada-x del primer punto de control
3829
- * @param {number} cp1y coordenada-y del primer punto de control
3830
- * @param {number} cp2x coordenada-x del segundo punto de control
3831
- * @param {number} cp2y coordenada-y del segundo punto de control
3832
- * @param {number} x coordenada-x del punto de anclaje
3833
- * @param {number} y coordenada-y del punto de anclaje
3834
- */
3835
- function vérticeBezier(cp1x: number, cp1y: number, cp2x: number, cp2y: number, x: number, y: number): void;
3836
-
3837
- /** 🖌
3838
- * Especifica un vértice Bezier cuadrático en una forma.
3839
- * @param {number} cp1x coordenada-x del punto de control
3840
- * @param {number} cp1y coordenada-y del punto de control
3841
- * @param {number} x coordenada-x del punto de anclaje
3842
- * @param {number} y coordenada-y del punto de anclaje
3843
- */
3844
- function vérticeCuadrático(cp1x: number, cp1y: number, x: number, y: number): void;
3845
-
3846
- /** 🖌
3847
- * Dibuja una curva Bezier.
3848
- * @param {number} x1 coordenada-x del primer punto de anclaje
3849
- * @param {number} y1 coordenada-y del primer punto de anclaje
3850
- * @param {number} x2 coordenada-x del primer punto de control
3851
- * @param {number} y2 coordenada-y del primer punto de control
3852
- * @param {number} x3 coordenada-x del segundo punto de control
3853
- * @param {number} y3 coordenada-y del segundo punto de control
3854
- * @param {number} x4 coordenada-x del segundo punto de anclaje
3855
- * @param {number} y4 coordenada-y del segundo punto de anclaje
3856
- */
3857
- function bezier(x1: number, y1: number, x2: number, y2: number, x3: number, y3: number, x4: number, y4: number): void;
3858
-
3859
- /** 🖌
3860
- * Dibuja un triángulo.
3861
- * @param {number} x1 coordenada-x del primer vértice
3862
- * @param {number} y1 coordenada-y del primer vértice
3863
- * @param {number} x2 coordenada-x del segundo vértice
3864
- * @param {number} y2 coordenada-y del segundo vértice
3865
- * @param {number} x3 coordenada-x del tercer vértice
3866
- * @param {number} y3 coordenada-y del tercer vértice
3867
- */
3868
- function triángulo(x1: number, y1: number, x2: number, y2: number, x3: number, y3: number): void;
3869
-
3870
- /** 🖌
3871
- * Dibuja un cuadrilátero.
3872
- * @param {number} x1 coordenada-x del primer vértice
3873
- * @param {number} y1 coordenada-y del primer vértice
3874
- * @param {number} x2 coordenada-x del segundo vértice
3875
- * @param {number} y2 coordenada-y del segundo vértice
3876
- * @param {number} x3 coordenada-x del tercer vértice
3877
- * @param {number} y3 coordenada-y del tercer vértice
3878
- * @param {number} x4 coordenada-x del cuarto vértice
3879
- * @param {number} y4 coordenada-y del cuarto vértice
3880
- */
3881
- function quad(x1: number, y1: number, x2: number, y2: number, x3: number, y3: number, x4: number, y4: number): void;
3882
-
3883
- // ⚡ sombreadores
3884
-
3885
- /**
3886
- * ¡Shaders personalizados escritos en WGSL (WebGPU Shading Language) pueden ser
3887
- * usados para crear efectos visuales avanzados en q5!
3888
- */
3889
-
3890
- /** ⚡
3891
- * Crea un shader que q5 puede usar para dibujar formas.
3892
- *
3893
- * Afecta a las siguientes funciones:
3894
- * `triángulo`, `quad`, `plano`,
3895
- * `curva`, `bezier`, `empezarForma`/`terminarForma`,
3896
- * y `fondo` (a menos que se use una imagen).
3897
- *
3898
- * Usa esta función para personalizar una copia del
3899
- * [shader de formas por defecto](https://github.com/q5js/q5.js/blob/main/src/shaders/shapes.wgsl).
3900
- *
3901
- * Para más información sobre los parámetros de entrada de las funciones de vértice y fragmento,
3902
- * datos, y funciones auxiliares disponibles para usar
3903
- * en tu código de shader personalizado, lee la página wiki
3904
- * ["Custom Shaders in q5 WebGPU"](https://github.com/q5js/q5.js/wiki/Custom-Shaders-in-q5-WebGPU).
3905
- * @param {string} codigo extracto de código shader WGSL
3906
- * @returns {GPUShaderModule} un programa shader
3907
- * @example
3908
- * await Lienzo(200);
3909
- *
3910
- * let wobble = crearShader(`
3911
- * @vertex
3912
- * fn vertexMain(v: VertexParams) -> FragParams {
3913
- * var vert = transformVertex(v.pos, v.matrixIndex);
3914
- *
3915
- * let i = f32(v.vertexIndex) % 4 * 100;
3916
- * vert.x += cos((q.time + i) * 0.01) * 0.1;
3917
- *
3918
- * var f: FragParams;
3919
- * f.position = vert;
3920
- * f.color = vec4f(1, 0, 0, 1);
3921
- * return f;
3922
- * }`);
3923
- *
3924
- * q5.dibujar = function () {
3925
- * limpiar();
3926
- * shader(wobble);
3927
- * plano(0, 0, 100);
3928
- * };
3929
- * @example
3930
- * await Lienzo(200);
3931
- *
3932
- * let stripes = crearShader(`
3933
- * @fragment
3934
- * fn fragMain(f: FragParams) -> @location(0) vec4f {
3935
- * let r = cos((q.mouseY + f.position.y) * 0.2);
3936
- * return vec4(r, 0.0, 1, 1);
3937
- * }`);
3938
- *
3939
- * q5.dibujar = function () {
3940
- * shader(stripes);
3941
- * triángulo(-50, -50, 0, 50, 50, -50);
3942
- * };
3943
- */
3944
- function crearShader(codigo: string): GPUShaderModule;
3945
-
3946
- /** ⚡
3947
- * Un plano es un rectángulo centrado sin trazo.
3948
- * @param {number} x centro x
3949
- * @param {number} y centro y
3950
- * @param {number} w ancho o longitud del lado
3951
- * @param {number} [h] alto
3952
- * @example
3953
- * await Lienzo(200);
3954
- * plano(0, 0, 100);
3955
- */
3956
- function plano(x: number, y: number, w: number, h?: number): void;
3957
-
3958
- /** ⚡
3959
- * Aplica un shader.
3960
- * @param {GPUShaderModule} moduloShader un programa shader
3961
- */
3962
- function shader(moduloShader: GPUShaderModule): void;
3963
-
3964
- /** ⚡
3965
- * Hace que q5 use el shader de formas por defecto.
3966
- * @example
3967
- * await Lienzo(200);
3968
- *
3969
- * let stripes = crearShader(`
3970
- * @fragment
3971
- * fn fragMain(f: FragParams) -> @location(0) vec4f {
3972
- * let g = cos((q.mouseY + f.position.y) * 0.05);
3973
- * return vec4(1, g, 0, 1);
3974
- * }`);
3975
- *
3976
- * q5.dibujar = function () {
3977
- * shader(stripes);
3978
- * fondo(0);
3979
- *
3980
- * reiniciarShader();
3981
- * triángulo(-50, -50, 0, 50, 50, -50);
3982
- * };
3983
- */
3984
- function reiniciarShader(): void;
3985
-
3986
- /** ⚡
3987
- * Hace que q5 use el shader de fotograma por defecto.
3988
- */
3989
- function reiniciarShaderFotograma(): void;
3990
-
3991
- /** ⚡
3992
- * Hace que q5 use el shader de imagen por defecto.
3993
- */
3994
- function reiniciarShaderImagen(): void;
3995
-
3996
- /** ⚡
3997
- * Hace que q5 use el shader de video por defecto.
3998
- */
3999
- function reiniciarShaderVideo(): void;
4000
-
4001
- /** ⚡
4002
- * Hace que q5 use el shader de texto por defecto.
4003
- */
4004
- function reiniciarShaderTexto(): void;
4005
-
4006
- /** ⚡
4007
- * Hace que q5 use todos los shaders por defecto.
4008
- */
4009
- function reiniciarShaders(): void;
4010
-
4011
- /** ⚡
4012
- * Crea un shader que q5 puede usar para dibujar fotogramas.
4013
- *
4014
- * `crearLienzo` debe ejecutarse antes de usar esta función.
4015
- *
4016
- * Usa esta función para personalizar una copia del
4017
- * [shader de fotograma por defecto](https://github.com/q5js/q5.js/blob/main/src/shaders/frame.wgsl).
4018
- * @example
4019
- * await Lienzo(200);
4020
- *
4021
- * let boxy = crearShaderFotograma(`
4022
- * @fragment
4023
- * fn fragMain(f: FragParams) -> @location(0) vec4f {
4024
- * let x = sin(f.texCoord.y * 4 + q.time * 0.002);
4025
- * let y = cos(f.texCoord.x * 4 + q.time * 0.002);
4026
- * let uv = f.texCoord + vec2f(x, y);
4027
- * return textureSample(tex, samp, uv);
4028
- * }`);
4029
- *
4030
- * q5.dibujar = function () {
4031
- * trazo(1);
4032
- * grosorTrazo(8);
4033
- * línea(ratónX, ratónY, pRatónX, pRatónY);
4034
- * ratónPresionado ? reiniciarShaders() : shader(boxy);
4035
- * };
4036
- */
4037
- function crearShaderFotograma(codigo: string): GPUShaderModule;
4038
-
4039
- /** ⚡
4040
- * Crea un shader que q5 puede usar para dibujar imágenes.
4041
- *
4042
- * Usa esta función para personalizar una copia del
4043
- * [shader de imagen por defecto](https://github.com/q5js/q5.js/blob/main/src/shaders/image.wgsl).
4044
- * @param {string} codigo extracto de código shader WGSL
4045
- * @returns {GPUShaderModule} un programa shader
4046
- * @example
4047
- * await Lienzo(200);
4048
- * modoImagen(CENTER);
4049
- *
4050
- * let logo = cargarImagen('/q5js_logo.avif');
4051
- *
4052
- * let grate = crearShaderImagen(`
4053
- * @fragment
4054
- * fn fragMain(f: FragParams) -> @location(0) vec4f {
4055
- * var texColor = textureSample(tex, samp, f.texCoord);
4056
- * texColor.b += (q.mouseX + f.position.x) % 20 / 10;
4057
- * return texColor;
4058
- * }`);
4059
- *
4060
- * q5.dibujar = function () {
4061
- * fondo(0.7);
4062
- * shader(grate);
4063
- * imagen(logo, 0, 0, 180, 180);
4064
- * };
4065
- */
4066
- function crearShaderImagen(codigo: string): GPUShaderModule;
4067
-
4068
- /** ⚡
4069
- * Crea un shader que q5 puede usar para dibujar fotogramas de video.
4070
- *
4071
- * Usa esta función para personalizar una copia del
4072
- * [shader de video por defecto](https://github.com/q5js/q5.js/blob/main/src/shaders/video.wgsl).
4073
- * @param {string} codigo extracto de código shader WGSL
4074
- * @returns {GPUShaderModule} un programa shader
4075
- * @example
4076
- * await Lienzo(200, 600);
4077
- *
4078
- * let vid = crearVideo('/assets/apollo4.mp4');
4079
- * vid.hide();
4080
- *
4081
- * let flipper = crearShaderVideo(`
4082
- * @vertex
4083
- * fn vertexMain(v: VertexParams) -> FragParams {
4084
- * var vert = transformVertex(v.pos, v.matrixIndex);
4085
- *
4086
- * var vi = f32(v.vertexIndex);
4087
- * vert.y *= cos((q.frameCount + vi * 10) * 0.03);
4088
- *
4089
- * var f: FragParams;
4090
- * f.position = vert;
4091
- * f.texCoord = v.texCoord;
4092
- * return f;
4093
- * }
4094
- *
4095
- * @fragment
4096
- * fn fragMain(f: FragParams) -> @location(0) vec4f {
4097
- * var texColor =
4098
- * textureSampleBaseClampToEdge(tex, samp, f.texCoord);
4099
- * texColor.r = 0;
4100
- * texColor.b *= 2;
4101
- * return texColor;
4102
- * }`);
4103
- *
4104
- * q5.dibujar = function () {
4105
- * limpiar();
4106
- * if (ratónPresionado) vid.play();
4107
- * shader(flipper);
4108
- * imagen(vid, -100, 150, 200, 150);
4109
- * };
4110
- */
4111
- function crearShaderVideo(codigo: string): GPUShaderModule;
4112
-
4113
- /** ⚡
4114
- * Crea un shader que q5 puede usar para dibujar texto.
4115
- *
4116
- * Usa esta función para personalizar una copia del
4117
- * [shader de texto por defecto](https://github.com/q5js/q5.js/blob/main/src/shaders/text.wgsl).
4118
- * @param {string} codigo extracto de código shader WGSL
4119
- * @returns {GPUShaderModule} un programa shader
4120
- * @example
4121
- * await Lienzo(200);
4122
- * alineaciónTexto(CENTER, CENTER);
4123
- *
4124
- * let spin = crearShaderTexto(`
4125
- * @vertex
4126
- * fn vertexMain(v : VertexParams) -> FragParams {
4127
- * let char = textChars[v.instanceIndex];
4128
- * let text = textMetadata[i32(char.w)];
4129
- * let fontChar = fontChars[i32(char.z)];
4130
- * let pos = calcPos(v.vertexIndex, char, fontChar, text);
4131
- *
4132
- * var vert = transformVertex(pos, text.matrixIndex);
4133
- *
4134
- * let i = f32(v.instanceIndex + 1);
4135
- * vert.y *= cos((q.frameCount - 5 * i) * 0.05);
4136
- *
4137
- * var f : FragParams;
4138
- * f.position = vert;
4139
- * f.texCoord = calcUV(v.vertexIndex, fontChar);
4140
- * f.fillColor = colors[i32(text.fillIndex)];
4141
- * f.strokeColor = colors[i32(text.strokeIndex)];
4142
- * f.strokeWeight = text.strokeWeight;
4143
- * f.edge = text.edge;
4144
- * return f;
4145
- * }`);
4146
- *
4147
- * q5.dibujar = function () {
4148
- * limpiar();
4149
- * shader(spin);
4150
- * relleno(1, 0, 1);
4151
- * tamañoTexto(32);
4152
- * texto('Hello, World!', 0, 0);
4153
- * };
4154
- */
4155
- function crearShaderTexto(codigo: string): GPUShaderModule;
4156
-
4157
- // ⚙ avanzado
4158
-
4159
- /** ⚙
4160
- * Alias para `Q5`.
4161
- */
4162
- const q5: typeof Q5;
4163
-
4164
- class Q5 {
4165
-
4166
- /** ⚙
4167
- * Funcion constructora. Crea una instancia de Q5.
4168
- * @param {string | Function} [ambito]
4169
- * @param {HTMLElement} [contenedor] elemento HTML dentro del cual se colocará el lienzo
4170
- */
4171
- constructor(scope?: string | Function, parent?: HTMLElement);
4172
-
4173
- /** ⚙
4174
- * La versión menor actual de q5.
4175
- * @returns {string} la versión de q5
4176
- * @example
4177
- * await Lienzo(200);
4178
- * fondo(0.8);
4179
- * tamañoTexto(64);
4180
- * alineaciónTexto(CENTRO, CENTRO);
4181
- * texto('v' + Q5.version, 0, 0);
4182
- */
4183
- version(): void;
4184
-
4185
- /** ⚙
4186
- * Establece un código de idioma distinto de 'en' (inglés) para usar q5 en otro idioma.
4187
- *
4188
- * Idiomas actualmente soportados:
4189
- *
4190
- * - 'es' (Español)
4191
- */
4192
- static lang: string;
4193
-
4194
- /** ⚙
4195
- * Desactiva los mensajes de error amigables de q5.
4196
- */
4197
- static deshabilitarErroresAmigables: boolean;
4198
-
4199
- /** ⚙
4200
- * Establecer en verdadero para mantener el bucle de dibujo después de un error.
4201
- */
4202
- static toleranteErrores: boolean;
4203
-
4204
- /** ⚙
4205
- * Verdadero si el dispositivo soporta HDR (el espacio de color display-p3).
4206
- */
4207
- static soportaHDR: boolean;
4208
-
4209
- /** ⚙
4210
- * Establece los atributos de contexto de lienzo predeterminados utilizados para
4211
- * lienzos recién creados y gráficos internos. Estas opciones son sobrescritas por
4212
- * cualquier opción por lienzo que pases a `crearLienzo`.
4213
- */
4214
- static opcionesLienzo: object;
4215
-
4216
- /** ⚙
4217
- * Un límite de asignación de memoria WebGPU.
4218
- *
4219
- * El número máximo de matrices de transformación
4220
- * que se pueden usar en una sola llamada de dibujo.
4221
- */
4222
- static MAX_TRANSFORMACIONES: number;
4223
-
4224
- /** ⚙
4225
- * Un límite de asignación de memoria WebGPU.
4226
- *
4227
- * El número máximo de rectángulos
4228
- * (llamadas a `rect`, `cuadrado`, `cápsula`)
4229
- * que se pueden dibujar en una sola llamada de dibujo.
4230
- */
4231
- static MAX_RECTS: number;
4232
-
4233
- /** ⚙
4234
- * Un límite de asignación de memoria WebGPU.
4235
- *
4236
- * El número máximo de elipses
4237
- * (llamadas a `elipse`, `círculo`, y `arco`)
4238
- * que se pueden dibujar en una sola llamada de dibujo.
4239
- */
4240
- static MAX_ELIPSES: number;
4241
-
4242
- /** ⚙
4243
- * Un límite de asignación de memoria WebGPU.
4244
- *
4245
- * El número máximo de caracteres de texto
4246
- * que se pueden dibujar en una sola llamada de dibujo.
4247
- */
4248
- static MAX_CARACTERES: number;
4249
-
4250
- /** ⚙
4251
- * Un límite de asignación de memoria WebGPU.
4252
- *
4253
- * El número máximo de llamadas separadas a `texto`
4254
- * que se pueden dibujar en una sola llamada de dibujo.
4255
- */
4256
- static MAX_TEXTOS: number;
4257
-
4258
- /** ⚙
4259
- * Crea una nueva instancia de Q5 que usa el [renderizador WebGPU de q5](https://github.com/q5js/q5.js/wiki/q5-WebGPU-renderer).
4260
- * @example
4261
- * let q = await Q5.WebGPU('namespace');
4262
- * q.crearLienzo(200, 100);
4263
- *
4264
- * q.dibujar = () => {
4265
- * q.fondo(0.8);
4266
- * q.círculo(q.ratónX, 0, 80);
4267
- * };
4268
- */
4269
- static WebGPU(): Q5;
4270
-
4271
- /** ⚙
4272
- * Los addons pueden aumentar q5 con nueva funcionalidad agregando hooks,
4273
- * funciones que se ejecutan en fases específicas del ciclo de vida de q5.
4274
- *
4275
- * Dentro de la función, `this` se refiere a la instancia de Q5.
4276
- * @param {string} lifecycle 'init', 'presetup', 'postsetup', 'predraw', 'postdraw', o 'remove'
4277
- * @param {Function} fn La función que se ejecutará en la fase del ciclo de vida especificada.
4278
- * @example
4279
- * Q5.addHook('predraw', function () {
4280
- * this.fondo('cyan');
4281
- * });
4282
- *
4283
- * q5.dibujar = function () {
4284
- * círculo(ratónX, ratónY, 80);
4285
- * };
4286
- */
4287
- addHook(): void;
4288
-
4289
- /** ⚙
4290
- * Forma compatible con p5.js v2 de registrar un addon con q5.
4291
- * @param {Function} addon Una función que recibe `Q5`, `Q5.prototype`, y un objeto `lifecycles`.
4292
- * @example
4293
- * // addon.js
4294
- * Q5.registerAddon((Q5, proto, lifecycles) => {
4295
- * lifecycles.predraw = function () {
4296
- * this.fondo('pink');
4297
- * };
4298
- * });
4299
- *
4300
- * // sketch.js
4301
- * await Lienzo(200);
4302
- */
4303
- registerAddon(): void;
4304
-
4305
- /** ⚙
4306
- * Un objeto que contiene los módulos de q5, funciones que se ejecutan cuando q5 carga.
4307
- *
4308
- * Cada función recibe dos parámetros de entrada:
4309
- *
4310
- * - la instancia de q5
4311
- * - un proxy para editar la instancia de q5 y las propiedades correspondientes del ámbito global
4312
- */
4313
- static modulos: object;
4314
-
4315
- /** ⚙
4316
- * La función de dibujo de q5 se ejecuta 60 veces por segundo por defecto.
4317
- */
4318
- dibujar(): void;
4319
-
4320
- /** ⚙
4321
- * Se ejecuta después de cada llamada a la función `dibujar` y procesos de addons de q5 post-dibujo, si los hay.
4322
- *
4323
- * Útil para agregar efectos de post-procesamiento cuando no es posible
4324
- * hacerlo al final de la función `dibujar`, como cuando se usan
4325
- * addons como p5play que dibujan automáticamente al lienzo después de que
4326
- * la función `dibujar` se ejecuta.
4327
- */
4328
- postProcesar(): void;
4329
- static versión: string;
4330
-
4331
- static agregarHook(cicloVida: string, fn: Function): void;
4332
-
4333
- static registrarAddon(addon: Function): void;
4334
-
4335
- actualizar(): void; //-
4336
-
4337
- static Imagen: {
4338
- new (w: number, h: number, opt?: any): Q5.Imagen;
4339
- };
4340
-
4341
- }
4342
-
4343
- namespace Q5 {
4344
- interface Imagen {
4345
- ancho: number;
4346
- alto: number;
4347
- }
4348
- }
4349
-
4350
- }
4351
-
4352
- export {};