1

ネットバックに基づいたローグライク ゲームでは、Creatureと呼ばれる派生クラスを持つ基本エンティティがあります。また、 PlayerというCreatureの別の派生クラスもあります。

Playerは基本的にCreatureですが、メソッドが追加または変更されているため、私の攻撃メソッド (両方の場合) はCreatureオブジェクトへの 2 つのポインターを受け取ります。1 つは攻撃されているクリーチャー用で、もう 1 つはプレイヤー用です。

仮想メソッド attack のプレーヤー バージョンでは、戦闘を反映するようにプレーヤーの XP および Score メンバー変数を設定する必要があります。次のようなエラーが表示され続けます。

Player.cpp:34:11: error: ‘class Creature’ has no member named ‘setScore’
Player.cpp:34:29: error: ‘class Creature’ has no member named ‘getScore’

私が推測しているのは、それがクリーチャータイプであるためです..しかし、実際にプレーヤーのメソッドを利用できるようにキャストすることはできません。

Creatureで "setXp" と "getXp" が定義されていることにも気付きましたしかし、CreatureにはXPがありません..スコアメソッドをCreatureに追加して、Playerで定義することはできますか?

これを行うにはどうすればよいですか?ありがとう!コードの一部を次に示します。さらに必要な場合はお知らせください。

Player.h

#ifndef _Player_included_
#define _Player_included_

#include "Creature.h"
#include "Weapon.h"
#include "Armor.h"

class Player : public Creature {

public:
    Player(void);
    virtual ~Player(void);

    void dumpStats();
    virtual bool move(char dir, DungeonLevel & dl, std::mt19937 & randomGen$
    virtual bool canAttack(DungeonLevel & dl);
    int getHit(std::mt19937 & randomGen);
    bool fightOrFlight(DungeonLevel & dl, std::mt19937 & randomGen);
    virtual void attack(Creature * monster, Creature * player, std::mt19937$

    void generateHP();
    void addXp(int xpToAdd);
    void addScore(int xpToMultiply); //score is just 2x the xp.
    virtual int getScore();
    virtual void setScore(int scoreToSet);
    virtual int getXp();
    virtual void setXp(int xpToSet);

    void setXPToLevel(int xpToLevelToSet);
    int getXPToLevel();
private:
    //Creature provides level, HP, and maxHP
    int score;
    int xp;
    int xpToLevel;
    Weapon * playerWeapon;
    Armor * playerArmor;
};

#endif

Player.cpp の攻撃方法

void Player::attack(Creature * monster, Creature * player, std::mt19937 & randomGen, Du$
    int monsterHit = monster->getHit(randomGen);
    int playerHit = getHit(randomGen);

    player = static_cast<Player*>(player);

    if ((monster->getHP() - playerHit) <= 0){
            playerHit = monster->getHP();
            player->addXp(playerHit);
            player->setScore((player->getScore()) + (2 * playerHit)));
            cout << "Monster name: " << monster->getName() << endl;
            cout << "monster killed: " << monster << endl;
            monster->removeMonster(dl);
    }
    else if (monster != NULL){
            cout << "Monsters Hit: " << monsterHit << endl;
            player->setHP((player->getHP()) - monsterHit);
            player->addXp(playerHit);
            player->setScore((player->getScore()) + (2 * playerHit)));
            monster->setHP((monster->getHP() - playerHit));
            cout << "Your HP: [" << player->getHP() << "]/[" << player->getMaxHP() $
            cout << "Monsters HP: [" << monster->getHP() << "]/[" << monster->getMa$
    }
    else if ((player->getHP() - monsterHit) <= 0){
            monsterHit = player->getHP();
            //game over
    }

    cout << "You hit: " << playerHit << endl;
}

Creature.h

#ifndef _Creature_included_
#define _Creature_included_

#include "Entity.h"
#include "DungeonLevel.h"

#include <random>

class Creature : public Entity {

public:
    Creature(void);
    virtual ~Creature(void);

    virtual void dumpObject();
    virtual void dumpObjectData();
    virtual void writeFragment(std::ostream & output);
    virtual void writeDataAsFragment(std::ostream & output);
    virtual void setElementData(std::string elementName, std::string elementValue);

    virtual bool move( DungeonLevel & dl, Creature & player, std::mt19937 & randomGen);
    virtual void attack(Creature * monster, Creature & player, std::mt19937 & randomGen, DungeonLevel & dl);
    virtual int getHit(std::mt19937 & randomGen);

    virtual bool canAttack();
    virtual void removeMonster(DungeonLevel & dl);

    virtual void setXLoc(int xToSet);
    virtual int getXLoc();
    virtual void setYLoc(int yToSet);
    virtual int getYLoc();

    virtual void setXp(int xpToSet);
    virtual int getXp();
    virtual void addXp(int xpToAdd);

    virtual int getLevel();
    virtual void setLevel(int levelToSet);
    virtual int getHP();
    virtual void setHP(int HPToSet);
    virtual int getMaxHP();
    virtual void setMaxHP(int maxHPToSet);

private:
    int xLoc;
    int yLoc;
    int level;
    int HP;
};

#endif

Creature.cppでの攻撃方法

void Creature::attack(Creature * monster, Creature & player, std::mt19937 & randomGen,  DungeonLevel & dl){
    int monsterHit = monster->getHit(randomGen);
    int playerHit = player.getHit(randomGen);

    if ((monster->getHP() - playerHit) <= 0){
            playerHit = monster->getHP();
            cout << "Monster name: " << monster->getName() << endl;
            this->removeMonster(dl);
            cout << "back to creature attack with monster removed.."<<endl; 
            cout << "delete monster here." << endl;
    }
    else if ((player.getHP() - monsterHit) <= 0){
            cout << "You died. Game Over." << endl;
            //make a function to end the game
    }
}
4

1 に答える 1

1

この線

player = static_cast<Player*>(player);

実際には何もしません。player同じ型の同じ変数がまだありますCreature*(この型で宣言されているため)。代わりに、あなたは書くことができます

Player* player_ref = reinterpret_cast<Player*>(player);を使用しますplayer_ref -> setScore();

ただし、ポリモーフィック ソリューションの方が適切です。

于 2013-05-04T21:57:22.167 に答える