Lab - Herencia y polimorfismo
-
El código de este laboratorio ha sido probado en linux. No estoy seguro si funciona en otros sistemas operativos.
-
Instala
libsdl2-dev
usandosudo apt install libsdl2-dev
-
Descarga el código para este laboratorio de: https://bitbucket.org/raarceupr/polyrect.
-
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. -
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(); }
-
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
yrect2
) de claseRectangle
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
yrect2
al GUI usando la funciónaddRectangle()
. - Invocamos a
show()
para que el GUI despliegue la ventana y los rectángulos.
-
Una vez invocado
show()
el GUI toma control del programa y se queda en un loop donde en cada vuelta invoca la funciónmove()
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ónshow()
de la clasegui
: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 coordenadax
de las esquinas del rectángulo.
Ejercicio
-
Convierte la función
move()
de la claseRectangle
a una puramente virtual. -
Crea cuatro clases derivadas de la clase
Rectangle
:LeftRectangle
- se mueve hacia la izquierdaRightRectangle
- se mueve hacia la derechaUpRectangle
- se mueve hacia arribaDownRectangle
- se mueve hacia abajo
-
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 siguientemain()
: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);