Remake (parcial) de Fruity Frank... 21 - Rediseñando usando clases (2 - Escribir textos, marcador, varios niveles, colisiones)

(Volver al índice)

Como el rediseño usando clases ha supuesto muchos cambios, en la entrega anterior habíamos creado una primera versión, que todavía tenía muchas carencias:

    private Fuente fuenteSans18;  // Declaramos la variable como atributo
    fuenteSans18 = new Fuente("FreeSansBold.ttf",18); // Leemos, en el constructor
    Hardware.EscribirTextoOculta(       // Usamos:
      "Hola",                           // texto
      110,440,                          // posición
      0xFF, 0xAA, 0xAA,                 // color (R,G,B)
      fuenteSans18);                    // fuente
    public  void Dibujar()
    {
      ...
      Hardware.EscribirTextoOculta("Nivel",380,60,
        0x88, 0xFF, 0xFF, fuenteSans14);
      Hardware.EscribirTextoOculta(miJuego.GetNumeroNivel().ToString(),420,60,
        0xFF, 0xFF, 0x88, fuenteSans14);
      Hardware.EscribirTextoOculta("Vidas",480,60,
        0x88, 0xFF, 0xFF, fuenteSans14);
      for (byte i=0; i<miJuego.GetPersonaje().GetNumVidas()-1; i++)
        iconoVida.Dibujar( (short)(520+i*30),48);
    }
    public class Marcador
    {
        // Atributos
        private Juego miJuego;    // Para comunicar con el resto de elementos
        ...

        // Constructor
        public Marcador(Juego j)
        {
          miJuego = j;
          ...
    miMarcador = new Marcador(this);
    // Anima los enemigos y demás elementos del nivel.
    // Cambia el nivel si corresponde.
    private  void SiguienteFotograma()
    {
      miNivel.SiguienteFotograma();
      if (miNivel.GetCompleto())
        SiguienteNivel();
    }

    // Bucle principal del juego
    public  void BuclePrincipal()
    {
      // Parte repetitiva ("bucle de juego")
      NuevaPartida();
      do {
          DibujarPantalla();
          ComprobarTeclas();
          ComprobarColisiones();
          SiguienteFotograma();
          // Pausa de 40 ms, para velocidad de 25 fps (1000/40 = 25)
          Hardware.Pausa(40);
          // Fin de la parte repetitiva
      } while (! partidaTerminada); // Hasta tecla ESC
    }
    // ColisionCon, en "ElemGrafico"
    public bool ColisionCon(ElemGrafico otroElem)
    {
      if ((otroElem.x+otroElem.ancho > x)
          && (otroElem.y+otroElem.alto > y)
          && (x+ancho > otroElem.x)
          && (y+alto > otroElem.y))
        return true;
      else
        return false;
    }    

    // ComprobarColisiones, en "Juego"
    private  void ComprobarColisiones()
    {
      foreach (Enemigo e in miNivel.GetEnemigos() )
        if ( e.ColisionCon(miPersonaje) )
        {
              miPersonaje.PerderVida();
              if (miPersonaje.GetNumVidas() == 0)
                PartidaTerminada();
              break;  // Para no perder 2 vidas si se choca con 2
        }
    }

Como siempre, todo el fuente del proyecto está en: code.google.com/p/fruityfrank

(Volver al índice)