Я пишу простую игру в SDL. У меня есть иерархия классов, которую я строю для любого спрайта, который использую в игре. Базовым классом является Sprite, который содержит абстракции данных для блока столкновений и таблицы спрайтов. Непосредственно под ним находятся два абстрактных класса: Character и MapObject.
В настоящее время я реализую класс Player, который является производным от Character (. Enemy и NPC также будут производными от абстрактного класса Character ).
Во всяком случае, надеюсь, это имеет смысл. Моя проблема вот в чем:
Когда я пытаюсь использовать класс игрока в движке, я не могу получить доступ ни к одной из функций Sprite.
Я получаю следующую ошибку:
'Sprite' is not an accessible base of 'Player'
Вот заголовочные файлы:
Спрайт.ч:
class Sprite{
public:
virtual ~Sprite() = 0; //I want this to be an abstract class and yes this is defined in the cpp
//Initialization functions - MUST be called before anything else in the class can be used.
void setupCollider(int xo, int yo, int ho, int wo);
void setupSheet(SDL_Surface* dest, std::string file, int numClips, int ac, int _res, int sr);
//SpriteSheet functions
void setActiveClip(int a);
int getActiveClip() const;
void draw() const;
int getResolution() const;
SDL_Surface* getDest();
//Collider functions
void updateCollider();
SDL_Rect box() const;
bool collision(SDL_Rect other) const;
//Access and Modify coordinates of the sprite
void setLoc(int x, int y) { _x = x; _y = y; }
int getX() const { return _x; }
int getY() const { return _y; }
private:
struct Collider{
SDL_Rect _box;
int x_offset,
y_offset;
};
struct SpriteSheet{
SDL_Surface* destination;
SDL_Surface* sheet;
SDL_Rect* clips;
int _numClips;
int active;
int res;
int sheetrows;
};
Collider collisionAttributes;
SpriteSheet spriteSheetAttributes;
int _x, _y;
};
Персонаж.h:
class Character : public Sprite{
public:
virtual void move(Direction direction_input, const TileMap& currentlevel) = 0;
virtual void animate() = 0;
virtual void setAttributes( int h, int sp, int ad, int d, int m, int md, int l, std::string n){
hearts = h; speed = sp; attackdamage = ad;
defense = d; magicdamage = m; magicdefense = md;
level = l; name = n;
}
bool isDead() const{
return hearts == 0;
}
void heal(int heartsup){
hearts += heartsup;
}
void dealDamage(int heartsDown){
hearts -= heartsDown;
}
protected:
int hearts;
int speed;
int attackdamage;
int defense;
int magicdamage;
int magicdefense;
int level;
std::string name;
};
Player.h:
//Not fully finished yet, but should work for the purposes of this question
class Player : protected Character{
public:
~Player(){
if(heart) SDL_FreeSurface(heart);
}
static const int HEART_WIDTH;
void move(Direction direction_input, const TileMap& currentlevel);
void animate();
void updateCamera(TileMap& currLevel);
private:
SDL_Surface* heart;
enum ClipFace
{
UP1,
UP2,
DOWN1,
DOWN2,
LEFT1,
LEFT2,
RIGHT1,
RIGHT2
};
static const std::string HEART;
static const int HEART_RES;
};
Я получаю первую ошибку в своем движке, когда пытаюсь вызвать функции настройки из Sprite в плеере, первая ошибка:
player.setLoc(levels[0].startX(), levels[0].startY());
Любая помощь приветствуется.
[РЕШЕНО] РЕДАКТИРОВАТЬ :Альтернативное решение для комментариев :Класс символов ничего не наследовал от класса Sprite, поэтому технически он не должен был быть производным от него. Вместо того, чтобы Character наследовался от Sprite, у меня Player наследовался ОБА от Sprite и от Character, и это тоже сработало. Я не уверен, что лучше дизайн, хотя.