加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 无法访问的基类

发布时间:2020-12-16 03:48:10 所属栏目:百科 来源:网络整理
导读:我正在用SDL写一个简单的游戏.我有一个类heirarchy,我正在构建我在游戏中使用的任何精灵.基类是Sprite,它包含碰撞框和spritesheet的数据抽象.直接在它下面是两个抽象类,Character和MapObject. 我目前正在实现从Character派生的Player类(Enemy和NPC也将派生自
我正在用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对象中自由访问的内容.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读