SFML и C++ Уроки \ Разработка игр › Форумы › Логика игр › Реализация атаки и защиты
В этой теме 7 ответов, 5 участников, последнее обновление XdubHaosX 8 года/лет, 1 месяц назад.
-
АвторСообщения
-
Добрый день. Как мне реализовать атаку на врага?.Есть два класса ,игрок и враг,унаследованы от Класа Юнит.В классе юнит лежит в паблик int health; Когда в класе игрок я пишу метод атака() , то не могу изменять переменную класа враг.Прошу помощи.
Вложения:
You must be logged in to view attached files.попробуй передавать по ссылке &
zelloooo1997, Здравствуйте!
У родительского класса Unit можно объявить protected поля health и damage, а также публичный метод attack:
C++123456789101112class Unit{public:void attack(Unit* attacked){attacked->health -= this->damage;}protected:int health;int damage;};Тогда, если player атакует enemy:
C++1234Unit* player = new Player();Unit* enemy = new Enemy();player->attack(enemy); // Игрок атакует врага, нанося ему уронОт себя могу добавить, что мой код не является исчерпывающим. Не хватает полей (вроде maxHealth и т.д.), необходимы полноценные конструкторы, которые будут инициализировать поля, проверка текущего здоровья атакуемого юнита после нанесения урона (чтобы знать о его смерти, если таковая случится). Одним словом, код требует вашей доработки
MatrixDeity, только лучше делать не полями класса, а методами и лучше виртуальными. Таким образом мы можем варьировать урон и дать возможность легкой реализации критических атак. Так же в дальнейшем в наследуемых классах будет легко переопределить эту логику.
RazorNd, код в студию
MatrixDeity, да пожалуйста 😉
C++123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254/*** @brief The AbstractUnit class* Абстрактный класс объета со здоровьем, может получать урон в методе AbstractUnit::takeDamage()* сбособен нанести урон объекту передонному в качестве параметра метода AbstractUnit::atack()*/class AbstractUnit{protected:/*** @brief takeDamage абстрактный метод принимающий урон вызывается в методе класса AbstractUnit::atack()* @param damage уровень урона полученного объектом*/virtual void takeDamage(float damage) = 0;public:virtual ~AbstractUnit() {}/*** @brief getDamage абстрактный метод возращающий уровень урона нанесенного объектом* @return число характерезующее уровень урона*/virtual float getDamage() const = 0;/*** @brief atack метод наносящий урон объекту* @param object объект получающий урон*/void atack(AbstractUnit *object) const{object->takeDamage(getDamage());}/*** @brief getHealthLevel метод возвращающий уровень здоровья объекта* @return число характеризующие уровень здоровья объекта*/virtual float getHealthLevel() const = 0;/*** @brief isLife метод проверяющий жив ли еще объект* @return true если жив, false если мертв*/bool isLife() const{return getHealthLevel() > 0.0;}};/*** @brief The SimpleHealthedObject class* Простой класса реализующий интерфейс AbstractUnit содержит число характеризующее* уровень здоровья объекта. Весь полученный урон вычитается из здоровья объекта*/class AbstractSimpleHealthedUnit : public virtual AbstractUnit{float _health;public:/*** @brief SimpleHealthedObject конструкто устанавливающий уровень здоровья объекта* @param health число характеризующее уровень здороья объекта*/AbstractSimpleHealthedUnit(float health) : _health(health){}protected:/*** @brief setHeath метод устанавливающий уровень здоровья* @param health число характеризующее уровень здороья объекта*/void setHeath(float health){_health = health;}// AbstractHealthedObject interfaceprotected:/*** @brief takeDamage метод принимающий урон полученный объектом,* весь полученный урон вычитается из здоровья объекта* @param damage уровень урона полученного объектом*/virtual void takeDamage(float damage) override{setHeath(getHealthLevel() - damage);}public:/*** @brief getHealthLevel метод возращающий уровень здоровья персонажа* @return*/virtual float getHealthLevel() const override{return _health;}};/*** @brief The AbstractBasedDamageUnit class* Класс реализующий интерфейс AbstractUnit и умеющий равномерно распределенную атаку между minDamage и maxDamage*/class AbstractBasedDamageUnit : public virtual AbstractUnit{float _minDamage;float _maxDamage;static std::default_random_engine _engine;protected:/*** @brief setMaxDamage установить число максимально возможной атаки* @param maxDamage максимально возможная атака*/void setMaxDamage(float maxDamage){_maxDamage = maxDamage;}/*** @brief setMinDamage установить число минимально возможной атаки* @param minDamage минимально возможная атаки*/void setMinDamage(float minDamage){_minDamage = minDamage;}/*** @brief getRandomEngine метод возвращающий генератор случайных чисел* @return генератор случайных чисел*/std::default_random_engine& getRandomEngine() const{return _engine;}public:/*** @brief getMaxDamage метод возвращающий максимально возможную атаку* @return максимальная возможная атака*/float getMaxDamage() const{return _maxDamage;}/*** @brief getMinDamage метод возвращающий минимально возможную атаку* @return минимально возможная атака*/float getMinDamage() const{return _minDamage;}// AbstractDamagedObject interfacepublic:AbstractBasedDamageUnit(float minDamage, float maxDamage):_minDamage(minDamage), _maxDamage(maxDamage){}virtual ~AbstractBasedDamageUnit() {}/*** @brief getDamage метод возвращает число урона от атаки, формуриется как случайное число в* промежутке от [minDamage, maxDamage)* @return число урон от атаки*/virtual float getDamage() const override{std::uniform_real_distribution<float> randomDistribution(getMinDamage(), getMaxDamage());return randomDistribution(getRandomEngine());}};std::default_random_engine AbstractBasedDamageUnit::_engine;/*** @brief The AbstractCriticalDamageUnit class* Класс реализующий возможность (с заданной вероятностью) выпадения критической атаки умножающий базовый* урон на множитель критической атаки*/class AbstractCriticalDamageUnit : public virtual AbstractBasedDamageUnit{float _criticalChance;float _damageMultiplier;protected:/*** @brief setCriticalChance метод устанавливающий вероятность выпадения критической атаки* @param chance вероятность выпадения критической атаки*/void setCriticalChance(float chance){_criticalChance = chance;}/*** @brief setDamageMultiplier метод устанавливающий множитель урона при критической атаки* @param multiplier множитель урона*/void setDamageMultiplier(float multiplier){_damageMultiplier = multiplier;}public:AbstractCriticalDamageUnit(float criticalChance, float damageMultiplier):_criticalChance(criticalChance),_damageMultiplier(damageMultiplier){}virtual ~AbstractCriticalDamageUnit() {}/*** @brief getCriticalChance метод возвращающий вероятность выпадения критической атаки* @return вероятность критической атаки*/float getCriticalChance() const{return _criticalChance;}/*** @brief getCriticalDamageMultiplier метод возвращающий множитель критической атаки* @return множитель критической атаки*/float getCriticalDamageMultiplier() const{return _damageMultiplier;}// AbstractUnit interfacepublic:/*** @brief getDamage метод возвращающий число урона от атаки, с заданной вероятностью* возможно умножение базового урона на множитель критической атаки* @return урон от атаки*/virtual float getDamage() const override{std::binomial_distribution<bool> random(1, _criticalChance);if(random(getRandomEngine())){return AbstractBasedDamageUnit::getDamage() * getCriticalDamageMultiplier();}return AbstractBasedDamageUnit::getDamage();}};class ExampleUnit : public AbstractSimpleHealthedUnit, AbstractCriticalDamageUnit{public:ExampleUnit() :AbstractBasedDamageUnit(20.0, 25.0),AbstractSimpleHealthedUnit(200.0),AbstractCriticalDamageUnit(0.2, 2.5){}};RazorNd, хорошо, очень исчерпывающе В другой раз прикладывайте код сразу.
И помните, вы отвечаете не мне, а ТС.
Ай да всё проще чем ты думаешь =)
Если поймёшь о чём я =)1. Все все объекты заливаешь в 1 таблицу
2. Проходишь (update) по всем объектам
3. И в самом классе объекта пропиши все взаимодействия с игроком. ИМЕННО в классе врагаПримерно так http://joxi.ru/xAeN4p7uY5O9Nr
-
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.