Pregunta de C++

Todo aquello que no está relacionado con Gemix Studio ni con la programación DIV en general.
Post Reply
User avatar
erkosone
Posts: 10656
Joined: Tue Feb 24, 2009 2:13 pm
Location: Barcelona.
Contact:

Pregunta de C++

Post 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:

[Codebox=cpp file=Untitled.cpp]/*******************************************************************************************
*
* 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;
}[/Codebox]

[Codebox=cpp file=Untitled.cpp]/* 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;
}
}
//--------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------




[/Codebox]

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

[Codebox=cpp file=Untitled.cpp]// Update
//----------------------------------------------------------------------------------
// TODO: Update your variables here
for(auto s : sprites){ // draw game sprites..
s.frame();
}[/Codebox]

Creo que estoy añadiendo al vector de objetos la instance de 'sprite' y no la de 'cosa', puede ser ese el problema?
User avatar
erkosone
Posts: 10656
Joined: Tue Feb 24, 2009 2:13 pm
Location: Barcelona.
Contact:

Re: Pregunta de C++

Post 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.
User avatar
erkosone
Posts: 10656
Joined: Tue Feb 24, 2009 2:13 pm
Location: Barcelona.
Contact:

Re: Pregunta de C++

Post by erkosone »

Por si a alguien le interesa el tema, de aquí la solución: https://elvex.ugr.es/decsai/builder/int ... _VIRTUALES
User avatar
CicTec
Posts: 16590
Joined: Thu Jul 31, 2008 10:18 pm

Re: Pregunta de C++

Post 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.
User avatar
erkosone
Posts: 10656
Joined: Tue Feb 24, 2009 2:13 pm
Location: Barcelona.
Contact:

Re: Pregunta de C++

Post by erkosone »

Me miré una clase polimorfismo y fue la solución comun que todos recomendaban, por eso la he hecho así. :)
User avatar
CicTec
Posts: 16590
Joined: Thu Jul 31, 2008 10:18 pm

Re: Pregunta de C++

Post 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++.
User avatar
erkosone
Posts: 10656
Joined: Tue Feb 24, 2009 2:13 pm
Location: Barcelona.
Contact:

Re: Pregunta de C++

Post 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
Post Reply

Return to “Offtopic”