Foros del Web » Programando para Internet » Javascript »

Problema con drawImage en videojuego

Estas en el tema de Problema con drawImage en videojuego en el foro de Javascript en Foros del Web. Buenas noches, Estoy intentando hacer videojuegos con HTML5 y Javascript. Basándome en un tutorial hice lo siguiente: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código HTML: Ver original <!doctype html> ...
  #1 (permalink)  
Antiguo 05/10/2013, 19:12
Avatar de MarcosAlmagro  
Fecha de Ingreso: octubre-2013
Ubicación: Buenos Aires
Mensajes: 1
Antigüedad: 10 años, 6 meses
Puntos: 0
Pregunta Problema con drawImage en videojuego

Buenas noches,

Estoy intentando hacer videojuegos con HTML5 y Javascript.

Basándome en un tutorial hice lo siguiente:

Código HTML:
Ver original
  1. <!doctype html>
  2. <head><title>Ahi vienen los Aliens</title>
  3. </head>
  4. <body BGCOLOR="black">
  5.     <audio src="aliensgorda.mp3" autoplay controls loop ></audio>
  6.     <TABLE border="0" align="center" valign="center">
  7.     <tr><td>
  8.     <CANVAS id='aliens' width='1024' height='768'></CANVAS>
  9.     <tr><td>
  10.     </TABLE>
  11.     <SCRIPT type="text/javascript">
  12.  
  13. // Objetos importantes de canvas
  14. var canvas = document.getElementById('aliens');
  15. var ctx = canvas.getContext('2d');
  16.  
  17. this.buffer = document.createElement('canvas');
  18. this.buffer.width = this.canvas.width;
  19. this.buffer.height = this.canvas.height;
  20. this.bufferCtx = this.buffer.getContext('2d');
  21.  
  22. // Crear el objeto de Christian de Lugano
  23. var chris ;
  24. var chrisx=300,chrisy=600;
  25. var chrisEstado="vivo";
  26. var chrisContador=0;
  27.  
  28. var juego = {
  29.     estado: 'iniciando'
  30. };
  31. var textoRespuesta = {
  32.     contador: -1,
  33.     titulo: " ",
  34.     subtitulo: " "
  35. }
  36. var enemigos = [];
  37. var teclado = {};
  38. var disparos = [];
  39. var disparosEnemigos = [];
  40.  
  41. // Definición de variables para las imágenes
  42. var fondo;
  43.  
  44. // Definición de funciones
  45. function cargarMedia() {
  46.     fondo = new Image();
  47.     fondo.src = 'LuganoAliens.jpg';
  48.     fondo.onload = function() {
  49.         var intervalo = window.setInterval(frameLoop,1000/55);
  50.     }
  51. }
  52.  
  53. function dibujarEnemigos() {
  54.     if(chrisEstado!="hitiado" && chrisEstado!="muerto") {
  55.         for(var i in enemigos) {
  56.             var enemigo = enemigos[i];
  57.             ctx.save();
  58.             ctx.fillStyle = 'rgb(0,175,0)';
  59.             ctx.beginPath();
  60.             ctx.arc(enemigo.x, enemigo.y, enemigo.width-8, 2.8, 2 * Math.PI, true);
  61.             ctx.closePath();
  62.             ctx.fill();    
  63.             ctx.restore();
  64.         }  
  65.     }  
  66. }
  67.  
  68. function dibujarFondo() {
  69.         ctx.drawImage(fondo,0,0);
  70. }
  71.  
  72. function dibujarChris() {
  73.     if(chrisEstado!="hitiado" && chrisEstado!="muerto") {
  74.         ctx.save();
  75.         chris = new Image();
  76.         chris.src = 'http://4.bp.blogspot.com/-_0CPUimtvv8/UlAkk0Y0wWI/AAAAAAAAAI0/rLe0XtQ8p9w/s1600/esqueprovi.png';
  77.         chris.onload = function(){
  78.         ctx.drawImage(chris,chrisx,chrisy,70,170);
  79.         }  
  80.         ctx.restore();
  81.     }  
  82. }
  83.  
  84.  
  85. // ESTA FUNCIÓN ES LA POSTA, SEGURO LA USO SIEMPRE EN TODOS LOS JUEGUITOS
  86. function agregarEventosTeclado() {
  87.     agregarEvento(document,"keydown",function(e) {
  88.         // Ponemos en true la tecla apretada
  89.         teclado[e.keyCode] = true;
  90.     });
  91.     agregarEvento(document,"keyup",function(e) {
  92.         // Ponemos en false la tecla desapretada
  93.         teclado[e.keyCode] = false;
  94.     });
  95.        
  96.     function agregarEvento(elemento,nombreEvento,funcion) {
  97.         if(elemento.addEventListener) {
  98.             // Navegadores posta
  99.             elemento.addEventListener(nombreEvento,funcion,false);
  100.         }
  101.         else if(elemnto.attachEvent) {
  102.             // Para Internet Explorer
  103.             elemento.attachEvent(nombreEvento,funcion);
  104.         }
  105.     }  
  106. }
  107.  
  108. function moverChris(){
  109.     // Movimiento a la izquierda
  110.     if(teclado[37]) {
  111.         chrisx -= 10;
  112.         if(chrisx < 0)
  113.             chrisx = 0;
  114.     }
  115.     // Movimiento a la derecha
  116.     if(teclado[39]) {
  117.         chrisx += 10;
  118.         if(chrisx > 960)
  119.             chrisx = 960;
  120.     }
  121.     // Disparos
  122.     if(teclado[32]) {
  123.         if(!teclado.disparar) {
  124.             disparar();
  125.             teclado.disparar = true;
  126.         }
  127.     }
  128.     else teclado.disparar = false;
  129.     if(chrisEstado == "hitiado") {
  130.         chrisContador++;
  131.         if(chrisContador >= 20) {
  132.  
  133.             chrisEstado = "muerto";
  134.             juego.estado = "perdiste";
  135.             textoRespuesta.titulo = "                   GAME OVER";
  136.             textoRespuesta.subtitulo = "Apreta R y mandale cumbia de nuevo";
  137.             textoRespuesta.contador = 0;
  138.         }
  139.     }
  140. }  
  141.  
  142. function dibujarDisparosEnemigos() {
  143.     for (var i in disparosEnemigos) {
  144.         var disparo = disparosEnemigos[i];
  145.         ctx.save();
  146.         ctx.fillStyle = "yellow";
  147.         ctx.fillRect(disparo.x,disparo.y,disparo.width,disparo.height);
  148.         ctx.restore();
  149.        
  150.     }
  151. }
  152.  
  153. function moverDisparosEnemigos() {
  154.     for(var i in disparosEnemigos) {
  155.         var disparo = disparosEnemigos[i];
  156.         disparo.y += 5;
  157.         if((disparo.y>=chrisy) && (disparo.x<=(chrisx+70) && disparo.x>=(chrisx))) {
  158.             chrisEstado = "hitiado";
  159.         }
  160.     }
  161.     disparosEnemigos = disparosEnemigos.filter(function(disparo) {
  162.         return disparo.y < canvas.height;
  163.     });
  164. }
  165.  
  166. function actualizaEnemigos() {
  167.     function agregarDisparosEnemigos(enemigo) {
  168.         return {
  169.             x: enemigo.x,
  170.             y: enemigo.y,
  171.             width: 10,
  172.             height: 33,
  173.             contador: 0
  174.         }  
  175.     }
  176.     if(juego.estado == 'iniciando') {
  177.         var filaAliens=0;
  178.         for(var j=0;j<6;j++) { 
  179.             for(var i=0;i<12;i++) {
  180.                 enemigos.push({
  181.                     x: 17 + (i*64),
  182.                     y: filaAliens+10,
  183.                     height: 35,
  184.                     width:35,
  185.                     estado: 'vivo',
  186.                     contador: 0
  187.                 });
  188.             }
  189.             filaAliens += 50;
  190.         }  
  191.         juego.estado = 'jugando';
  192.     }  
  193.     for(var i in enemigos) {
  194.         var enemigo = enemigos[i];
  195.         if(!enemigo)
  196.             continue;
  197.         if(enemigo && enemigo.estado == 'vivo') {
  198.             enemigo.contador++;
  199.             enemigo.x += Math.sin(enemigo.contador * Math.PI /90) *5;
  200.             enemigo.y += 0.02;
  201.        
  202.             if(randonmente(0,enemigos.length * 15) == 2) {
  203.                 disparosEnemigos.push(agregarDisparosEnemigos(enemigo));
  204.             }
  205.         }
  206.         if(enemigo && enemigo.estado == 'hitiado') {
  207.             enemigo.contador++;
  208.             if(enemigo.contador >= 1) {
  209.                 enemigo.estado = 'muerto';
  210.                 enemigo.contador = 0;
  211.             }  
  212.         }
  213.     }
  214.     enemigos = enemigos.filter(function(enemigo) {
  215.         if(enemigo && enemigo.estado != 'muerto')
  216.             return true;
  217.         else
  218.             return false;
  219.     });
  220. }
  221.    
  222. function moverDisparos() {
  223.     for(var i in disparos) {
  224.         var disparo = disparos[i];
  225.         disparo.y -= 5;
  226.     }
  227.     disparos = disparos.filter(function(disparo) {
  228.         return disparo.y > 0;
  229.     });
  230. }
  231.  
  232. function disparar() {
  233.     disparos.push({
  234.         x: chrisx + 20,
  235.         y: chrisy - 10,
  236.         width: 10,
  237.         height: 30
  238.     });
  239. }
  240.  
  241. function dibujarDisparos() {
  242.     ctx.save();
  243.     ctx.fillStyle = 'white';
  244.     for(var i in disparos) {
  245.         var disparo = disparos[i];
  246.         ctx.fillRect(disparo.x, disparo.y, disparo.width, disparo.height);
  247.     }
  248.     ctx.restore();
  249. }  
  250.  
  251. function dibujarTexto() {
  252.     if(textoRespuesta.contador == -1)
  253.         return;
  254.     var alfa = textoRespuesta.contador/50.0;
  255.     if(alfa>1) {
  256.         for(var i in enemigos) {
  257.             delete enemigos[i];
  258.         }
  259.     }
  260.     ctx.save();
  261.     ctx.globalAlpha = alfa;
  262.     if(juego.estado == "ganaste" || juego.estado == "perdiste") {
  263.         ctx.fillStyle = "white";
  264.         ctx.font = 'Bold 40pt Arial';
  265.         ctx.fillText(textoRespuesta.titulo, 70,100);
  266.         ctx.font = '25pt Arial';
  267.         ctx.fillText(textoRespuesta.subtitulo, 250,170);
  268.     }
  269.     ctx.restore(); 
  270. }
  271.  
  272. function actualizarEstadoJuego() {
  273.     if(juego.estado == 'jugando' && enemigos.length == 0) {
  274.         juego.estado = 'ganaste';
  275.         textoRespuesta.titulo = "LES ROMPISTE EL ORTO A TODOS";
  276.         textoRespuesta.subtitulo = "Apreta R y mandale cumbia de nuevo";
  277.         textoRespuesta.contador = 0;
  278.     }  
  279.     if(textoRespuesta.contador >= 0) {
  280.         textoRespuesta.contador++;
  281.     }
  282.     if((juego.estado == "perdiste" || juego.estado == "ganaste") && teclado[82]) {
  283.         juego.estado = "iniciando";
  284.         chrisEstado = "vivo";
  285.         chrisContador = 0;     
  286.         textoRespuesta.contador = -1;
  287.     }
  288. }
  289.  
  290. function hitiar(a,b) {
  291.     var hit = false;
  292.     if(b.x + b.width >= a.x && b.x < a.x + a.width) {
  293.         if(b.y + b.height >= a.y && b.y < a.y + a.height) {
  294.             hit = true;
  295.         }
  296.     }
  297.     if(b.x <= a.x && b.x + b.width >= a.x + a.width) {
  298.         if(b.y <= a.y && b.y + b.height >= a.y + a.heigth) {
  299.             hit = true;
  300.         }  
  301.     }
  302.     if(a.x <= b.x && a.x + a.width >= b.x + b.width) {
  303.         if(a.y <= b.y && a.y + a.height >= b.y + b.heigth) {
  304.             hit = true;
  305.         }
  306.     }
  307.     return hit;
  308. }  
  309.  
  310. function verificarContacto() {
  311.     for (var i in disparos) {
  312.         var disparo = disparos[i];
  313.         for(j in enemigos) {
  314.             var enemigo = enemigos[j];
  315.             if(hitiar(disparo,enemigo)) {
  316.                 enemigo.estado = 'hitiado';
  317.                 enemigo.contador = 0;
  318.                 disparos[i] = disparos.filter(function(disparo) {
  319.                     return disparo.y < 0;
  320.                 });
  321.             }
  322.         }
  323.     }
  324.     if(chrisEstado == "hitiado" || chrisEstado == "muerto")
  325.         return;
  326.     for(var i in disparosEnemigos) {
  327.         var disparo = disparosEnemigos[i];
  328.     }
  329.    
  330. }  
  331.    
  332. function randonmente(inferior,superior) {
  333.     var posibilidades = superior - inferior;
  334.     var a = Math.random() * posibilidades;
  335.     a = Math.floor(a);
  336.     return parseInt(inferior) + a;
  337. }
  338.    
  339. function frameLoop() {
  340.     actualizarEstadoJuego();
  341.     moverChris();
  342.     actualizaEnemigos();
  343.     moverDisparos();
  344.     moverDisparosEnemigos();
  345.     dibujarFondo();
  346.     verificarContacto();
  347.     dibujarEnemigos();
  348.     dibujarDisparosEnemigos();
  349.     dibujarDisparos();
  350.     dibujarTexto();
  351.     dibujarChris();
  352. }
  353.  
  354. // Ejecución de funciones
  355. cargarMedia()
  356. agregarEventosTeclado();
  357.  
  358.     </SCRIPT>
  359.    
  360. </BODY>
  361. </HTML>

El juego se basa en Christian de Lugano, un personaje real argentino salido de Youtube. Básicamente es una adaptación del Space Invaders, pero con escenario en Buenos Aires.

El problema en cuestión, por lo que inferí, viene dado por el tema de la función drawImage, ya que la imágen del protagonista Christian parpadea (a veces mucho, a veces poco), y no pude corregirlo variando la frecuencia de refrescado de los Intervals. Además, solo esta imagen que cargué con drawImage tiene este problema, los polígonos de las navecitas aliens y los disparos no presentan ningún problema. Por otro lado, las navecitas las tuve que hacer con polígonos, ya que si usaba imágenes con drawImage solamente se visualizaban de a una.

El juego lo subí a internet, usando un blogspot como página de control, y el juego en si lo subí a un host gratuito (http://www.hostinger.com.ar/).

Este es el link del juego:

http://christiandeluganovj.blogspot.com.ar/

Usando el navegador Chrome se ve un menor parpadeo que en los demás. Y cuando lo cargo desde mi computadora descubrí que también está el parpadeo, solo que es muy poquito y antes no me había dado cuenta.

Muchas gracias y saludos !!

Etiquetas: html, html5
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:55.