Page 1 of 1

Pregunta de C++

PostPosted: Wed Dec 05, 2018 1:06 pm
by erkosone
Hola gente, tengo una duda muy basica pero que no logro solventar, haber si alguien de por aquí es capaz de indicarme que estoy haciendo mal..


Tengo dos archivos .CPP, estos son:
gameLibZero.cpp
game.cpp

En el primero esta escrita una clase llamada sprite.
en el segundo archivo extiendo la clase sprite y la llamo cosa..

El problema es muy basico, el constructor de 'sprite' lo único que hace es añadir esa instancia de clase a un vector de objetos, osea, añade el sprite a la lista de sprites, esto lo hace bien.

Pero el tema es que sprite tiene un metodo llamado "void frame(){}", cosa que es heredada de sprite tiene también su metodo 'frame', lo que quiero es ejecutar el frame de "cosa" en vez del frame de "sprite" que es el generico.

Pego el codigo:

Source Code (C++) [ Download ] [ Hide ]
  • /*******************************************************************************************
  • *
  • *   gameLibZero 0.1 by: Luis Lopez Martinez.        28/11/2018
  • *
  • ********************************************************************************************/
  • #include "raylib.h"
  • #include <vector>
  • #include <algorithm>
  • #include <stdio.h>
  •  
  • using namespace std;
  •  
  • class sprite;
  • vector<sprite>sprites;
  •  
  •  
  • void setup();
  • void draw();
  •  
  •  
  •  
  • //------------------------------------------------------------------------------------------------------
  • class sprite{
  •     public:
  •         bool visible = false;
  •         Texture2D graph;
  •         float x = 0;
  •         float y = 0;
  •         float z = 0;
  •         float size = 100;
  •         float angle = 0;
  •         float alpha = 255;
  •        
  •         sprite(){
  •             sprites.push_back(*this);
  •         }
  •         virtual void frame(){
  •             //j++;
  •         }
  •         void render(){
  •             if(visible){
  •                 screenDrawGraphic(graph, x, y, angle, size, alpha);
  •             }
  •         }
  • };
  • //------------------------------------------------------------------------------------------------------
  • int main()
  • {
  •     // Initialization
  •     setup();
  •  
  •     // Main game loop
  •     while (!WindowShouldClose())    // Detect window close button or ESC key
  •     {
  •         // Update
  •         //----------------------------------------------------------------------------------
  •         // TODO: Update your variables here
  •         for(auto s : sprites){      // draw game sprites..
  •             s.frame();
  •         }
  •         //----------------------------------------------------------------------------------
  •         // Draw
  •         //----------------------------------------------------------------------------------
  •         BeginDrawing();
  •             ClearBackground(RAYWHITE);
  •             draw();                     // main game code call..
  •             for(auto s : sprites){      // draw game sprites..
  •                 s.render();
  •             }
  •         EndDrawing();
  •         //----------------------------------------------------------------------------------
  •     }
  •  
  •     // De-Initialization
  •     //--------------------------------------------------------------------------------------  
  •     CloseWindow();        // Close window and OpenGL context
  •     //--------------------------------------------------------------------------------------
  •  
  •     return 0;
  • }


Source Code (C++) [ Download ] [ Hide ]
  • /* gameLibZero game.cpp template */
  • int j = 0;
  • #include "gameLibZero.cpp"
  •  
  • // Global var block..
  • Texture2D img;
  • int st = 0;
  • //--------------------------------------------------------------------------------------
  • void setup(){
  •     setMode(1280, 720);
  •     //ToggleFullscreen();
  •     setTitle("gameLibZero 0.1 pre alpha!!!!");
  •     setFps(60);
  •     img = loadImage("data/images/00.png");
  •    
  • }
  • //--------------------------------------------------------------------------------------
  • class cosa : public sprite{
  •     public:
  •     void frame(){
  •         j++;
  •     }
  • };
  •  
  • //--------------------------------------------------------------------------------------
  • void draw(){
  •    
  •     switch(st){
  •         case 0:
  •             cosa* c = new cosa();
  •  
  •             st = 10;
  •             break;
  •     }
  • }
  • //--------------------------------------------------------------------------------------
  • //--------------------------------------------------------------------------------------
  •  
  •  
  •  
  •  
  •  


Veis como 'cosa' tiene su metodo "frame()", y es este el que quiero ejecutar desde este trozo de codigo del primer archivo:

Source Code (C++) [ Download ] [ Hide ]
  • // Update
  •         //----------------------------------------------------------------------------------
  •         // TODO: Update your variables here
  •         for(auto s : sprites){      // draw game sprites..
  •             s.frame();
  •         }


Creo que estoy añadiendo al vector de objetos la instance de 'sprite' y no la de 'cosa', puede ser ese el problema?

Re: Pregunta de C++

PostPosted: Thu Dec 06, 2018 10:03 am
by erkosone
Solucionado!
Vaya tela, habia escuchado alguna vez que la OOP de C++ daba bastante asco.. y bueno.. para alguien que empieza se confirma, es muy exigente en cuanto a semantica y logica.. demasiado complejo para empezar...

Al final mi problema era que tenia que declarar metodos abstractos con virtual para luego implementarlos en los objetos de clases derivadas de la clase principal abstracta, y a todo esto teniendo en cuenta las mil y una cosas como crear vectores de objetos abstractos no se puede.. solo vectores de "punteros" a objetos abstractos..

Madre mia.. si si C++ sera muy rapido, pero como lenguaje es bastante mas complicado que java, la verdad es que java en comparación es como super facil.

Re: Pregunta de C++

PostPosted: Thu Dec 06, 2018 10:06 am
by erkosone
Por si a alguien le interesa el tema, de aquí la solución: https://elvex.ugr.es/decsai/builder/int ... _VIRTUALES

Re: Pregunta de C++

PostPosted: Thu Dec 06, 2018 1:03 pm
by CicTec
Hola erkosone,

No es necesario usar templates o metodos virtuales, con features muy avanzadas que se usan cuando se necesita crear algo muy generico, en tu caso era suficiente crear clases simples especificas y seria casi identico a Java, pero bueno, ya lo tienes asi.

Re: Pregunta de C++

PostPosted: Thu Dec 06, 2018 1:10 pm
by erkosone
Me miré una clase polimorfismo y fue la solución comun que todos recomendaban, por eso la he hecho así. :)

Re: Pregunta de C++

PostPosted: Thu Dec 06, 2018 1:21 pm
by CicTec
Si si pero es un concepto muy avanzado y de uso generico que Java no soporta y es bastante mas complicado, hubieras podido tambien solucionarlo con una clase mas especifica programada sin templates, etc... similar a Java, digamos que has optado para la solucion mas complicada para haber empezado hace poco con C++.

Re: Pregunta de C++

PostPosted: Thu Dec 06, 2018 1:24 pm
by erkosone
Si tio.. la verdad es que me ha costado entenderlo bien 2 dias jeje.. y no me acordaba ni de escribir "using namespaces std" jajajaja.. imaginate.. por suerte una vez sabes lo que quieres hacer, hacerlo en otro lenguaje es mas sencillo que empezar completamente de cero..

Ahun así.. C++ a estos niveles tiene tela marinera.. ya el primer dia con punteros a objetos, con vectores de clases abstractas.. en C++ parece que todo esto es mas difícil hecho a propósito :P