Taller de Videojuegos con HTML 5 Creación del Videojuego Space Invaders

Documentos relacionados
Taller de Videojuegos con HTML 5 Creación del Videojuego Memoria

Taller de Videojuegos con HTML 5 Animación de objetos con HTML 5

Taller de Videojuegos con HTML 5 Dibujando en el Canvas del HTML 5

FUNDAMENTOS DE ROBÓTICA. Maestro: Ing. Marco Antonio López Paredes REPORTE DE PROGRAMA: ANALIZAR LOS OBSTACULOS DE ROBOTS EN UN TABLERO

Rogelio Ferreira Escutia

CAPTURAR EVENTOS DE TECLADO JAVASCRIPT. TECLA PULSADA. FROMCHARCODE. KEYCODE, WICH. (CU01161E)

Three.js-ESP Documentation. Versión latest

WHILE JAVASCRIPT. DO WHILE. CONTINUE PARA SALTAR BUCLE. BUCLES CON LABEL (ETIQUETA O NOMBRE). EJEMPLOS (CU01132E)

ESTRUCTURAS DE CONTROL REPETITIVAS

EFECTOS JAVASCRIPT VISUALES, DE IMÁGENES, TEXTO... RECURSIÓN. SETTIMEOUT NO FUNCIONA EN BUCLES FOR, WHILE,? (CU01166E)

HTML. Rogelio Ferreira Escutia

FOR JAVASCRIPT (BUCLES) CONOCER TAMAÑO DE UN ARRAY CON LENGTH. BREAK PARA DETENER EJECUCIÓN. EJEMPLOS Y EJERCICIOS (CU01131E)

JavaScript. Rogelio Ferreira Escutia

OBJETO WINDOW JAVASCRIPT. PROPIEDADES: NAME, INNERWIDTH, LENGTH,, OPENER, OUTERHEIGHT, PAGEXOFFSET, SCREENX (CU01173E)

JAVASCRIPT CREATEELEMENT, CREATETEXTNODE, APPENDCHILD. MODIFICAR PROPIEDAD ONCLICK CON JAVASCRIPT (CU01140E)

GUÍA N 5 PROGRAMACIÓN WEB - GRADO 11. Ing. Néstor Raúl Suarez Perpiñan Página 1 de 10

JavaScript. PDF created with pdffactory trial version (c) Juan Carlos Cano Todos los derechos reservados

Características de JavaScript

Aprenda los lenguajes HTML5, CSS3 y JavaScript para crear su primer sitio web

DISEÑO WEB CSS CON DOS, TRES O MÁS COLUMNAS CON FLOAT. WIDTH EN PORCENTAJES NO FUNCIONA? TIPOS DE ANCHO. EJEMPLOS. (CU01036D)

Creación del Hola Mundo en Android Studio. Rogelio Ferreira Escutia

Práctica 1 Objetivo Descripción:

PROPIEDADES VISIBILITY (VISIBLE, HIDDEN, COLLAPSE) Y OVERFLOW CSS. SCROLL. OVERFLOW- X Y OVERFLOW-Y. EJEMPLOS (CU01038D)

Desarrollo de Aplicaciones Web con PHP. Javier Enciso

Práctica No. 6. Manejo de Eventos con Javascript

Informática General 2018 Cátedra: Valeria Drelichman, Pedro Paleo, Leonardo Nadel, Norma Morales

Estructura General y Estilos Propios

STATIC JAVASCRIPT. PROPIEDADES Y MÉTODOS ESTÁTICOS O DE CLASE. EJERCICIO. CÓDIGO EJEMPLOS BÁSICOS (CU01148E)

CLOSURES JAVASCRIPT. EJEMPLOS. CONCEPTO: QUÉ SON Y PARA QUÉ SIRVEN. RETARDO DE EJECUCIÓN CON SETTIMEOUT Y CLOSURES. (CU01169E)

FUNCIÓN EVAL JAVASCRIPT. GETELEMENTSBY CLASSNAME. EJEMPLO CÓDIGO CALCULADORA SIMPLE (CU01133E)

Programa Formativo. Objetivos

Conceptos Teóricos de HTML5 (material extra adicional libro):

MÉTODOS DE WINDOW JAVASCRIPT. EFECTOS. CONFIRM, PROMPT, OPEN, MOVEBY, MOVETO, FOCUS, RESIZETO, CLOSE (CU01174E)

E4: BATALLA AVIONES. ISLAS: Estas imágenes irán apareciendo para dar sensación de avance del avión: isla1.png, isla2.png

DHTML: Parte 2 DOM. Introducción al desarrollo web. Laura Sirvent Collado Estudiante de Ingeniería Multimedia Universidad de Alicante (España)

Introducción al desarrollo web (idesweb) - 3 a ed.

Dibujar con HTML5 y JavaIO y PostrgreSQL JDBC

Lo básico de Javascript

Programando con J2ME. Rogelio Ferreira Escutia

API CANVAS HTML Y JAVASCRIPT. EJEMPLOS. DIBUJAR CÍRCULOS, FORMAS, GRÁFICOS, ANIMACIONES, JUEGOS, ETC. (CU01195E)

PRÁCTICA 7. VIDEOJUEGO. SPACE INVADERS

Producción Digital I. Lic. Wenceslao Zavala 7 de Junio 2018

IF ELSE, IF ELSE IF JAVASCRIPT. CONDICIONALES DEL FLUJO O ESTRUCTURAS DE DECISIÓN. EJEMPLOS. EJERCICIOS. (CU01119E)

Condicionales. Comparación. Combinación

Programación de videojuegos con LibGdx. Javier Villegas Gomez

IMAGE JAVASCRIPT. NEW IMAGE. COMPLETE, NATURALWIDTH. OBTENER TODAS LAS IMÁGENES DE UNA WEB CON DOCUMENT.IMAGES (CU01186E)

Autor: Karl Taüfer 1ra edición, diciembre da edición, enero 2012.

CONSTRUCTORES JAVASCRIPT. CREAR OBJETOS VACÍOS. AÑADIR PROPIEDADES Y MÉTODOS. OBJETOS ÚNICOS O SINGLETON. EJEMPLOS (CU01145E)

Creación de un juego de tenis en clase de informática mediante la utilización de Visual Basic.

CÓMO INICIAR UNA SESIÓN DE CONTROL REMOTO BAJO DEMANDA

HTMLELEMENT JAVASCRIPT. MÉTODOS FOCUS, BLUR. SUBMIT FORMULARIOS: DETENER ENVÍO. ONSUBMIT RETURN. EJEMPLOS. (CU01181E)

Patrones de Radiación. Rogelio Ferreira Escutia

Browserify (práctica)

GetTheGold. App Inventor 2. Que estás construyendo. Primeros pasos. Introducción. Preparándote. Configurar los componentes

Informática General Cátedra: Valeria Drelichman Pedro Paleo Leonardo Nadel Norma Morales

(*) Creo un directorio de trabajo llamado /bloggalpon/ en el directorio del usuario. (*) Inicializar el repositorio vacío.

MARCO (FRAME) Los frames se consiguen con las etiquetas <FRAMESET> y <FRAME>.

EJEMPLO RELOJ JAVASCRIPT. SETTIMEOUT, CLEARTIMEOUT, SETINTERVAL, REQUEST ANIMATIONFRAME. (CU01164E)

JAVASCRIPT VALIDAR CAMPO TEXTO NO VACÍO. QUE VALOR SEA NUMÉRICO. O CORREO ELECTRÓNICO EN FORMULARIOS. EJEMPLOS (CU01182E)

DPWEB I, Carrito de Compras Guardar, Ing. Tomas Urbina. Carrito de compras con PHP y MYSQL

Herramientas para construcción y prueba de sitios Web. Rogelio Ferreira Escutia

PROGRAMACIÓN EN JAVA. { una línea para definir, crear o ejecutar ; }

Curso de. HTML 5 y CSS 3. Por: Ing. Ubaldo Acosta.

Ejercicios - Introducción al desarrollo web para móviles

Juego 2: TENIS. Creamos los sprites (imágenes) a utilizar en el juego.

Codificación de animaciones Trabajo con imágenes, figuras y otros tipos de gráficos Gestión de datos usando LocalStorage

BANNERS CÍCLICOS CON JAVASCRIPT

Android Manejo de Eventos. Rogelio Ferreira Escutia

LABORATORIO COMPUTACIÓN GRAFICA

Tema 3, parte 5. Estilos dinámicos. Texto. Cambio de estilos. Animaciones.

JAVASCRIPT HOISTING. ERRORES FRECUENTES DE PROGRAMADORES Y CONSEJOS. PROBLEMAS PRECISIÓN DECIMAL (CU01190E)

Informática. JavaScript: Lenguaje de programación. Fco J. Martín Mateos Carmen Graciani

El programa en JavaScript debe ir encerrado entre la marca script e inicializada la propiedad type con la cadena text/javascript:

Manual de uso para desarrolladores Módulo generador de mapas dinámicos de multipuntos

Programación Web. Presentación del Curso. Rogelio Ferreira Escutia

TEXT-ALIGN, COLOR, TEXT- DECORATION, TEXT- INDENT, WHITE-SPACE NOWRAP, PRE, PRE- WRAP, PRE-LINE O NORMAL (CU01040D)

Programa Saiotek 2006 SMARTLAB. Entorno de Trabajo Inteligente Colaborativo y Programable

Visualización de Información

Godot Engine Tutorial Creando un personaje de plataformas Parte II

Manejo de eventos en JavaScript WEB-TECHNOLOGIES

Dibujo de figuras elementales

Conocimientos previos

SOLUCION EJERCICIOS VALIDACION DE FORMULARIOS

API GEOLOCATION Y API GOOGLE MAPS JAVASCRIPT. EJEMPLOS. INSERTAR MAPAS INTERACTIVOS, SATÉLITE, ETC. EN WEBS. EFECTOS. (CU01197E)

Fábrica de los videojuegos

Localizar direcciones en Google Maps con PHP

Introducción a ActionScript

Curso práctico de programación

jquery Mobile Dr. José Martín Molina Espinosa

PHP: Lenguaje de programación

Ejercicio 1 - La primera imagen

JavaScript permite realizar scripts con ambos métodos de programación: secuencial y basada en eventos.

Ganancia y Polarización. Rogelio Ferreira Escutia

JavaScript: Introducción

Jornadas Programar batallas de robots con RITA Entrenamiento en la construcción de batallas con RITA

Juan Ramón Pérez Pérez

PROGRAMACIÓN CON SCRATCH

Transcripción:

Taller de Videojuegos con HTML 5 Creación del Videojuego Space Invaders Rogelio Ferreira Escutia

Estructura Básica 2

Archivos Básicos marcianos.htm Estructura de la página Web. marcianos.css Diseño de la página. marcianos.js Funciones JavaScript para manejo del Canvas. 3

marcianos.htm <!DOCTYPE html> <html> <head> <title>marcianos</title> <meta charset="utf-8" /> <link rel="stylesheet" href="marcianos.css" /> <script language="javascript" src="marcianos.js"></script> </head> <body> <h1>canvas Invaders</h1> <canvas id="micanvas" width="600px" height="500px"> Tu navegador no soporta CANVAS </canvas> </body> </html> 4

marcianos.css /* marcianos.css */ body{ width:600px; margin:0 auto; h1{ text-align:center; #micanvas{ border:dotted 2px yellow; background:black; 5

marcianos.js // // // marcianos.js window.onload = arrancarcanvas; function arrancarcanvas(){ canvas=document.getelementbyid('micanvas'); if(canvas&&canvas.getcontext){ ctx=canvas.getcontext("2d"); if (ctx) { //Aqui va a ir el código else { alert("error al crear el contexto"); 6

7

Variables Globales 8

Variables Globales Agregamos las variables globales que utilizaremos a nuestro archivo marcianos.js 9

marcianos.js var canvas, ctx; var x = 100; var y = 100; var KEY_ENTER = 13; var KEY_LEFT = 37; var KEY_UP = 38; var KEY_RIGHT = 39; var KEY_DOWN = 40; var BARRA = 32; var imagen, imagenenemigo; var teclapulsada = null; var tecla = []; var colorbala = "red"; var balas_array = new Array(); var enemigos_array = new Array(); 10

Declarar Objetos 11

Declarar Objetos Declaramos en nuestro archivo marcianos.js, los objetos que utilizaremos en nuestro juego. 12

Declarar Objetos function Bala(x,y,w){ this.x = x; this.y = y; this.w = w; this.dibuja = function(){; function Jugador(x){ this.x = x; this.y = 450; this.dibuja = function(x){ this.x = x; ctx.drawimage(imagen, this.x, this.y, 30, 15); ; function Enemigo(x,y){ this.x = x; this.y = y; this.w = 35; this.veces = 0; this.dx = 5; this.ciclos = 0; this.num = 14; this.figura = true; this.vive = true; this.dibuja = function(){; // 13

Gráfico del Cañón 14

Cañón Nuestro cañón será el gráfico torre.fw.png el cual se coloca en el mismo directorio que nuestro código JavaScript: 15

Dibujar Cañón 16

Dibujar Cañón En nuestra función arrancarcanvas cargamos nuestro cañón y lo colocamos en el centro en la parte inferior: if (ctx) { //Aqui va a ir el código x = canvas.width/2; imagen = new Image(); imagen.src = "torre.fw.png"; imagen.onload = function(){ jugador = new Jugador(0); jugador.dibuja(canvas.width/2); anima(); else { alert("error al crear el contexto"); 17

Función anima() En el código anterior se manda llamar a anima que es una función que invoca al requestanimationframe(anima);" Que se encargar de ejecutar las funciones de verifica y pinta: function anima(){ requestanimationframe(anima); verifica(); pinta(); 18

Función verifica() En el código anterior se manda llamar a verifica que es una función que detecta si se presionó la flecha izquierda o derecha, e incrementa el contador respectivo: function verifica(){ if(tecla[key_right]) x+=10; if(tecla[key_left]) x-=10; 19

Función verifica() En el código anterior se manda llamar a verifica que es una función que detecta si se presionó la flecha izquierda o derecha, e incrementa el contador respectivo: function pinta(){ ctx.clearrect(0,0,canvas.width, canvas.height); jugador.dibuja(x); 20

Detectar tipo de objeto Se crea el código para detectar el tipo de objeto requestanimationframe que utiliza el navegador que estamos utilizando: window.requestanimationframe=(function(){ return window.requestanimationframe window.webkitrequestanimationframe window.mozrequestanimationframe function(callback){window.settimeout(callback,17); )(); 21

Detectar teclado Creamos una nueva sección (abajo de las funciones) para manejo de eventos (LISTENER). Este primer código sirve para detectar los eventos del teclado. /************* LISTENER **************/ document.addeventlistener("keydown",function(e){ teclapulsada=e.keycode; tecla[e.keycode]=true; ); document.addeventlistener("keyup",function(e){ tecla[e.keycode]=false; ); 22

23

Cañón y Balas 24

Verificar cañón (1) Hasta aquí, si seguimos oprimiendo las teclas izquierda derecha, el cañón sale de la pantalla, por lo cual modificamos la función verifica para si llega al borde de la ventana, no se incremente o decremente mas su coordenada x. También se verificar si se oprime la barra espaciadora. Si es así se crea una nueva bala y se pone en falso la bandera de la barra espaciadora, para que no se generen demasiadas balas. 25

Verificar cañón (2) function verifica(){ if(tecla[key_right]) x+=10; if(tecla[key_left]) x-=10; //Verifica cañon if(x>canvas.width-10) x = canvas.width -10; if(x<0) x = 0; //Disparo if(tecla[barra]){ balas_array.push(new Bala(jugador.x+12,jugador.y-3,5)); tecla[barra]=false; 26

Pintar balas Se modifica la función pinta. Se le agrega un ciclo para pintar las balas que se agregaron al arreglo de balas. function pinta(){ ctx.clearrect(0,0,canvas.width, canvas.height); jugador.dibuja(x); // for(var i=0; i<balas_array.length; i++){ if(balas_array[i]!=null){ balas_array[i].dibuja(); if(balas_array[i].y<0) balas_array[i] = null; 27

Pintar balas Se modifica la función bala para que también pinte las balas cuando se invoque: function Bala(x,y,w){ this.x = x; this.y = y; this.w = w; this.dibuja = function(){ ctx.save(); ctx.fillstyle = colorbala; ctx.fillrect(this.x, this.y, this.w, this.w); this.y = this.y - 4; ctx.restore(); ; 28

29

Naves Enemigas 30

Marcianos Nuestro marciano (invasor) será el gráfico invader.fw.png el cual se coloca en el mismo directorio que nuestro código JavaScript: 31

Pintar Marcianos Se modifica la función arrancarcanvas para que al momento de arranque, dibuje también a los marcianos. El código de esta función queda de la siguiente manera: 32

canvas = document.getelementbyid("micanvas"); if(canvas && canvas.getcontext){ ctx = canvas.getcontext("2d"); if(ctx){ x = canvas.width/2; imagen = new Image(); imagen.src = "torre.fw.png"; imagen.onload = function(){ jugador = new Jugador(0); jugador.dibuja(canvas.width/2); anima(); imagenenemigo = new Image(); imagenenemigo.src = "invader.fw.png"; imagenenemigo.onload = function(){ for(var i=0; i<5; i++){ for(var j=0; j<10; j++){ enemigos_array.push( new Enemigo(100+40*j, 30+45*i)); else { alert("error al crear tu contexto"); 33

Marcianos Se modifica la función Enemigo, para que se incorpore el dibujo del marciano: function Enemigo(x,y){ this.x = x; this.y = y; this.w = 35; this.veces = 0; this.dx = 5; this.ciclos = 0; this.num = 14; this.figura = true; this.vive = true; this.dibuja = function(){ ctx.drawimage(imagenenemigo,0,0,40,30, this.x, this.y, 35,30); ; 34

Marcianos Se modifica la función pinta para que pinte además del cañón y las balas, también los enemigos: function pinta(){ ctx.clearrect(0,0,canvas.width, canvas.height); jugador.dibuja(x); //Balas for(var i=0; i<balas_array.length; i++){ if(balas_array[i]!=null){ balas_array[i].dibuja(); if(balas_array[i].y<0) balas_array[i] = null; //Enemigos for(var i=0; i<enemigos_array.length; i++){ enemigos_array[i].dibuja(); 35

36

Moviendo las Naves Enemigas 37

Objeto Enemigo Modificamos el objeto Enemigo, para que dibuje los marcianos cada medio segundo, y los mueve haciendo saltos en pixeles. Movemos los marcianos de izquierda a derecha hasta que llegue al borde derecho, luego baja y ahora avanzan hacia la izquierda. 38

function Enemigo(x,y){ this.x = x; this.y = y; this.w = 35; this.veces = 0; this.dx = 5; this.ciclos = 0; this.num = 14; this.figura = true; this.vive = true; this.dibuja = function(){ //Retraso if(this.ciclos > 30){ //saltitos if(this.veces>this.num){ this.dx *= -1; this.veces = 0; this.num = 28; this.y += 20; this.dx = (this.dx>0)? this.dx++:this.dx--; else { this.x += this.dx; this.veces++; this.ciclos = 0; else { this.ciclos++; ctx.drawimage(imagenenemigo,0,0,40,30, this.x, this.y, 35,30); ; 39

40

Animando las Naves Enemigas 41

Objeto Enemigo Se modifica el objeto enemigo para que pinte de manera alternada los objetos del Spritesheet, y queda el código de la siguiente manera: 42

function Enemigo(x,y){ this.x = x; this.y = y; this.w = 35; this.veces = 0; this.dx = 5; this.ciclos = 0; this.num = 14; this.figura = true; this.vive = true; this.dibuja = function(){ //Retraso if(this.ciclos > 30){ //saltitos if(this.veces>this.num){ this.dx *= -1; this.veces = 0; this.num = 28; this.y += 20; this.dx = (this.dx>0)? this.dx++:this.dx--; else { this.x += this.dx; this.veces++; this.ciclos = 0; this.figura =!this.figura; else { this.ciclos++; if(this.figura){ ctx.drawimage(imagenenemigo,0,0,40,30, this.x, this.y, 35,30); else { ctx.drawimage(imagenenemigo,50,0,35,30, this.x, this.y, 35, 30); ; 43

44

Colisiones 45

Colisiones Ahora detectaremos cuando haya una colisión, es decir, que choque una bala con un marciano. Para lo anterior, primero modificamos la función anima, agregando la llamada a una nueva función llamada colisiones. function anima(){ requestanimationframe(anima); verifica(); pinta(); colisiones(); 46

Colisiones Creamos el código para la función colisiones function colisiones(){ for(var i=0; i<enemigos_array.length; i++){ for(var j=0; j<balas_array.length; j++){ enemigo = enemigos_array[i]; bala = balas_array[j]; if(enemigo!= null && bala!= null){ if((bala.x > enemigo.x)&& (bala.x < enemigo.x+enemigo.w)&& (bala.y > enemigo.y)&& (bala.y < enemigo.y+enemigo.w)){ enemigo.vive = false; enemigos_array[i] = null; balas_array[j] = null; 47

Colisiones Modificamos el objeto enemigo 48

function Enemigo(x,y){ this.x = x; this.y = y; this.w = 35; this.veces = 0; this.dx = 5; this.ciclos = 0; this.num = 14; this.figura = true; this.vive = true; this.dibuja = function(){ //Retraso if(this.ciclos > 30){ //saltitos if(this.veces>this.num){ this.dx *= -1; this.veces = 0; this.num = 28; this.y += 20; this.dx = (this.dx>0)? this.dx++:this.dx--; else { this.x += this.dx; this.veces++; this.ciclos = 0; this.figura =!this.figura; else { this.ciclos++; if(this.vive){ if(this.figura){ ctx.drawimage(imagenenemigo,0,0,40,30, this.x, this.y, 35,30); else { ctx.drawimage(imagenenemigo,50,0,35,30, this.x, this.y, 35, 30); else { ctx.fillstyle = "black"; ctx.fillrect(this.x, this.y, 35, 30); ; 49

Colisiones Modificamos el nuestra función de arrancarcanvas : 50

function arrancarcanvas(){ canvas = document.getelementbyid("micanvas"); if(canvas && canvas.getcontext){ ctx = canvas.getcontext("2d"); if(ctx){ x = canvas.width/2; imagen = new Image(); imagenenemigo = new Image(); imagenenemigo.src = "invader.fw.png"; imagen.src = "torre.fw.png"; imagen.onload = function(){ jugador = new Jugador(0); jugador.dibuja(canvas.width/2); anima(); imagenenemigo.onload = function(){ for(var i=0; i<5; i++){ for(var j=0; j<10; j++){ enemigos_array.push(new Enemigo(100+40*j, 30+45*i)); else { alert("error al crear tu contexto"); 51

Colisiones Modificamos el nuestra función de pinta : function pinta(){ ctx.clearrect(0,0,canvas.width, canvas.height); jugador.dibuja(x); //Balas for(var i=0; i<balas_array.length; i++){ if(balas_array[i]!=null){ balas_array[i].dibuja(); if(balas_array[i].y<0) balas_array[i] = null; //Enemigos for(var i=0; i<enemigos_array.length; i++){ if(enemigos_array[i]!= null){ enemigos_array[i].dibuja(); 52

53

Balas Enemigas 54

Balas Enemigas Agregamos 2 nuevas variables globales a nuestro código para controlar las balas enemigas: var canvas, ctx; var x = 100; var y = 100; var KEY_ENTER = 13; var KEY_LEFT = 37; var KEY_UP = 38; var KEY_RIGHT = 39; var KEY_DOWN = 40; var BARRA = 32; var imagen, imagenenemigo; var teclapulsada = null; var tecla = []; var colorbala = "red"; var balas_array = new Array(); var enemigos_array = new Array(); var balasenemigas_array = new Array(); var de; 55

Balas Enemigas Agregamos a nuestra función principal arrancarcanvas, la siguiente línea para que dibuje balas enemigas cada segundo y medio: de = settimeout(disparaenemigo,1500); 56

Balas Enemigas Nuestra función principal arrancarcanvas queda así: function arrancarcanvas(){ canvas = document.getelementbyid("micanvas"); if(canvas && canvas.getcontext){ ctx = canvas.getcontext("2d"); if(ctx){ x = canvas.width/2; imagen = new Image(); imagenenemigo = new Image(); imagenenemigo.src = "invader.fw.png"; imagen.src = "torre.fw.png"; imagen.onload = function(){ jugador = new Jugador(0); jugador.dibuja(canvas.width/2); anima(); imagenenemigo.onload = function(){ for(var i=0; i<5; i++){ for(var j=0; j<10; j++){ enemigos_array.push(new Enemigo(100+40*j, 30+45*i)); de = settimeout(disparaenemigo,1500); else { alert("error al crear tu contexto"); 57

Balas Enemigas Creamos la nueva función disparaenemigo, haciendo que disparen las 10 naves mas cercanas a nuestro cañón: function disparaenemigo(){ var ultimos = new Array(); for(var i=enemigos_array.length-1; i>0; i--){ if(enemigos_array[i]!=null){ ultimos.push(i); if(ultimos.length==10) break; d = ultimos[math.floor(math.random()*10)]; balasenemigas_array.push( new Bala(enemigos_array[d].x+enemigos_array[d].w/2, enemigos_array[d].y,5)); 58

Balas Enemigas Modificamos nuestra función pinta, para que también pinte a las balas enemigas: 59

Balas Enemigas function pinta(){ ctx.clearrect(0,0,canvas.width, canvas.height); jugador.dibuja(x); //Balas for(var i=0; i<balas_array.length; i++){ if(balas_array[i]!=null){ balas_array[i].dibuja(); if(balas_array[i].y<0) balas_array[i] = null; //Balas Enemigas for(var i=0; i<balasenemigas_array.length; i++){ if(balasenemigas_array[i]!=null){ balasenemigas_array[i].dispara(); if(balasenemigas_array[i].y>canvas.height) balasenemigas_array[i] = null; //Enemigos for(var i=0; i<enemigos_array.length; i++){ if(enemigos_array[i]!= null){ enemigos_array[i].dibuja(); 60

Balas Enemigas Modificamos nuestro objeto Bala : function Bala(x,y,w){ this.x = x; this.y = y; this.w = w; this.dibuja = function(){ ctx.save(); ctx.fillstyle = colorbala; ctx.fillrect(this.x, this.y, this.w, this.w); this.y = this.y - 4; ctx.restore(); ; this.dispara = function(){ ctx.save(); ctx.fillstyle = colorbala; ctx.fillrect(this.x, this.y, this.w, this.w); this.y = this.y + 6; ctx.restore(); ; 61

Balas Enemigas Modificamos nuestro función verifica : function verifica(){ if(tecla[key_right]) x+=10; if(tecla[key_left]) x-=10; //Verifica cañon if(x>canvas.width-10) x = canvas.width -10; if(x<0) x = 0; //Disparo if(tecla[barra]){ balas_array.push(new Bala(jugador.x+12,jugador.y-3,5)); tecla[barra]=false; disparaenemigo() 62

63

Detección de colisiones entre balas enemigas y cañón (fin del juego) 64

Fin de Juego Modificamos nuestro función colisiones para revisar si alguna de las balas chocó con nuestro cañón: 65

function colisiones(){ for(var i=0; i<enemigos_array.length; i++){ for(var j=0; j<balas_array.length; j++){ enemigo = enemigos_array[i]; bala = balas_array[j]; if(enemigo!= null && bala!= null){ if((bala.x > enemigo.x)&& (bala.x < enemigo.x+enemigo.w)&& (bala.y > enemigo.y)&& (bala.y < enemigo.y+enemigo.w)){ enemigo.vive = false; enemigos_array[i] = null; balas_array[j] = null; for(var j=0; j<balasenemigas_array.length; j++){ bala = balasenemigas_array[j]; if(bala!= null){ if((bala.x > jugador.x)&& (bala.x < jugador.x+jugador.w)&& (bala.y > jugador.y)&& (bala.y < jugador.y+jugador.h)){ gameover(); 66

Fin de Juego SE observa que la función anterior manda llamar a la función gameover cuando hay una colisión entre una bala enemiga y mi cañón, y el código es el siguiente: function gameover(){ alert("kapuuuum"); 67

Fin de Juego Agregamos a nuestro objeto Jugador su tamaño para que sea detectado cuando choque con una bala enemiga, y el código queda así: function Jugador(x){ this.x = x; this.y = 450; this.w = 30; this.h = 15; this.dibuja = function(x){ this.x = x; ctx.drawimage(imagen, this.x, this.y, this.w, this.h); ; 68

69

Rogelio Ferreira Escutia Instituto Tecnológico de Morelia Departamento de Sistemas y Computación Correo: rogelio@itmorelia.edu.mx rogeplus@gmail.com Página Web: http://antares.itmorelia.edu.mx/~kaos/ http://www.xumarhu.net/ Twitter: Facebook: http://twitter.com/rogeplus http://www.facebook.com/groups/xumarhu.net/ 70