Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - CSQCasimiro

#1
SOLUCIONADO. fui muy boludo y en el main no usaba la clase heredada JAJAJAJ. el cafe no basto para esa noche
Hola, como andan ? espero que bien :p

Verán, después de mucho regreso con C/C++ extrañando sus punteros jaja
Tengo este problema que ya me quemo las pestañas y no veo lo que esta mal.

Tengo mi clase base Escenario.h con su método virtual isEndEscena el cual luego reescribo en su clase derivada HelloEscena y por ultimo, almaceno HelloEscena en un vector de vector<CEscenario*> de la clase Cordinador

El problema esta, en que cuando, tengo llamar a isEndEscena, me llama a la de la clase base y no su deribada.

Dejo el código:

Escenario

//head
#pragma once

#include <SFML\Graphics.hpp>
#include "Sprite.h"

class CEscenario
{
public:
void addSprite(CSprite*);
void clearSprites();
void deleteSprite(const char* key);

virtual bool isEndEscena(sf::Event);

void updateSprites(sf::Event);
void drawSprites();

char* getKey();
private:
std::vector<CSprite*> sprites;
char* key;
};

//cpp

#include "Escenario.h"

bool CEscenario::isEndEscena(sf::Event)
{
return true;
}

char* CEscenario::getKey()
{
return this->key;
}

void CEscenario::updateSprites(sf::Event evento)
{
int i = 0;
for (int i = 0; i < int(this->sprites.size()); i++)
{
this->sprites[i]->update(evento);
}
}

void CEscenario::addSprite(CSprite* newSprite)
{
this->sprites.push_back(newSprite);
}

void CEscenario::deleteSprite(const char* key)
{
int i = 0;
for (int i = 0; i < int(this->sprites.size()); i++)
{
if (std::strcmp(this->sprites[i]->getKey(), key) == 0)
{
this->sprites.erase(this->sprites.begin() + i);
return;
}
}
}

void CEscenario::clearSprites()
{
this->sprites.clear();
}

void CEscenario::drawSprites()
{
int i = 0;
for (int i = 0; i < int(this->sprites.size()); i++)
{
this->sprites[i]->draw();
}
}


HelloEscena

//head
#pragma once

#include <SFML\Graphics.hpp>
#include "Escenario.h"

class CHelloEscena : CEscenario
{
public:
bool isEndEscena(sf::Event);
};


//cpp
#include "HelloEscena.h"

bool CHelloEscena::isEndEscena(sf::Event evento)
{
int a = 0;
return false;
}


Cordinador


//head
#pragma once

#include <vector>
#include "Escenario.h"

class CCordinador
{
public:
void addEscenario(CEscenario*);
void clearEscenarios();
void deleteEscenario(const char *key);

CEscenario* getEscenario();

//void nextEscenario();
void(*nextEscenario)();
private:
std::vector<CEscenario* > escenarios;
CEscenario *escenarioActual;
};

//cpp
#include <cstring>

#include "Cordinador.h"

CEscenario* CCordinador::getEscenario()
{
return escenarioActual;
}

void CCordinador::addEscenario(CEscenario* newEscenario)
{
this->escenarios.push_back(newEscenario);
this->escenarioActual = newEscenario;
}

void CCordinador::deleteEscenario(const char* key)
{
int i = 0;
for (int i = 0; i < int(this->escenarios.size()); i++)
{
if (std::strcmp(this->escenarios[i]->getKey(), key) == 0)
{
this->escenarios.erase(this->escenarios.begin() + i);
return;
}
}
}

void CCordinador::clearEscenarios()
{
this->escenarios.clear();
}


Donde uso Cordinador....

//head
#pragma once

#include "Cordinador.h"

class CApp
{
public:
CApp(sf::RenderWindow *widows);

/*Parte del siclo de vida del juego*/
void loopGame();
void catchEvent();
void clearScreen();

void update(sf::Event);
void draw();
void displayWindows();


/*Armado del juego*/
static sf::RenderWindow *window;
void setCordinador(CCordinador *c) { this->cordinador = c; }
private:
CCordinador *cordinador;
};

//cpp
//solo puse donde lo uso por que es mucho si no xD
void CApp::update(sf::Event evento)
{
if (evento.type == sf::Event::Closed)
{
this->window->close();
return;
}

if (this->cordinador->getEscenario()->isEndEscena(evento))
{
//regresa siempre true de la clase base, y no false de la clase derivada

//Un momento del juego termino y pasa al siguiente
//ej: menues, niveles, etc
this->cordinador->nextEscenario();
}

this->cordinador->getEscenario()->updateSprites(evento);
}


y el main infaltable :p

#include <SFML/Graphics.hpp>

#include "App.h"

#include "HelloSprite.h"
#include "HelloEscena.h"

int main()
{
// Create the main window
sf::RenderWindow win(sf::VideoMode(800, 600, 32), "Hello World - SFML");

//Definimos los sprites:
CHello sprite;

//Definimos los escenario:
//imprimira en pantalla en orden de pila de como se le fue agregando al escenario
CEscenario test;
test.addSprite(&sprite);

//Cargamos los Escenarios al Cordinador
CCordinador cordinador;
cordinador.addEscenario(&test);

//Le damos al App el cordinador
CApp app(&win);
app.setCordinador(&cordinador);

//Empezamos el juego
app.loopGame();

return 0;
}


Desde ya muchas gracias por leer.
#2
hola como andan? espero que bien, yo de nuevo por acá jeje, tengo una duda con la instancia de compilación que realiza el IDE Code::Block... es posible evitar que me marque algunos avisos ? por que tengo una función que uso mucho pero por no ser muy linda a la vista del Sr.GCC siempre me tira avisos sobre la misma :P y... ya es molesto >.<

si alguien conoce un método para evitar esos avisos le agradeceré mucho :D

desde ya muchas gracias. y buena suerte.
#3
hola a todos, como andan ? , veran, estoy optimizando un codigo mio con funciones super genericas (que sean capases de resivir cualquier tipo de estruc y recorrer cada uno de sus campos) , el tema es que realizandolo me surgio una duda, sobre como son asignados los espacios en memoria de una estructura, por ejemplo la siguiente:



struct dato
{
    int ID;
    int lock;
};



yo se que si le doy un sizeof (dato) , me dará 8 ( cada dato int ocupa 4 byte), mi pregunta es esta, supongamos que la estructura empieza en la direccion de memora 0x0001 , esa dirección de inicio, también corresponde a la de inicio de int ID ? y si le sumo 4 byte mas, osea, 0x0005 , esa seria la dirección de memoria de int lock ?

desde ya muchas gracias.
#4
hola, como andan, espero que bien.
verán, ando estudiando por mi cuenta lo que es la librería SDL y la programación con respecto a video juegos, usando base linux ( ubuntu) y de IDE Code::blocks ,
el problema es que, cuando realizo una función como :

Código (c++) [Seleccionar]
Mix_OpenAudio(22050, AUDIO_S16, 2, 4096);
Mix_LoadMUS("turbo tunnel.mp3"); 


me salta error de compilación :

undefined reference to 'Mix_OpenAudio'
undefined reference to 'Mix_LoadMUS'



no se si sera por que instale la biblioteca del SDL_mixter por separado de las demás...

bueno, les dejo el codigo completo:

Código (c++) [Seleccionar]


#include <iostream>
#include <cstring>

#include <cstdlib>
#include <stdlib.h>

#include <SDL.h> //edite en los include iniciales de mi SDL.h para que incluya a la SDL_mixter que no estaba ya que la agregue mas tarde

using namespace std;



int main ( int argc, char** argv )
{
    //inicializamos el video y audio
    SDL_Init(SDL_INIT_AUDIO|SDL_INIT_VIDEO|SDL_INIT_AUDIO);

    //loop game
    bool GameLoop=true;

    //variable para eventos
    SDL_Event evento;

    //inicializo el modo grafico con un 500 x 200
    SDL_Surface *screen;
    screen=SDL_SetVideoMode(500,800,32,SDL_HWSURFACE);
    SDL_WM_SetCaption("Ball Race", NULL);

    Mix_Music *musica;
   // Inicializamos SDL_mixer
    Mix_OpenAudio(22050, AUDIO_S16, 2, 4096);
    // Cargamos la musica
    musica = Mix_LoadMUS("turbo tunnel.mp3");

    while (GameLoop)//loop game
    {


        SDL_Flip(screen);
    }

    return 0;
}


bueno, desde ya muchas gracias.