diff --git a/package-lock.json b/package-lock.json
index de37926..2d7b717 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "pilas-bloques-exercises",
- "version": "1.2.19",
+ "version": "1.2.22",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
diff --git a/package.json b/package.json
index eade3e1..a26fa51 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "pilas-bloques-exercises",
- "version": "1.2.19",
+ "version": "1.2.22",
"description": "Exercises for Pilas Bloques",
"homepage": "http://pilasbloques.program.ar",
"author": {
diff --git a/src/actores/PelotaAnimada.ts b/src/actores/PelotaAnimada.ts
index 5923fe6..5bec426 100644
--- a/src/actores/PelotaAnimada.ts
+++ b/src/actores/PelotaAnimada.ts
@@ -1,10 +1,12 @@
///
class PelotaAnimada extends ActorAnimado {
+ static _grilla = 'pelotaAnimada.png'
constructor(x: number, y: number) {
- super(x, y, { grilla: 'pelotaAnimada.png', cantColumnas: 16 })
+ super(x, y, { cantColumnas: 17 })
this.definirAnimacion("patear", [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], 12)
+ this.definirAnimacion("desaparecer", [16],12)
}
}
\ No newline at end of file
diff --git a/src/actores/segundoCiclo/Chuy/Chuy.ts b/src/actores/segundoCiclo/Chuy/Chuy.ts
new file mode 100644
index 0000000..c1c75f7
--- /dev/null
+++ b/src/actores/segundoCiclo/Chuy/Chuy.ts
@@ -0,0 +1,39 @@
+///
+///
+
+class Chuy extends ActorAnimado {
+ static _grilla = 'actor.chuy.png'
+
+ constructor() {
+ super(0,0,{
+ cantColumnas: 10,cantFilas: 11});
+ this.definirAnimacion("parado",
+ new Cuadros(5).repetirVeces(16)
+ .concat([6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 11, 12, 13, 14, 15, 11, 12, 13, 14, 15, 11, 12, 13, 14, 15, 11, 11, 11, 16, 17, 18, 18, 18, 18, 18, 19, 20, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 47, 47, 47, 47, 47, 47, 47, 47, 47, 49, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50])
+ .concat(new Cuadros(5).repetirVeces(30))
+ .concat([6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 11, 12, 13, 14, 15, 11, 12, 13, 14, 15, 11, 12, 13, 14, 15, 11, 11, 11, 16, 17, 18, 18, 18, 18, 18, 19, 20, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 47, 47, 47, 47, 47, 47, 47, 47, 47, 49, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50])
+ .concat(new Cuadros(5).repetirVeces(30))
+ .concat([6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 11, 12, 13, 14, 15, 11, 12, 13, 14, 15, 11, 12, 13, 14, 15, 11, 11, 11, 16, 17, 18, 18, 18, 18, 18, 19, 20, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 47, 47, 47, 47, 47, 47, 47, 47, 47, 49, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50])
+ .concat(new Cuadros(5).repetirVeces(16)),
+ 20, true);
+ this.definirAnimacion("correr", [68, 69, 70, 71, 72, 73, 74, 75, 76], 12);
+ this.definirAnimacion("correrChocando", [68, 69, 70, 71, 72, 73, 74, 75, 76], 12)
+ this.definirAnimacion("obstaculo", [0, 1, 1, 2, 2, 3, 3, 4, 4, 4], 12)
+ this.definirAnimacion("error", [101, 101, 101, 102, 102, 103, 103, 104, 104, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105]
+ , 12)
+ this.definirAnimacion("recoger", [97, 98, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 100, 97], 12);
+ this.definirAnimacion("usarPaleta", [51, 52, 53, 54, 55, 56, 57, 58, 57, 56, 55, 56, 57, 58, 57, 56, 55, 56, 57, 58, 57, 56, 55, 56, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67], 12);
+ this.definirAnimacion("rebotarPelota", [87, 88, 89, 90, 91, 92, 93, 92, 91, 90, 94, 95, 90, 91, 92, 93, 91, 94, 91, 93, 90, 94, 96, 87, 87, 87, 87], 12);
+ this.definirAnimacion("patear", [87, 88, 89, 90, 91, 92, 93, 92, 91, 90, 94, 95, 90, 91, 92, 93, 91, 94, 91, 93, 90, 94, 96, 87, 87, 87, 87], 12)
+ this.definirAnimacion("rebotarPulpito", [77, 78, 79, 80, 81, 82, 83, 82, 81, 80, 84, 85, 80, 81, 82, 83, 81, 84, 81, 83, 80, 84, 86, 77, 77, 77, 77], 12);
+ }
+
+
+ puedeMoverseAbajo(){
+ return this.tocandoFlechaAbajo() && !this.tieneEnLaCasillaDeAbajo("Obstaculo")
+ }
+
+ puedeMoverseDerecha(){
+ return this.tocandoFlechaDerecha() && !this.tieneEnLaCasillaASuDerecha("Obstaculo")
+ }
+}
diff --git a/src/actores/segundoCiclo/Chuy/Paleta.ts b/src/actores/segundoCiclo/Chuy/Paleta.ts
new file mode 100644
index 0000000..46be352
--- /dev/null
+++ b/src/actores/segundoCiclo/Chuy/Paleta.ts
@@ -0,0 +1,9 @@
+///
+
+class Paleta extends ActorAnimado {
+ static _grilla = 'actor.paleta.png'
+
+ constructor() {
+ super(0, 0, {cantColumnas:1, cantFilas: 1});
+ }
+}
\ No newline at end of file
diff --git a/src/actores/segundoCiclo/Chuy/Pelotas.ts b/src/actores/segundoCiclo/Chuy/Pelotas.ts
new file mode 100644
index 0000000..9541232
--- /dev/null
+++ b/src/actores/segundoCiclo/Chuy/Pelotas.ts
@@ -0,0 +1,19 @@
+///
+
+class Pulpito extends ActorAnimado {
+ static _grilla = 'actor.pelota.png'
+
+ constructor() {
+ super(0, 0, { cantColumnas: 2 });
+ this.definirAnimacion("desaparecer", [1], 12);
+ }
+}
+
+class PingPong extends ActorAnimado {
+ static _grilla = 'actor.pelotita.png'
+
+ constructor() {
+ super(0, 0, { cantColumnas: 2 });
+ this.definirAnimacion("desaparecer", [1], 12);
+ }
+}
\ No newline at end of file
diff --git a/src/actores/segundoCiclo/Chuy/Trofeo.ts b/src/actores/segundoCiclo/Chuy/Trofeo.ts
new file mode 100644
index 0000000..6174747
--- /dev/null
+++ b/src/actores/segundoCiclo/Chuy/Trofeo.ts
@@ -0,0 +1,9 @@
+///
+
+class Trofeo extends ActorAnimado {
+ static _grilla = 'actor.trofeo.png'
+
+ constructor() {
+ super(0, 0, {cantColumnas:1, cantFilas: 1});
+ }
+}
\ No newline at end of file
diff --git a/src/actores/segundoCiclo/Yvoty/Celular.ts b/src/actores/segundoCiclo/Yvoty/Celular.ts
index 5b9106f..995cf75 100644
--- a/src/actores/segundoCiclo/Yvoty/Celular.ts
+++ b/src/actores/segundoCiclo/Yvoty/Celular.ts
@@ -3,10 +3,11 @@ class Celular extends ActorAnimado {
static _grilla = 'actor.celular.png'
constructor(prendido = false) {
- super(0, 0, {cantColumnas: 2});
+ super(0, 0, {cantColumnas: 3});
this.definirAnimacion("cargado", [1], 1);
this.definirAnimacion("prendido", [1], 1);
this.definirAnimacion("descargado", [0], 1);
+ this.definirAnimacion("desaparecer", [2], 1);
if(prendido) this.cargarAnimacion("prendido")
}
diff --git a/src/actores/segundoCiclo/Yvoty/Yvoty.ts b/src/actores/segundoCiclo/Yvoty/Yvoty.ts
index d594d46..6ac15bc 100644
--- a/src/actores/segundoCiclo/Yvoty/Yvoty.ts
+++ b/src/actores/segundoCiclo/Yvoty/Yvoty.ts
@@ -8,23 +8,30 @@ class Yvoty extends ActorAnimado {
super(0, 0, { cantColumnas: 10, cantFilas: 8 });
this.definirAnimacion("parado",
- new Cuadros(0).repetirVeces(16)
- .concat([4, 5, 6, 7, 8, 7, 6, 5, 4, 9, 9, 9, 9, 9, 9, 9, 4, 5, 6, 7, 8, 7, 6, 5, 4, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 11, 12, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 13, 13, 14, 14, 14, 14, 14, 14, 14, 15, 15, 14, 14, 14, 14])
- .concat(new Cuadros(0).repetirVeces(30))
- .concat([4, 5, 6, 7, 8, 7, 6, 5, 4, 9, 9, 9, 9, 9, 9, 9, 4, 5, 6, 7, 8, 7, 6, 5, 4, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 11, 12, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 13, 13, 14, 14, 14, 14, 14, 14, 14, 15, 15, 14, 14, 14, 14])
- .concat(new Cuadros(0).repetirVeces(30))
- .concat([4, 5, 6, 7, 8, 7, 6, 5, 4, 9, 9, 9, 9, 9, 9, 9, 4, 5, 6, 7, 8, 7, 6, 5, 4, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 11, 12, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 13, 13, 14, 14, 14, 14, 14, 14, 14, 15, 15, 14, 14, 14, 14])
- .concat(new Cuadros(0).repetirVeces(16))
- .concat([14])
- .concat(new Cuadros(0).repetirVeces(5)),
- 20, true);
+ new Cuadros(4).repetirVeces(1).
+ concat([5, 6, 7, 8, 7, 6, 5]).
+ concat(new Cuadros(9).repetirVeces(7)).
+ concat([4, 5, 6, 7, 8, 7, 6, 5]).
+ concat(new Cuadros(9).repetirVeces(16)).
+ concat([10, 11, 12]).
+ concat([4, 5, 6, 7, 8, 7, 6, 5]).
+ concat(new Cuadros(9).repetirVeces(7)).
+ concat([4, 5, 6, 7, 8, 7, 6, 5]).
+ concat(new Cuadros(9).repetirVeces(16)).
+ concat([10, 11, 12]).
+ concat(new Cuadros(9).repetirVeces(11)).
+ concat([13, 14, 14]).
+ concat(new Cuadros(15).repetirVeces(15)).
+ concat([14, 14, 13, 12]).
+ concat(new Cuadros(9).repetirVeces(9))
+ , 20, true);
this.definirAnimacion("correr", [52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71], 20);
this.definirAnimacion("correrChocando", [52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71], 20)
this.definirAnimacion("obstaculo", [20, 21, 21, 22, 23, 24, 24, 24, 24, 25, 26, 27, 28, 29, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28], 12)
this.definirAnimacion("error", [30, 30, 30, 30, 30, 30, 30, 31, 32, 33, 34, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 36, 36, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37], 12)
- this.definirAnimacion("recoger", [0, 0, 0, 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], 20);
+ this.definirAnimacion("recoger", [0, 0, 0, 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 0, 0, 0], 12);
this.definirAnimacion("usarCelu", [38, 38, 38, 39, 39, 40, 40, 40, 41, 42, 43, 41, 43, 42, 42, 42, 44, 45, 46, 47, 46, 42, 42, 42, 45, 46, 46, 46, 45, 44, 48, 48, 48, 49, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 51, 51, 38, 38, 38, 38, 38, 38, 38], 20);
- this.definirAnimacion("sacarFoto", [38, 38, 38, 39, 39, 40, 40, 40, 41, 42, 43, 41, 43, 42, 42, 42, 44, 45, 46, 47, 46, 42, 42, 42, 45, 46, 46, 46, 45, 44, 48, 48, 48, 49, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 51, 51, 38, 38, 38, 38, 38, 38, 38], 20);
+ this.definirAnimacion("sacarFoto", [38, 38, 38, 39, 39, 40, 40, 40, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 40, 40, 40, 40], 20);
this.definirAnimacion("escribir", [16, 16, 17, 17, 18, 18, 18, 19, 19, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18], 20);
}
}
diff --git a/src/assets/actor.celular.png b/src/assets/actor.celular.png
index 83c0926..bff42e1 100644
Binary files a/src/assets/actor.celular.png and b/src/assets/actor.celular.png differ
diff --git a/src/assets/actor.chuy.png b/src/assets/actor.chuy.png
new file mode 100644
index 0000000..c2f0fe6
Binary files /dev/null and b/src/assets/actor.chuy.png differ
diff --git a/src/assets/actor.paleta.png b/src/assets/actor.paleta.png
new file mode 100644
index 0000000..3720c03
Binary files /dev/null and b/src/assets/actor.paleta.png differ
diff --git a/src/assets/actor.pelota.png b/src/assets/actor.pelota.png
new file mode 100644
index 0000000..069e9b3
Binary files /dev/null and b/src/assets/actor.pelota.png differ
diff --git a/src/assets/actor.pelotita.png b/src/assets/actor.pelotita.png
new file mode 100644
index 0000000..0fcfbd9
Binary files /dev/null and b/src/assets/actor.pelotita.png differ
diff --git a/src/assets/actor.trofeo.png b/src/assets/actor.trofeo.png
new file mode 100644
index 0000000..1dd833a
Binary files /dev/null and b/src/assets/actor.trofeo.png differ
diff --git a/src/assets/actor.yvoty.png b/src/assets/actor.yvoty.png
index c8475c4..627b815 100644
Binary files a/src/assets/actor.yvoty.png and b/src/assets/actor.yvoty.png differ
diff --git a/src/assets/casilla.futbolChuy1.png b/src/assets/casilla.futbolChuy1.png
new file mode 100644
index 0000000..734ecf6
Binary files /dev/null and b/src/assets/casilla.futbolChuy1.png differ
diff --git a/src/assets/casilla.futbolChuy2.png b/src/assets/casilla.futbolChuy2.png
new file mode 100644
index 0000000..1d54a1b
Binary files /dev/null and b/src/assets/casilla.futbolChuy2.png differ
diff --git a/src/assets/casillas.chuy.png b/src/assets/casillas.chuy.png
new file mode 100644
index 0000000..1518d94
Binary files /dev/null and b/src/assets/casillas.chuy.png differ
diff --git a/src/assets/fondo.chuy.png b/src/assets/fondo.chuy.png
new file mode 100644
index 0000000..a723046
Binary files /dev/null and b/src/assets/fondo.chuy.png differ
diff --git a/src/assets/obstaculo.chuy1.png b/src/assets/obstaculo.chuy1.png
new file mode 100644
index 0000000..dd9ba95
Binary files /dev/null and b/src/assets/obstaculo.chuy1.png differ
diff --git a/src/assets/obstaculo.chuy2.png b/src/assets/obstaculo.chuy2.png
new file mode 100644
index 0000000..78e838c
Binary files /dev/null and b/src/assets/obstaculo.chuy2.png differ
diff --git a/src/assets/obstaculo.chuy3.png b/src/assets/obstaculo.chuy3.png
new file mode 100644
index 0000000..ad17819
Binary files /dev/null and b/src/assets/obstaculo.chuy3.png differ
diff --git a/src/assets/obstaculo.chuy4.png b/src/assets/obstaculo.chuy4.png
new file mode 100644
index 0000000..62abd04
Binary files /dev/null and b/src/assets/obstaculo.chuy4.png differ
diff --git a/src/assets/pelotaAnimada.png b/src/assets/pelotaAnimada.png
index b64edd5..6ce8c54 100644
Binary files a/src/assets/pelotaAnimada.png and b/src/assets/pelotaAnimada.png differ
diff --git a/src/escenas/EscenaActividad.ts b/src/escenas/EscenaActividad.ts
index 5ac8325..fd9c9a5 100644
--- a/src/escenas/EscenaActividad.ts
+++ b/src/escenas/EscenaActividad.ts
@@ -91,6 +91,14 @@ class EscenaActividad extends Base {
return this.obtenerActoresConEtiqueta(etiqueta).length;
}
+ noHay(actor): boolean {
+ return this.contarActoresConEtiqueta(actor) == 0
+ }
+
+ todosLosActoresCumplen(actor, estado) {
+ return this.obtenerActoresConEtiqueta(actor).every(o => o.nombreAnimacionActual() == estado);
+ }
+
/**
* Computa un multiplicador que crece según la cantidad de filas y columnas de la cuadrícula.
* El multiplicador es 1 si la cuadrícula es de 1x1, y crece acotado por maxRatio.
diff --git a/src/escenas/FutbolAlSur.ts b/src/escenas/FutbolAlSur.ts
new file mode 100644
index 0000000..92c79e8
--- /dev/null
+++ b/src/escenas/FutbolAlSur.ts
@@ -0,0 +1,39 @@
+///
+
+class FutbolAlSur extends FutbolRobots {
+
+ static clasesDeActoresInvolucrados(): typeof ActorAnimado[] {
+ return [Chuy, PelotaAnimada];
+ };
+
+ static imagenesAdicionales(): string[] {
+ return ['casilla.futbolChuy1.png', 'casilla.futbolChuy2.png'].concat(Obstaculo.imagenesPara('chuy'));
+ }
+
+ static pathFondo(): string {
+ return 'fondo.chuy.png';
+ }
+
+ ajustarAutomata() {
+ this.automata.traer_al_frente()
+ this.automata.escala *= this.escalaSegunCuadricula(3.3);
+ this.automata.setY(this.automata.getY() + this.automata.getAlto() / 4);
+ this.automata.setX(this.automata.getX() + 10)
+ }
+
+ obtenerAutomata() {
+ return new Chuy();
+ }
+
+ obtenerFondo() {
+ return new Fondo('fondo.chuy.png', 0, 0);
+ }
+
+ imagenCasillas() {
+ return 'casilla.futbolChuy1.png'
+ }
+
+ imagenCasillasInicio() {
+ return 'casilla.futbolChuy2.png'
+ }
+}
diff --git a/src/escenas/FutbolRobots.ts b/src/escenas/FutbolRobots.ts
index 45810c8..47da8af 100644
--- a/src/escenas/FutbolRobots.ts
+++ b/src/escenas/FutbolRobots.ts
@@ -3,35 +3,55 @@
///
///
-class FutbolRobots extends EscenaActividad{
- automata : ActorAnimado;
+class FutbolRobots extends EscenaActividad {
+ automata: ActorAnimado;
fondo;
- cuadricula : CuadriculaMultiple;
+ cuadricula: CuadriculaMultiple;
cantPateadas;
cantidadFilas;
iniciar() {
- this.fondo = new Fondo('fondos.futbolRobots.png',0,0);
- this.cantidadFilas=8;
-
- this.cuadricula = new CuadriculaMultiple(
- new DefinidorColumnasRandom(this.cantidadFilas,6),
- 0,-50,
- {separacionEntreCasillas: 5},
- {grilla:'casilla.futbolRobots2.png', alto:40,ancho:40})
- this.cuadricula.cambiarImagenInicio('casilla.futbolRobots1.png');
-
- this.automata = new RobotAnimado(0, 0);
- this.cuadricula.agregarActor(this.automata,0,0);
- var casilla = this.cuadricula.casilla(0, 0);
- this.automata.escalarAAlto(3.5 * casilla.alto);
- this.automata.abajo = casilla.y - (0.25 * casilla.alto);
- this.automata.radio_de_colision = this.automata.alto / 2.5;
-
- for (var fila=0;fila
+
+class EscenaChuy extends EscenaDesdeMapa {
+ automata: Chuy;
+ xFinal: number;
+ yFinal: number;
+
+ static clasesDeActoresInvolucrados(): typeof ActorAnimado[] {
+ return [Chuy, Trofeo, Paleta, PelotaAnimada, Pulpito, PingPong];
+ };
+
+ static pathFondo(): string {
+ return 'fondo.chuy.png';
+ }
+
+ static imagenesAdicionales(): string[] {
+ return Casilla.imagenesPara('chuy').concat(Obstaculo.imagenesPara('chuy'));
+ }
+
+ constructor(especificacion: Spec, opciones?: opcionesMapaAleatorio, posFinal?: [number, number]) {
+ super();
+ this.initDesdeUnaOVariasDescripciones(especificacion, opciones);
+
+ if (posFinal) {
+ this.xFinal = posFinal[0];
+ this.yFinal = posFinal[1];
+ }
+ }
+
+ ajustarGraficos() {
+ this.automata.escala *= this.escalaSegunCuadricula(2);
+ this.automata.setY(this.automata.getY() + this.automata.getAlto() / 4);
+ this.automata.setX(this.automata.getX() + 12)
+
+ this.obtenerActoresConEtiquetas(["Trofeo", "Paleta", "Pulpito"]).forEach(actor => {
+ actor.aprender(Flotar, { Desvio: 4 });
+ actor.escala *= this.escalaSegunCuadricula(0.5);
+ });
+
+ this.obtenerActoresConEtiqueta("PelotaAnimada").forEach(actor => {
+ actor.aprender(Flotar, { Desvio: 4 });
+ actor.escala *= this.escalaSegunCuadricula(1) * 0.25;
+ });
+
+ this.obtenerActoresConEtiqueta("PingPong").forEach(actor => {
+ actor.aprender(Flotar, { Desvio: 4 });
+ actor.escala *= this.escalaSegunCuadricula(1) * 0.15;
+ });
+
+
+ this.obtenerActoresConEtiqueta("Obstaculo").forEach(actor => {
+ actor.escala *= this.escalaSegunCuadricula(0.7);
+ });
+
+ }
+
+ mapearIdentificadorAActor(id, nroFila, nroColumna): ActorAnimado {
+ switch (id) {
+ case 'A': return this.automata;
+ case 'O': return this.obtenerObstaculo(nroFila, nroColumna);
+ case 'T': return new Trofeo();
+ case 'E': return new Paleta();
+ case 'U': return new Pulpito();
+ case 'P': return new PingPong();
+ case 'G': return new PelotaAnimada(0,0);
+ default: throw new Error("El identificador '" + id +
+ "' no es válido en una escena de Chuy.");
+ }
+ }
+
+ obtenerAutomata(): Chuy {
+ return new Chuy();
+ }
+
+ obtenerObstaculo(fila: number, columna: number): Obstaculo {
+ let archivosObstaculos = ["obstaculo.chuy1.png", "obstaculo.chuy2.png", "obstaculo.chuy3.png", "obstaculo.chuy4.png"];
+ return new Obstaculo(archivosObstaculos, (fila + 1) + (fila + 1) * (columna + 1));
+ }
+
+ estaEnPosicionFinalSiLaTiene(): boolean {
+ return this.xFinal === undefined || this.automata.casillaActual().sos(this.yFinal, this.xFinal) || this.automata.alFinalDelCamino();
+ }
+
+ noHayPelotas(): boolean {
+ return this.noHay("Pulpito") && this.noHay("PingPong") && this.todosLosActoresCumplen("PelotaAnimada", "patear")
+ }
+
+ estaResueltoElProblema(): boolean {
+ return this.estaEnPosicionFinalSiLaTiene() && this.noHayPelotas() && this.noHay("Trofeo")
+ }
+
+ archivoFondo() {
+ return "fondo.chuy.png";
+ }
+ cuadriculaX() {
+ return 0;
+ }
+ cuadriculaY() {
+ return -20;
+ }
+ opsCuadricula() {
+ return { ancho: 400, alto: 380 };
+ }
+ opsCasilla() {
+ return {
+ grilla: 'casillas.chuy.png',
+ cantFilas: 1,
+ cantColumnas: 16,
+ bordesDecorados: true,
+ relAspecto: 1,
+ };
+ }
+}
\ No newline at end of file
diff --git a/src/escenas/libroPrimaria/EscenaDesdeMapa.ts b/src/escenas/libroPrimaria/EscenaDesdeMapa.ts
index a75cee4..348a140 100644
--- a/src/escenas/libroPrimaria/EscenaDesdeMapa.ts
+++ b/src/escenas/libroPrimaria/EscenaDesdeMapa.ts
@@ -94,11 +94,13 @@ abstract class EscenaDesdeMapa extends EscenaActividad {
llenarCasilla(cuadricula : Cuadricula, casilla : Casilla, mapa : MapaEscena) : void {
let nroFila : number = casilla.nroFila;
let nroColumna : number = casilla.nroColumna;
- let id : string = mapa[nroFila][nroColumna];
- if (id != '' && id != ' ' && id != '-') { // si no es casilla libre
- let actor = this.mapearIdentificadorAActor(id, nroFila, nroColumna);
- cuadricula.agregarActorEnCasilla(actor, casilla, true);
- }
+ let ids : string[] = mapa[nroFila][nroColumna].split("&");
+ ids.forEach(id => {
+ if (id != '' && id != ' ' && id != '-') { // si no es casilla libre
+ let actor = this.mapearIdentificadorAActor(id, nroFila, nroColumna);
+ cuadricula.agregarActorEnCasilla(actor, casilla, true);
+ }
+ })
}
/**
@@ -267,7 +269,9 @@ class GeneradorDeMapasAleatorios implements GeneradorDeMapas {
var semillasEncoladas = this._semillasEncoladas;
this._semillasEncoladas = [];
semillasEncoladas.forEach(e => {
- mapa[e.pos[0]][e.pos[1]] = e.semilla.germinar(this, e.pos);
+ const contenidoOriginal = mapa[e.pos[0]][e.pos[1]]
+ const nuevoContenido = e.semilla.germinar(this, e.pos)
+ mapa[e.pos[0]][e.pos[1]] = `${contenidoOriginal}&${nuevoContenido}`;
}, this);
}
this.vaciarAnotadosParaColecciones();
@@ -362,7 +366,7 @@ interface GeneradorDeCasilla {
}
/**
- * Contenedor temporario para la string que representará el contenido de una casilla
+ * Contenedor temporal para la string que representará el contenido de una casilla
* de un mapa. Se utiliza durante el proceso de generación de un mapa aleatorio.
*/
class SemillaDeCasilla {
@@ -386,6 +390,23 @@ class SemillaDeCasilla {
};
}
+class SemillaCompuesta extends SemillaDeCasilla {
+ semillas: SemillaDeCasilla[]
+
+ constructor(semillas: SemillaDeCasilla[]) {
+ super();
+ this.semillas = semillas;
+ }
+
+ public seraVacia(): boolean {
+ return this.semillas.every(semilla => semilla.seraVacia())
+ }
+
+ public germinar(generador: GeneradorDeMapasAleatorios, pos: [number, number]): string {
+ return this.semillas.map(semilla => semilla.germinar(generador,pos)).join("&")
+ }
+}
+
/** Corresponde a identificadores de la forma `[a-zA-Z0-9]+`. */
class GeneradorDeCasillaSimple implements GeneradorDeCasilla {
constructor(private id : string) {}
@@ -440,6 +461,19 @@ class GeneradorDeCasillaMaybe implements GeneradorDeCasilla {
return 0 < proba && proba < 1;
}
}
+class GeneradorDeCasillaAnd implements GeneradorDeCasilla {
+ constructor(private generador1 : GeneradorDeCasilla, private generador2: GeneradorDeCasilla) {}
+
+ generarSemillaDeCasilla(generador : GeneradorDeMapasAleatorios) : SemillaDeCasilla {
+ const semilla1: SemillaDeCasilla = this.generador1.generarSemillaDeCasilla(generador)
+ const semilla2: SemillaDeCasilla = this.generador2.generarSemillaDeCasilla(generador)
+ return new SemillaCompuesta([semilla1, semilla2])
+ }
+
+ esAleatorioPara(generador): boolean {
+ return this.generador1.esAleatorioPara(generador) || this.generador2.esAleatorioPara(generador)
+ }
+}
/** Corresponde al modificador `|` (recursivo). */
class GeneradorDeCasillaOpcion implements GeneradorDeCasilla {
diff --git a/src/escenas/libroPrimaria/EscenaYvoty.ts b/src/escenas/libroPrimaria/EscenaYvoty.ts
index cde27b2..b363933 100644
--- a/src/escenas/libroPrimaria/EscenaYvoty.ts
+++ b/src/escenas/libroPrimaria/EscenaYvoty.ts
@@ -22,7 +22,7 @@ class EscenaYvoty extends EscenaDesdeMapa {
}
ajustarGraficos() {
- this.automata.escala *= this.escalaSegunCuadricula(1.8);
+ this.automata.escala *= this.escalaSegunCuadricula(1.75);
this.automata.setY(this.automata.getY() + this.automata.getAlto() / 4);
this.obtenerActoresConEtiqueta("Luciernaga").forEach(actor => {
@@ -69,10 +69,6 @@ class EscenaYvoty extends EscenaDesdeMapa {
return new Obstaculo(archivosObstaculos, (fila + 1) + (fila + 1) * (columna + 1));
}
- todosLosActoresCumplen(actor, estado) {
- return this.obtenerActoresConEtiqueta(actor).every(o => o.nombreAnimacionActual() == estado);
- }
-
luciernagasDespiertas(): boolean {
return this.todosLosActoresCumplen("Luciernaga", "despierta")
}
@@ -89,10 +85,6 @@ class EscenaYvoty extends EscenaDesdeMapa {
return this.todosLosActoresCumplen("CompuAnimada", "prendida")
}
- noHay(actor): boolean {
- return this.contarActoresConEtiqueta(actor) == 0
- }
-
estaResueltoElProblema(): boolean {
return this.luciernagasDespiertas() && this.celularResuelto() && this.noHay("Mariposa") && this.computadorasPrendidas()
}
diff --git a/src/gramaticaAleatoria.ne b/src/gramaticaAleatoria.ne
index bb8d5a6..994bb5d 100644
--- a/src/gramaticaAleatoria.ne
+++ b/src/gramaticaAleatoria.ne
@@ -33,6 +33,8 @@ Option -> Subterm2 _ "|" _ Subterm2
Subterm2 -> Atom {% id %}
| Maybe {% id %}
+ | And {% id %}
+
Maybe -> Atom _ "?" {% d => new GeneradorDeCasillaMaybe(d[0]) %}
| Atom _ "?" _ "(" _ decimal _ ")"
{% d => new GeneradorDeCasillaMaybe(d[0],d[6]) %}
@@ -50,3 +52,5 @@ Col -> "*" {% d => new GeneradorDeCasillaColeccion() %}
Nil -> "-" {% d => new GeneradorDeCasillaVacia() %}
Macro -> "#" _ Id {% d => new GeneradorDeCasillaMacro(d[2]) %}
+
+And -> Atom _ "&" _ Atom {% d => new GeneradorDeCasillaAnd(d[0], d[4]) %}
\ No newline at end of file