Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Capítulo 2 - JSON
Capítulo 2 - JSON
JSON que tiene los métodos disponibles para convertir entre ellos.
Un objeto JSON puede ser almacenado en su propio archivo, que es
básicamente sólo un archivo de texto con una extension .json, y una MIME type
de application/json.
Empezamos creando un fichero JSON con cualquier editor de texto plano (Te
aconsejo utilizar ALTOVA). El fichero está guardado como alumnos.JSON y su
contenido es el siguiente
{
"squadName": "Super hero squad",
"homeTown": "Metro City",
"formed": 2016,
"secretBase": "Super tower",
"active": true,
"members": [
{
"name": "Molecule Man",
"age": 29,
"secretIdentity": "Dan Jukes",
"powers": [
"Radiation resistance",
"Turning tiny",
"Radiation blast"
]
},
{
"name": "Madame Uppercut",
"age": 39,
"secretIdentity": "Jane Wilson",
"powers": [
"Million tonne punch",
"Damage resistance",
"Superhuman reflexes"
]
},
{
"name": "Eternal Flame",
"age": 1000000,
"secretIdentity": "Unknown",
"powers": [
"Immortality",
"Heat Immunity",
"Inferno",
"Teleportation",
"Interdimensional travel"
]
}
]
}
superHeroes['members'][1]['powers'][2]
.
3.- Arreglos como JSON
Anteriormente se mencionó que el texto JSON básicamente se parece a un
objeto JavaScript, y esto es en gran parte cierto. La razón de esto es que un
arreglo es también un JSON válido, por ejemplo:
[
{
"name": "Molecule Man",
"age": 29,
"secretIdentity": "Dan Jukes",
"powers": [
"Radiation resistance",
"Turning tiny",
"Radiation blast"
]
},
{
"name": "Madame Uppercut",
"age": 39,
"secretIdentity": "Jane Wilson",
"powers": [
"Million tonne punch",
"Damage resistance",
"Superhuman reflexes"
]
}
]
<section>
</section>
Además de un elemento <script> que contiene el código JavaScript que se
escribirá en este ejercicio. En este momento sólo contiene dos líneas, que
hacen referencia a los elementos <header> y <section> y los almacena en
variables:
var header = document.querySelector('header');
var section = document.querySelector('section');
Los datos JSON se encuentran disponibles en GitHub en el siguiente enlace
https://mdn.github.io/learning-area/javascript/oojs/json/superheroes.json.
Los datos se cargarán en esta página, y se desplegarán a través de la
manipulación del DOM, como ésta:
Obteniendo el JSON
Sección
Para obtener el JSon, se utilizara un API llamado XMLHttpRequest (a menudo
llamado XHR). Éste en un objeto JavaScript muy útil que permite realizar
solicitudes de red para recuperar recursos desde un servidor vía JavaScript
(por ejemplo: imágenes, texto, JSON, incluso pequeños HTML), con lo que es
posible actualizar pequeñas secciones de contenido sin tener que volver a
cargar la página entera. Con ello se obtienen páginas web más interactivas,
pero está fuera del alcance de este artículo, para ser enseñado con mucho
detalle.
1. Para empezar, se debe almacenar la URL del JSON que se quiere
recuperar en una variable. Agregue lo siguiente al final del código JavaScript:
var requestURL = 'https://mdn.github.io/learning-
area/javascript/oojs/json/superheroes.json';
• • Para crear una solicitud, se necesita crear una nueva instancia de objeto
de solicitud desde el constructorXMLHttpRequest, utilizando la palabra clave
new. Agregue lo siguiente a continuación de la última línea:
var request = new XMLHttpRequest();
• • Ahora es necesario abrir una nueva solicitud utilizando el método open().
Agregue la siguiente línea:
request.open('GET', requestURL);
• Esto toma al menos dos parámetros — Existen otros parámetros opcionales
disponibles. Sólo se requieren los dos mandatorios para este ejemplo:
• El método HTTP a usar cuando se hace una solicitud en red. En este
caso GET es adecuado, dado que sólo se estan recuperando algunos datos
simples.
• La URL a la que se realiza la solicitud — esta es la URL del archivo que
se almacenó antes.
• Luego, agregue las siguientes dos lineas — acá se está programando el
responseType al JSON, de esta forma ese XHR sabe que el servidor estará
retornando JSON, y que esto debería ser convertido en segundo plano en un
objeto JavaScript. Entonces se envía la solicitud con el método send():
request.responseType = 'json';
request.send();
• • La última parte de esta sección comprende la espera por la respuesta a
retornar desde el servidor y luego, manejarla. Agregue el siguiente código bajo
el código previo:
request.onload = function() {
var superHeroes = request.response;
populateHeader(superHeroes);
showHeroes(superHeroes);
}
5.
En este punto se está almacenando la respuesta a la solicitud (disponible en la
propiedad response) en una variable llamada superHeroes; esta variable ahora
contendrá el objeto JavaScript basado en el JSON. Luego se pasa el objeto a
dos llamadas de función — la primera llenara el <header> con los datos
correctos, mientras la segunda creará una tarjeta de información para cada
héroe en el equipo, y la insertará en <section>.
Se ha contenido el código en un manejador de eventos que se activa cuando el
evento carga gatilla el objeto solicitud (ver onload) — esto es porque el evento
carga gatilla cuando la respuesta ha sido retornada de forma exitosa; de esta
manera se garantiza que request.response estará definitivamente disponible
cuando se intente hacer algo con ella.
Poblando el encabezado
Sección
Se han obtenido los datos desde el JSON y convertidos en un objeto de
JavaScript. Ahora, se utilizarán estos datos escribiendo las dos funciones que
fueron referenciadas previamente. Antes que todo, agregue la siguiente
definición de función a continuación del código previo:
function populateHeader(jsonObj) {
var myH1 = document.createElement('h1');
myH1.textContent = jsonObj['squadName'];
header.appendChild(myH1);
myH2.textContent = heroes[i].name;
myPara1.textContent = 'Secret identity: ' + heroes[i].secretIdentity;
myPara2.textContent = 'Age: ' + heroes[i].age;
myPara3.textContent = 'Superpowers:';
myArticle.appendChild(myH2);
myArticle.appendChild(myPara1);
myArticle.appendChild(myPara2);
myArticle.appendChild(myPara3);
myArticle.appendChild(myList);
section.appendChild(myArticle);
}
}
Para empezar, se almacena la propiedad members del objeto JavaScript en
una nueva variable. Este arreglo contiene múltiples objetos que contienen la
información para cada héroe.
A continuación, se utiliza un ciclo for para recorrer cada objeto en el arreglo.
Para cada uno:
1. Se crean varios elementos nuevos: un<article>, un <h2>, tres <p>s, y
una <ul>.
2. Se asigna al <h2> para que muestre el name del héroe.
3. Se completan los tres párrafos con su secretIdentity, age, y una línea
que diga "Superpowers:" para introducir la información de la lista.
4. Se almacena la propiedad powers en otra variable nueva llamada
superPowers — que contiene un arreglo que lista los superpoderes del héroe
actual.
5. Para recorrer los superpoderes del héroe, se utiliza otro ciclo for — para
cada uno se crea un elemento <li>, se asigna el superpoder a él, y luego se
pone el listItem dentro del elemento <ul> (myList) utilizando appendChild().
6. Lo último es agregar los <h2>, <p>s, y <ul> dentro del <article>
(myArticle), luego se agrega <article> dentro de <section>. El orden en que las
cosas son agregadas es importante, dado que este es el orden en ell que
aparecerán dentro del HTML.
Nota: Si tiene problemas en lograr que el ejemplo funcione, intente con el
código fuente heroes-finished.html (vea también running live.)
Nota: Si encuentra dificultades en seguir la notacion de punto/corchete que se
utiliza para acceder a los objetos de JavaScript, puede ser útil tener el archivo
superheroes.json abierto en otra pestaña o en su editor de texto, y revisarlo
mientras observa el código JavaScript. También puede referirse al artículo
JavaScript object basics para mayor información sobre la notación de punto y
corchete.
Conversiones entre objetos y texto
Sección
El ejemplo anterior era simple en términos de acceder al objeto JavaScript,
porque se programó la solicitud XHR para convertir el JSON de respuesta
directamente en un objeto de JavaScript utilizando:
request.responseType = 'json';
En algunas ocasiones, se recibirá una cadena JSON sin procesar, y será
necesario convertirla en un objeto. Y cuando sea necesario enviar un objeto
Javascript a través de la red, será necesario convertirlo a un JSON (una
cadena) antes de ser enviado. Afortunadamente, estos dos problemas son muy
comunes en el desarrollo web por lo que un objeto JSON integrado está
disponible en los navegadores, que contiene los siguientes dos métodos:
• parse(): Acepta una cadena JSON como parámetro, y devuelve el objeto
JavaScript correspondiente.
• stringify(): Acepta un objeto como parámetro, y devuelve la forma de
cadena JSON equivalente.
El primer método se puede observar en el ejemplo heroes-finished-json-
parse.html (vea el código fuente) — que realiza exactamente lo mismo que el
ejemplo que se construyó previamente, excepto porque se determinó que el
XHR devolviera el texto JSON sin procesar, luego se utiliza parse() para
convertirlo en un objeto JavaScript. El extracto del código es el siguiente:
request.open('GET', requestURL);
request.responseType = 'text'; // now we're getting a string!
request.send();
request.onload = function() {
var superHeroesText = request.response; // get the string from the response
var superHeroes = JSON.parse(superHeroesText); // convert it to an object
populateHeader(superHeroes);
showHeroes(superHeroes);
}
Como es de suponer, stringify() trabaja de la forma opuesta. Intente ingresar
las siguientes líneas en la consola de JavaScript de su navegador para verlo en
acción:
var myJSON = { "name": "Chris", "age": "38" };
myJSON
var myString = JSON.stringify(myJSON);
myString
En este caso, se ha creado un objeto JavaScript, luego se comprueba lo que
contiene, y entonces se convierte en una cadena JSON utilizando stringify() —
guardando el valor retornado en una variable nueva — y comprobándolo
nuevamente.
Resumen
Sección
En este artículo, se ha entregado una guía simple para utilizar JSON en sus
programas, incluyendo cómo crear y leer JSON, y cómo acceder a los datos
almacenados en él. En el artículo siguiente, se verá JavaScript orientado a
objetos.
Ejercicio práctico de construcción de objetos
•
• •
• Editar
• •
Esta traducción está incompleta. Por favor, ayuda a traducir este artículo del
inglés.
Anterior Overview: Objects Siguiente
En este ejemplo se utilizará Canvas API para dibujar las pelotas en la pantalla
y la API requestAnimationFrame para animar todo el contenido de la pantalla.
No es necesario que conozca estas funciones previamente. Esperamos que al
final de este artículo, quizás pueda estar interesado en explorar su uso y
capacidades más en detalle. Durante este desarrollo usaremos objetos y
algunas técnicas para hacer que las pelotas puedan rebotar en los bordes y
comprobar cuando choquen entre ellas (ésto se conoce como detección de
colisiones).
Primeros pasos
Sección
Para comenzar haga una copia en su computador de los archivos: index.html,
style.css, y main.js. Estos contienen:
1. Un documento HTML sencillo con un elemento <h1>, un elemento
<canvas> en el que podamos dibujar los gráficos y otros elementos para aplicar
los estilos CSS y el código JavaScript.
2. Algunos estilos sencillos que servirán para ubicar el elemento <h1>,
ocultar la barra de desplazamiento y los margenes del borde de la página (para
que luzca mejor).
3. Un archivo JavaScript que sirve para definir el elemento <canvas> y las
funciones que vamos a usar.
La primera parte del script es:
var canvas = document.querySelector('canvas');
this.x += this.velX;
this.y += this.velY;
}
Las cuatro primeras partes de la función verifican si la pelota a alcanzado el
borde del canvas. Si es así, se invierte la dirección de la velocidad, para que la
pelota se mueva en la dirección contraria. Así, si la pelota va hacia arriba, (velY
positiva) , entonces la velocidad vertical es cambiada, para que se mueva hacia
abajo (velY negativa).
Los cuatro posibles casos son:
• Verificar si la coordenada x es mayor que el ancho del canvas (la pelota
está saliendo por el borde derecho).
• Verificar si la coordenada x es menor que la coordenada 0 (la pelota está
saliendo por el borde izquierdo)
• Verificar si la coordenada y es mayor que la altura del canvas (la pelota
está saliendo por el borde inferior).
• Verificar si la coordenada y es menor que la coordenada 0 ( la pelota
está saliendo por el borde superior).
En cada caso, se ha tenido en cuenta el tamaño (size) de la pelota en los
cálculos, ya que las coordenadas x e y corresponden al centro de la pelota,
pero lo que queremos ver es el borde de la pelota cuando choca con el
perímetro del canvas — que la pelota rebote, cuando está a medio camino
fuera de el —.
Las dos últimas líneas de código, suman la velocidad en x (velX) al valor de la
coordenada x , y el valor de la velocidad en y (velY) a la coordenada y — con
esto se consigue el efecto de que la pelota se mueva cada vez que este
método es llamado.
Llegados a este punto: ¡continuemos, con las animaciones!
Animando las pelotas
Sección
Hagamos esto divertido! Ahora vamos a empezar a añadir pelotas al canvas, y
animándolas.
1. Primero, necesitamos algún sitio donde guardas las pelotas. El siguiente
arreglo hará esta función — añádela al final de tu código.
var balls = [];
Todos los programas que generan animaciones normalmente tienen un bucle
de animación, que sirve para actualizar los datos del programa, para entonces
generar la imagen correspondiente; esta es la estrategia básica para la mayor
parte de juegos y programas similares.
2. Añadamos las siguientes instrucciones al final del código:
function loop() {
ctx.fillStyle = 'rgba(0, 0, 0, 0.25)';
ctx.fillRect(0, 0, width, height);
requestAnimationFrame(loop);
}
Nuestra función de bucle: loop(), hace lo siguiente:
• Define el color de relleno del canvas como negro semi-transparente,
entonces dibuja un rectángulo en todo el ancho y alto del canvas, usando
fillRect(), (los cuatro parámetros definen las coordenadas de origen, el ancho y
el alto del rectángulo). Esto es para cubrir el dibujo del instante anterior antes
de actualizar el nuevo dibujo. Si no se realiza este paso, resultará en las
imágenes se irán apilando y veremos una especie de serpientes según se
mueven por el canvas en vez de las pelotas moviéndose! El color de relleno se
define como semitransparente, rgba(0,0,0,0.25), lo que nos permite que
podamos intuir algunos de los dibujos de instantes anteriores, con lo que
podremos recrear un poco el efecto de estelas detrás de las pelotas, según se
mueven. Pruebe a variar este número para ver como resulta el efecto.
• Se crea una nueva instancia de la pelota Ball() usando un número
aleatorio mediante la función random(), entonces se añade este elemento al
final del arreglo de las pelotas, push(), pero unicamente si el número de
pelotas es menor que 25. Así cuando tengamos 25 pelotas en la pantalla, no
crearemos nuevas pelotas. Pruebe a variar el número de pelotas en el código:
balls.length < 25. Dependiendo de la capacidad de procesamiento del
navegador, un número de pelotas muy alto podría ralentizar significativamente
la animación. ¡asi que cuidado!
• Se recorre el bucle por todo el conjunto de pelotas balls y se ejecuta el
método para dibujar, draw(), cada una de las pelotas, y actualizar sus datos,
update(), en cada una de ellas, así se conservarán las nuevas posiciones y
velocidades para el siguiente intervalo de animación.
• Se ejecuta la función de nuevo mediante el método
requestAnimationFrame() - cuando este método está continuamente
ejecutándose y llama a la misma función, esto ejecutará la función de
animación un determinado número de veces por segundo para crear una
animación fluida. Esto se realiza normalmente de forma recursiva — lo que
quiere decir que la función se llama a sí misma cada vez que se ejecuta, de
esa manera se ejecutará una y otra vez de forma continua.
3. Por último, pero no menos importante, añadimos la siguiente línea, al final
del código.-- es necesario llamar a la función inicialmente para que la
animación comience.
loop();
Eso es todo para la parte básica — pruebe a guardar el código y refrescar el
navegador para comprobar si aparecen las pelotas rebotando!
Añadiendo la detección de colisiones
Sección
Ahora, un poco de diversión, añadamos la detección de colisiones a nuestro
código. Así las pelotas, sabrán cuando chocan unas contra otras.
1. El primer paso, será añadir el código a continuación a continuación de
donde se definió el método update(). (en código de Ball.prototype.update)
2. Ball.prototype.collisionDetect = function() {
3. for (var j = 0; j < balls.length; j++) {
4. if (!(this === balls[j])) {
5. var dx = this.x - balls[j].x;
6. var dy = this.y - balls[j].y;
7. var distance = Math.sqrt(dx * dx + dy * dy);
8.
9. if (distance < this.size + balls[j].size) {
10. balls[j].color = this.color = 'rgb(' + random(0, 255) + ',' + random(0,
255) + ',' + random(0, 255) +')';
11. }
12. }
13. }
}
• Esta función es un poco complicada, así que no hay que preocuparse mucho
si de momento no se comprende del todo.
• Para cada pelota, necesitamos comprobar si chocará con cada una de
las otras pelotas. Para esto, en un bucle for para recorrer todas las pelotas.
• Dentro del bucle, usamos un if para comprobar si la pelota que estamos
mirando en ese ciclo del bucle for es la pelota que estamos mirando. No
queremos mirar si una pelota ha chocado consigo misma. Para esto miramos si
la pelota actual (es decir la pelota que está invocando al método que resuelve
la detección de colisiones) es la misma que la indicada por el bucle. Usamos un
operador ! para indicar una negación en la comparación, así que el código
dentro de la condición solo se ejecuta si estamos mirando dos pelotas
distintas.
• Usamos un algoritmo común para comprobar la colisión de los dos
pelotas. Básicamente miramos si el área de dos círculos se superponen. Esto
se explica mejor en el enlace detección de colision 2D.
• En este caso, únicamente se define la propiedad de color para las dos
pelotas, cambiándolas a un nuevo color aleatorio. Se podría haber hecho cosas
más complicadas, como que las pelotas rebotasen una con la otra de forma
realista, pero esto habría supuesto un desarrollo más complejo. Para
desarrollar esos efectos de simulación física, los desarrolladores tienden a usar
librerías de física como PhysicsJS, matter.js, Phaser, etc.
• También es necesario llamar este método en cada instante de la animación.
balls[i].update(); en la línea:
balls[i].collisionDetect();
2.
3. Guardar y refrescar la demo de nuevo y podrá ver como las pelotas
cambian de color cuando chocan entre ellas.
Nota: Si tiene problemas para hacer funcionar este ejemplo, puede comparar
su código JavaScript, con el código de la version_final (y también ver como
funciona al ejecutarla).
Resumen
Sección
Esperamos que se haya divertido escribiendo su propio mundo de pelotas que
chocan aleatoriamente, usando objetos y programación orientada a objetos.
Esto debería haberle dado una práctica útil y haber sido un buen ejemplo.
Añadiendo características a nuestra demo de bouncing balls
•
• •
• Editar
• •
Saltar a:
1. Punto de partida
2. Resumen del proyecto
3. Pasos para completar
4. Consejos
5. Evaluación
6. En este módulo
Esta traducción está incompleta. Por favor, ayuda a traducir este artículo del
inglés.
Anterior Overview: Objects
En esta evaluación, se espera que use la demo de bouncing balls del artículo
anterior como punto de partida y le agregue algunas características nuevas e
interesantes.
Prerrequisitos: Antes de intentar esta evaluación, debería haber revisado
todos los artículos de este módulo.
Objetivo: Para probar la comprensión de objetos JavaScript y
construcciones orientadas a objetos.
Punto de partida
Sección
Para iniciar esta evaluación, haz una copia local de index-finished.html,
style.css, y main-finished.js de nuestro último artículo en un nuevo directorio en
tu ordenador.
Nota: Alternativamente, puede usar un sitio como JSBin o Thimble para hacer
su evaluación. Puede pegar el HTML, CSS y JavaScript en uno de estos
editores en línea. Si el editor en línea que está utilizando no tiene paneles
JavaScript / CSS separados, sientase libre de poner en linea elementos
<script>/<style> dentro de la página.
Resumen del proyecto
Sección
Nuestra demostración de la pelota hinchable es divertida, pero ahora queremos
que sea un poco más interactiva agregando un círculo maligno controlado por
el usuario, que se los comería si los atrapa. Tambien queremos testar nuestras
destrezas como constructores de objetos creando un objeto Shape() genérico
de que puedan heredar nuestra pelota y el círculo maligno. Finalmente,
queremos añadir una puntuación para seguir el número de bolas que quedan
por capturar.
La siguiente captura de pantalla te da una idea de cómo debería verse el
programa final.
Para darle una idea eche un vistazo al ejemplo final (¡no mire el código fuente!)
Pasos para completar
Sección
Las siguientes secciones describen lo que debe hacer.
Creando nuestro nuevos objetos
Sección
Primero de todo, cambia la constructora existente de Ball() para que se
convierta en un constructor Shape() y añade un nuevo constructor Ball():
1. El constructor Shape() debe definir las propiedades x, y, velX, y velY del
mismo modo que lo hacía el constructor Ball() constructor original, pero no las
propiedades color y size.
2. También debe definir una nueva propiedad exists, que se utiliza para
realizar un seguimiento de si existen las bolas en el programa (no se han
comido por el círculo maligno). Debe ser un boolean (true/false).
3. El constructor Ball() debe heredar las propiedades x, y, velX, velY, y
exists del constructor Shape().
4. También debe definir propiedades color y size, como el constructor
original Ball() hacía.
5. Recuerda configurar el prototype del constructor Ball() correctamente.
Los métodos de la pelota draw(), update(), y collisionDetect() deben ser
capaces de permanecer exactamente igual que antes.
También necesitas añadir un parámetro nuevo a la llamada del constructor new
Ball() ( ... ) — El parámetro exists debe ser el quinto parámetro y debe tener un
valor true.
En este punto, intente volver a cargar el código; debería funcionar igual que
antes, con nuestros objetos rediseñados.
Definiendo EvilCircle()
Sección
Ahora es el momento de conocer al chico malo: ¡el EvilCircle()! Nuestro juego
solo involucrará un círculo malvado, pero lo vamos a seguir definiendo usando
un constructor que hereda de Shape() para que tengas algo de práctica. Es
posible que desee agregar otro círculo a la aplicación más adelante que pueda
ser controlado por otro jugador o tener varios círculos malvados controlados
por computadora. Probablemente no vas a dominar el mundo con un solo
círculo maligno, pero servirá para esta evaluación.
El constructor EvilCircle() debe heredar x, y, velX, velY, y exists from Shape(),
pero velX y velY debe ser igual a 20.
Debería hacer algo como Shape.call(this, x, y, 20, 20, exists);
Debe definir también sus propias propiedades, como las siguientes:
• color — 'white'
• size — 10
Otra vez, recuerda definir tus propiedades heredadas como parámetros en el
constructor, y configura las propiedades prototype y constructor properties
correc.tamente
Definiendo los métodos de EvilCircle()
Sección
EvilCircle() debe tener cuatro métodos como se desciben a continuación.
draw()
Este método tiene el mismo propósito que el método draw()de Ball(): Se
encarga de dibujar la instancia del objeto en el lienzo. Funcionarán de una
forma muy similar, así que puedes empezar copiando la definición de
Ball.prototype.draw. Luego deberías hacer los siguientes cambios.:
• Queremos que el círculo del mal no se complete, sino que simplemente
tenga una línea exterior (trazo). Puedes lograr esto actualizando fillStyle y fill()
a strokeStyle y stroke().
• También queremos que el trazo sea un poco más grueso, para que
puedas ver el círculo malvado con mayor facilidad. Podemos lograr esto
configurando un valor para lineWidth en algún lugar después de la llamada
beginPath() (3 hará).
checkBounds()
Este método hara lo mismo que la primera parte de la función update() de Ball()
— mire para ver si el círculo maligno va a salir del borde de la pantalla y evite
que lo haga. De nuevo, puede copiar la mayoría de la definición de
Ball.prototype.update, hay algunos cambios que debe hacer:
• Deshazte de las dos últimas líneas: no queremos actualizar
automáticamente la posición del círculo maligno en cada cuadro, porque lo
moveremos de alguna otra manera, como verás a continuación.
• Dentro de las declaraciones if(), si el test devuelve true no queremos
actualizar velX/velY; queremos cambiar el valor de x/y por lo que el círculo del
mal se rebota en la pantalla ligeramente. Agregar o restar (según corresponda)
la propiedad de tamaño del círculo maligno (size) tendría sentido.
setControls()
Este método agregará un detector de eventos onkeydown al objeto window
para que cuando se presionen ciertas teclas del teclado, podamos mover el
círculo maligno. El siguiente bloque de código debe colocarse dentro de la
definición del método:
var _this = this;
window.onkeydown = function(e) {
if (e.keyCode === 65) {
_this.x -= _this.velX;
} else if (e.keyCode === 68) {
_this.x += _this.velX;
} else if (e.keyCode === 87) {
_this.y -= _this.velY;
} else if (e.keyCode === 83) {
_this.y += _this.velY;
}
}
Por tanto cuando se presiona una tecla, el evento del objeto keyCode se
consulta para averiguar que tecla se ha presionado. Si es uno de los cuatro
representados por los códigos clave especificados, entonces el círculo maligno
se moverá a la izquierda / derecha / arriba / abajo.
• Para obtener un punto de bonificación, avísenos a qué teclas se asignan
los códigos de clave especificados.
• Para otro punto de bonificación, ¿nos podrías decir por qué tenemos que
configurar var _this = this; en la posición en la que está? Es algo que se hace
en la función scope.
collisionDetect()
Este método actuará de una forma muy similar al método collisionDetect() de
Ball(), así que puede usar una copia de eso como una base para el nuevo
método. Pero hay algunas diferencias:
• En el exterior de la declaración if, ya no es necesario comprobar si la
bola actual en la iteración es la misma que la bola que está haciendo la
comprobación, porque ya no es una bola, ¡es el círculo del mal! En su lugar,
debe hacer una prueba para ver si existe la bola que se está verificando (¿con
qué propiedad podría hacerlo?). Si no existe, ya ha sido devorado por el círculo
maligno, por lo que no es necesario volver a comprobarlo.
• En el interior de la declaración if, ya no desea que los objetos cambien
de color cuando se detecta una colisión; en cambio, desea que no existan más
bolas que colisionen con el círculo maligno (una vez más, ¿cómo cree que
haría eso?).
Trayendo el círculo del mal al programa.
Sección
Ahora que hemos definido el círculo maligno, debemos hacerlo aparecer en
nuestra escena. Para hacerlo, necesitas hacer alguno cambios a la función
loop().
• Primero de todo, crea una nueva instancia del círculo maligno (especifica
los parámetros necesarios ), entonces llama al método setControls() . Solo
necesita hacer estas dos cosas una vez, no en cada iteración del bucle.
• En el punto en el que intera por todas las pelotas y llama a las funciones
draw(), update(), ycollisionDetect() para cada una, hazlo para que estas
funciones solo sean llamadas si la bola actual existe.
• Llama a los métodos de la instancia de la pelota maligna draw(),
checkBounds(), ycollisionDetect() en cada iteración del bucle.
Implementando el contador de puntuación.
Sección
Para implementar el contador de puntuación sigue estos pasos:
1. En tu archivo HTML añade un elemento <p> justo debajo del elemento
<h1> que contiene el texto "Ball count: ".
2. En tu archivo CSS, agregue la siguiente regla en la parte inferior:
3. p{
4. position: absolute;
5. margin: 0;
6. top: 35px;
7. right: 5px;
8. color: #aaa;
}
2.
3. En su JavaScript, realice las siguientes actualizaciones:
o Cree una variable que almacene una referencia al párrafo.
o Mantenga un recuento de la cantidad de bolas en la pantalla de alguna
manera.
o Incrementa el conteo y muestra el número actualizado de bolas cada vez
que se agrega una bola a la escena.
o Disminuye el conteo y muestra el número actualizado de bolas cada vez
que el círculo maligno se come una bola (hace que no exista).
Consejos
Sección
• Esta evaluación es bastante desafiante. Da cada paso despacio y con
cuidado.
• Puede ser una idea mantener una copia separada de la demostración
después de que cada etapa esté funcionando, para que pueda consultarla si se
encuentra en problemas más adelante.