我正在用SDL写一个简单的游戏.我有一个类heirarchy,我正在构建我在游戏中使用的任何精灵.基类是Sprite,它包含碰撞框和spritesheet的数据抽象.直接在它下面是两个抽象类,Character和MapObject.
我目前正在实现从Character派生的Player类(Enemy和NPC也将派生自抽象Character类).
无论如何,希望这是有道理的.我的问题是:
当我尝试在引擎中使用播放器类时,我无法访问任何Sprite函数.
我收到以下错误:
'Sprite' is not an accessible base of 'Player'
以下是头文件:
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:
//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类继承任何东西,因此它在技术上不必从它派生.我没有从Sprite继承Character,而是让Player继承了BOTH Sprite和Character,这也很有用.我不确定什么是更好的设计.
解决方法
我想你需要改变
class Player : protected Character{
至
class Player : public Character{
这样,您就可以从程序中任何位置创建的Player实例访问Player对象上的Character和Sprite函数.
如果一个玩家应该能够做一个角色可以做的任何事情,公共继承是有道理的.没有理由在Player中隐藏可在Character或Sprite对象中自由访问的内容.