La estructura de clases es la siguiente:
Entity(Clase padre) es donde contiene el método move();
Player(Clase hija) Hereda la clase move() de Entity i el resto de sus mètodos y atributos.
Ahora me viene el problema (Que no se si es posible realizar lo que quiero hacer), la manera en la cual he pensado hacer el mètodo és la siguiente:
Código
void CPlayer::movee(SDL_Event evento) { switch (evento.key.keysym.sym) { //Eventos de teclado depende del que se clique un movimiento o otro case SDLK_UP: if (y > 0) //Se resta la posicion y y = y - 10; break; case SDLK_DOWN: if (y < 340) //Se suma la posicion y y = y + 10; break; case SDLK_LEFT: //Se resta la posicion x if (x > 0) x = x - 10; break; case SDLK_RIGHT: //Se resta la posicion y if (x < 540) x = x + 10; break; } }
Como veis se tiene que pasar como paràmetros un dato del tipo SDL_Event, pero como en la clase padre no esta definido me da error, mi pregunta es si hay alguna manera de hacer override o otra cosa o de lo contrario alguna idea de como implementar el movimiento en la clase Player. Aquí les dejare todo el còdigo de todo lo que està implicado.
Entity.cpp
Código
#include "Entity.h" #include "Sprite.h" CEntity::CEntity() { } CEntity::CEntity(char * file, int x, int y, int hight, int width, SDL_Renderer * window) { this->file = file; this->x = x; this->y = y; this->hight = hight; this->width = width; this->window = window; } CEntity::~CEntity() { } int CEntity::get_x() { return x; } int CEntity::get_y() { return y; } int CEntity::get_hight() { return hight; } int CEntity::get_width() { return width; } char CEntity::get_file() { return *file; } //Dona erroer es te que mirar, tot i que per el moment no es necessari mes endevant pot ser que ho necessitem /*SDL_Renderer CEntity::get_window() { return window; }*/ void CEntity::set_x(int x) { this->x = x; } void CEntity::set_y(int y) { this->y = y; } void CEntity::set_hight(int hight) { this->hight = hight; } void CEntity::set_width(int width) { this->width = width; } void CEntity::set_file(char* file) { this->file = file; } void CEntity::set_window(SDL_Renderer* window) { this->window = window; } void CEntity::load() { //Carga la imagen del pj image = Sprite::Load(file, window); } void CEntity::draw() { //Dibuja el pj Sprite::Draw(window, image, x, y, width, hight); }
Entity.h
Código
#pragma once #include <SDL.h> class CEntity { public: CEntity(); CEntity(char * file, int x, int y, int hight, int width, SDL_Renderer* window); ~CEntity(); int get_x(); int get_y(); int get_hight(); int get_width(); SDL_Renderer get_window(); char get_file(); void set_file(char* file); void set_window(SDL_Renderer* Window); void set_x(int x); void set_y(int y); void set_hight(int hight); void set_width(int width); virtual void move() = 0; void load(); void draw(); private: SDL_Renderer* window; SDL_Texture* image; char* file; protected: int hight; int width; int x; int y; };
Player.cpp
Código
#include "Player.h" #include "Entity.h" CPlayer::CPlayer(char * file, int x, int y, int hight, int width, SDL_Renderer * window) : CEntity(file, x, y, hight, width, window) { } CPlayer::CPlayer() { } void CPlayer::movee(SDL_Event evento) { switch (evento.key.keysym.sym) { //Eventos de teclado depende del que se clique un movimiento o otro case SDLK_UP: if (y > 0) //Se resta la posicion y y = y - 10; break; case SDLK_DOWN: if (y < 340) //Se suma la posicion y y = y + 10; break; case SDLK_LEFT: //Se resta la posicion x if (x > 0) x = x - 10; break; case SDLK_RIGHT: //Se resta la posicion y if (x < 540) x = x + 10; break; } } void CPlayer::move() { }
Player.h
Código
#pragma once #include<SDL.h> #include"Sprite.h" #include "Entity.h" class CPlayer : public CEntity { public: CPlayer(char * file, int x, int y, int hight, int width, SDL_Renderer* window); CPlayer(); void movee(SDL_Event evento); void move(); private: };
PlayState.cpp
Código
#include <stdio.h> #include "SDL.h" #include "Game.h" #include "PlayState.h" #include "PauseState.h" #include "Player.h" PlayState PlayState::m_PlayState; void PlayState::Init(Game* game) { playSprite = NULL; playSprite = Sprite::Load("sprites/playstate.bmp", game->GetRenderer()); //Constructor del jugador, se passa la ubicacion de la imagen i sus datos igual que //el renderer donde se carga player = CPlayer("sprites/macaco.bmp", 200, 200, 64, 64, game->GetRenderer()); //Defino la posicion inicial del enemigo enemy_x = posicions_x[0]; enemy_y = posicions_y[0]; //Cargo la imagen del enemigo enemy = Sprite::Load("sprites/crab.bmp", game->GetRenderer()); //Cargo la imagen del jugador player.load(); printf("PlayState Init Successful\n"); } void PlayState::Clean() { printf("PlayState Clean Successful\n"); } void PlayState::Pause() { printf("PlayState Paused\n"); } void PlayState::Resume() { printf("PlayState Resumed\n"); } void PlayState::HandleEvents(Game* game) { SDL_Event event; if (SDL_PollEvent(&event)) { switch (event.type) { case SDL_QUIT: game->Quit(); break; case SDL_KEYDOWN: switch (event.key.keysym.sym) { //Eventos de teclado depende del que se clique un movimiento o otro case SDLK_SPACE: game->PushState(PauseState::Instance()); break; } player.movee(event); //Comproba el contador per el seguiment del enemic if (cont < 8) { //Guarda les posicions anterior del pj a les cordenades del enemic enemy_x = posicions_x[cont]; enemy_y = posicions_y[cont]; //Esborra les cordenades utilitzades ara i les actualitza amb les actuals posicions_x[cont] = player.get_x(); posicions_y[cont] = player.get_y(); //Suma el contador cont++; } else { //El contador arriba al maxim i es torna a possar a 0 cont = 0; } } } } void PlayState::Update(Game* game) { } void PlayState::Draw(Game* game) { Sprite::DrawFullScreen(game->GetRenderer(), playSprite); //Dibuja el enemigo Sprite::Draw(game->GetRenderer(), enemy, enemy_x, enemy_y, 64, 64); //Dibuja el personaje player.draw(); SDL_RenderPresent(game->GetRenderer()); }
En este ejemplo que he puesto hay un método propio de la clase Player llamado movee que es funcional y actualmente funciona perfectamente, pero claro yo lo que quiero es que lo pueda heredar de la clase entity y en la propia clase Player poder modificarlo como esta aquí, ya que el método move() de la clase Entity también serà utilizado por los enemigos clase Enemy. Gracias por vuestra ayuda, Si teneis alguna otra solución o alguna idea de como realizar el movimiento se lo agradezco.
Saludos!





