Menú Principal

Juego SDL

Iniciado por Luffy97, 21 Enero 2017, 13:52 PM

0 Miembros y 1 Visitante están viendo este tema.

Luffy97

Hola gente, Estamos haciendo con un grupo de alumnos de clase un juego con SDL 2.0 y ahora tengo un problema a la hora de implementar el movimiento de el jugador en un método propio de su clase.
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 (cpp) [Seleccionar]
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 (cpp) [Seleccionar]
#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 (cpp) [Seleccionar]
#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 (cpp) [Seleccionar]
#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 (cpp) [Seleccionar]
#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 (cpp) [Seleccionar]
#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!
;-) >:D ;-) >:D :laugh: :rolleyes: