ネットバックに基づいたローグライク ゲームでは、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
}
}