Lab - Herencia y polimorfismo

  1. El código de este laboratorio ha sido probado en linux. No estoy seguro si funciona en otros sistemas operativos.

  2. Instala libsdl2-dev usando sudo apt install libsdl2-dev

  3. Descarga el código para este laboratorio de: https://bitbucket.org/raarceupr/polyrect.

  4. El programa incluido en main.cpp crea una ventana donde muestra unos rectángulos moviendose hacia la derecha. Compílalo y córrelo (en linux) para validar que funciona.

  5. La función main() crea los rectángulos:

    int main(int, char**) { 
      gui myGUI;
    
      Rectangle rect1(ImVec2(100,100),ImVec2(150,250));
      Rectangle rect2(ImVec2(200,300),ImVec2(250,350));
    
      myGUI.addRectangle(&rect1);
      myGUI.addRectangle(&rect2);
    
      myGUI.show(); 
    }
    
  6. Explicación de las instrucciones en main():

    • gui myGUI; - crea un objeto clase gui al que añadiremos los rectangulos para que salgan en pantalla
    • Luego creamos dos objetos (rect1 y rect2) de clase Rectangle especificando las coordenadas de la esquina superior izquierda e inferior derecha. Im2Vec es una estructura para guardar pares ordenados de números. La estamos usando para representar cada uno de los puntos.
    • Pasamos las direcciones de esos dos objetos rect1 y rect2 al GUI usando la función addRectangle().
    • Invocamos a show() para que el GUI despliegue la ventana y los rectángulos.
  7. Una vez invocado show() el GUI toma control del programa y se queda en un loop donde en cada vuelta invoca la función move() de cada rectángulo y lo añade a la lista de cosas a dibujar ( draw_list->AddRect). Puedes ver ese loop dentro de la función show() de la clase gui:

      for (auto r: rectangles) {
        r->move();
        draw_list->AddRect(r->pa, r->pb, col32, 0.0f, 
                           ImDrawCornerFlags_All, 1.0f);
      }
    

    La razón por la que los rectángulos se mueven hacia la derecha es porque la función move() incrementa la coordenada x de las esquinas del rectángulo.

Ejercicio

  1. Convierte la función move() de la clase Rectangle a una puramente virtual.

  2. Crea cuatro clases derivadas de la clase Rectangle:

    • LeftRectangle - se mueve hacia la izquierda
    • RightRectangle - se mueve hacia la derecha
    • UpRectangle - se mueve hacia arriba
    • DownRectangle - se mueve hacia abajo
  3. Crea al menos un objeto de cada una de las nuevas clases y añadelos al GUI (usando addRectangle()). Como ejemplo, el vídeo que mostramos a continuación muestra el resultado del siguiente main():

    RightRectangle rect1(ImVec2(0,0),ImVec2(100,200));
    LeftRectangle rect2(ImVec2(500,100),ImVec2(550,200));
    UpRectangle rect3(ImVec2(500,400),ImVec2(550,450));
    DownRectangle rect4(ImVec2(100,150),ImVec2(150,200));
    
    myGUI.addRectangle(&rect1);
    myGUI.addRectangle(&rect2);
    myGUI.addRectangle(&rect3);
    myGUI.addRectangle(&rect4);