I am writing a simple game in SDL. I have a class hierarchy that I create for any sprite that I use in the game. The base class is Sprite, which contains data abstractions for the collision and sprite window. Immediately below are two abstract classes: Character and MapObject.
I am currently implementing the Player class, which is derived from Character (Enemy and NPC will also be derived from the abstract Character class).
In any case, I hope this makes sense. My problem is this:
When I try to use the player class in the engine, I cannot access any of the Sprite features.
I get the following error:
'Sprite' is not an accessible base of 'Player'
Here are the header files:
Sprite.h:
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; };
Character.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:
I get the first error in my engine when I try to call the configuration functions from Sprite in the player, the first of which:
player.setLoc(levels[0].startX(), levels[0].startY());
Any help is appreciated.
[SOLVED] EDIT: alternative comment solution: the character class did not inherit anything from the Sprite class, so technically it did not need to be derived from it. Instead of inheriting Character from Sprite, I had a Player inheriting from BOTH Sprite and Character, and it also worked. I am not sure if this is the best design.