Por Nacho Cabanes
Ahora mismo, existe una pantalla de fondo, que muestra paredes, suelo, escaleras... pero el personaje se mueve sin tener en cuenta esos detalles. Por eso, en esta entrega, el personaje deberá moverse por las casillas reales de la pantalla, sin pisar paredes ni suelO, sino sólo donde haya espacio en blanco o paredes.
Como forma sencilla de plantear un primer acercamiento, el personaje no tendrá un movimiento suave, sino que "saltará" de una casilla a otra.
Ahora la "x" y la "y" de nuestro personaje aumentarán (o disminuirán) de uno en uno, y antes de permitir que cambie deberemos comprobar si la correspondiente casilla del mapa está libre, con algo como:
if (Hardware.TeclaPulsada(Hardware.TECLA_DER) ) if (x < maxX) if ((mapa[y,x+1] == 0) // Espacio en blanco || (mapa[y,x+1] == 4) )// Escalera x++;
El fuente completo podría quedar así (el fichero ZIP que contiene las imágenes, DLLs y demás ficheros necesarios los tienes en la entrega 1):
/** * Juego: Logica de juego * * @see Hardware * @author 1-DAI IES San Vicente 2009/10 */ /* -------------------------------------------------- Parte de Death Pit - Remake Versiones hasta la fecha: Num. Fecha Por / Cambios --------------------------------------------------- 0.01 08-Sep-2009 Nacho Cabanes Version inicial: muestra una imagen 0.02 07-Oct-2009 Nacho Cabanes Mueve el personaje hacia la derecha hasta llegar al margen 0.03 13-Oct-2009 Nacho Cabanes El personaje se mueve con flechas Un primer enemigo que se mueve a la vez 0.04 16-Oct-2009 Nacho Cabanes Primera pantalla de presentacion El primer enemigo rebota en los lados Un segundo enemigo nos persigue 0.05 20-Oct-2009 Nacho Cabanes Array de enemigos (murcielagos) que rebotan en los lados 0.06 28-Oct-2009 Nacho Cabanes Array bidimensional para imagen de fondo 0.07 04-Nov-2009 Nacho Cabanes El personaje se mueve solo por los "huecos" Eliminados los enemigos (por ahora) Renombradas variables i,j a fila,colum ---------------------------------------------------- */ using System; // Para numeros aleatorios: System.Random public class Juego { private static void Main() { // Variables que usaremos: una imagen y un tipo de letra ElemGrafico imagenPersonaje, presentacion; ElemGrafico imagenFondoHoriz,imagenFondoHorizAcido, imagenFondoVert, imagenEscalera; Fuente fuente18; int fila, colum; // Para recorrer short x=1, y=1; int minX = 0, maxX = 6, minY = 0, maxY = 6; int filasPantalla = 7; int columnasPantalla = 7; int[,] mapa = { {1,2,1,1,1,2,1}, {0,0,0,0,0,0,0}, {1,1,3,4,3,1,1}, {0,0,3,4,3,0,0}, {1,4,1,4,3,4,3}, {0,4,3,4,3,4,3}, {1,1,3,4,3,4,3} }; // Inicializo modo grafico 800x600 puntos, 24 bits de color Hardware.Inicializar(800, 600, 24); // Cargo imagenes y tipos de letra imagenPersonaje = new ElemGrafico("imagenes/personaje.png"); imagenFondoHoriz = new ElemGrafico("imagenes/fondo1.png"); imagenFondoHorizAcido = new ElemGrafico("imagenes/fondo2.png"); imagenFondoVert = new ElemGrafico("imagenes/fondo3.png"); imagenEscalera = new ElemGrafico("imagenes/escalera.png"); fuente18 = new Fuente("FreeSansBold.ttf", 18); presentacion = new ElemGrafico("imagenes/present.png"); //dibujo la presentacion presentacion.DibujarOculta(); // Finalmente, muestro en pantalla Hardware.VisualizarOculta(); //hasta que se pulse espacio do { } while (! Hardware.TeclaPulsada(Hardware.TECLA_ESP) ); //borro la presentacion Hardware.BorrarPantallaOculta(0,0,0); // Y espero a que se pulse ESC do { Hardware.BorrarPantallaOculta(0,0,0); // Dibujo el fondo de la pantalla for (fila=0; fila<filasPantalla; fila++) for (colum=0; colum<columnasPantalla; colum++) switch (mapa[fila,colum]) { case 0: // Espacio en blanco, no dibujo nada break; case 1: imagenFondoHoriz.MoverA( (short) (colum*70) , (short) (fila*50)); imagenFondoHoriz.DibujarOculta(); break; case 2: imagenFondoHorizAcido.MoverA( (short) (colum*70) , (short) (fila*50)); imagenFondoHorizAcido.DibujarOculta(); break; case 3: imagenFondoVert.MoverA( (short) (colum*70) , (short) (fila*50)); imagenFondoVert.DibujarOculta(); break; case 4: imagenEscalera.MoverA( (short) (colum*70) , (short) (fila*50)); imagenEscalera.DibujarOculta(); break; } // Dibujo el personaje, el enemigo y un texto en la pantalla oculta imagenPersonaje.MoverA( (short) (x*70) , (short) (y*50) ); imagenPersonaje.DibujarOculta(); Hardware.EscribirTextoOculta( "Pulsa ESC para salir", 300, 500, 0xAA, 0xAA, 0xAA, fuente18); // Finalmente, muestro en pantalla Hardware.VisualizarOculta(); // Y lo muevo si se pulsa alguna flecha del teclado if (Hardware.TeclaPulsada(Hardware.TECLA_DER) ) if (x < maxX) if ((mapa[y,x+1] == 0) // Espacio en blanco || (mapa[y,x+1] == 4) )// Escalera x++; if(Hardware.TeclaPulsada(Hardware.TECLA_ARR) ) if ( y > 0) if ((mapa[y-1,x] == 0) // Espacio en blanco || (mapa[y-1,x] == 4) )// Escalera y--; if (Hardware.TeclaPulsada(Hardware.TECLA_IZQ) ) if ( x > 0) if ((mapa[y,x-1] == 0) // Espacio en blanco || (mapa[y,x-1] == 4) )// Escalera x--; if (Hardware.TeclaPulsada(Hardware.TECLA_ABA) ) if (y < maxY) if ((mapa[y+1,x] == 0) // Espacio en blanco || (mapa[y+1,x] == 4) )// Escalera y++; // Pausa para 25 fps Hardware.Pausa( 40 ); } while (! Hardware.TeclaPulsada(Hardware.TECLA_ESC) ); } } /* fin de la clase Juego */Siguiente entrega...