Созданные ответы форума
-
АвторСообщения
-
Нет это не должно влиять. А проекты без SFML нормально работают?
sandreev86, у меня для вас две новости, по традиции плохая и хорошая =)
Начнем с хорошей: ваша программа нормально собирается и работает у меня. Отсюда же следует и плохая: это ни на сколько не решает вашу проблему.
Однако у меня еще есть пара идей:
- попробуйте собрать и запустить приложение в режиме релиза,
- покажите переменную среды path в среде окружения запуска проекта. Для этого перейдите во вкладку “Проекты” в левом меню, в открывшемся окне выберите вкладку “Запуск” и раскройте область “Среда выполнения” там вы найдете переменные среды.
Ну у меня программа падает вот в этом месте:
C++1234567Object Level::GetObject(std::string name){// только первый объект с заданным именемfor (int i = 0; i < objects.size(); i++)if (objects[i].name == name)return objects[i];}Причина в том, что из данного метода ничего не возвышается, если объект с таким именем не был найден. Что еще раз доказывает, что факапу быть, если игнорировать предупреждения(warning) компилятора. Я вижу два решение данной проблемы:
- Возвращать в конце данного метода объект с вызовом конструктора по умолчанию и затем проверять результат на не равенство объекта созданного с конструктором по умолчанию. (Не рекомендую)
- Создать класс исключения “объект не найден” и бросать его в конце данного метода.
Если смотреть в глубь проблемы, то данного объекта нет из-за того что уровень (класс Level) не был загружен по причине отсутствия тайлсета.
C++12345if (!img.loadFromFile(imagepath)){std::cout << "Failed to load tile sheet." << std::endl;//если не удалось загрузить тайлсет-выводим ошибку в консольreturn false;}Отсюда можно сделать следующие выводы:
- либо вы не приложили папку изображений в архив и у вас совершенно другая причина не работоспособности;
- либо вам следует проверять результат вызова метода Level::LoadFromFile и завершать работу программы с ошибкой, если уровень не был загружен.
C++1234if(!lvl.LoadFromFile("map.tmx")) { //загрузили в него карту, внутри класса с помощью методов он ее обработает.std::cerr << "Level was not load" << std::endl;return 2;}P.S.: настоятельно рекомендую всем исправлять warning’и, которые возникают при компиляции.
Скинь код и проектный файл, экстрасенсорная тех. поддержка это не самая легкая задача.
На старые не получиться. Вот example сборки для android: github.com/SFML
SadHermit, ты можешь создавать переменные в глобальной области видимости, но ты не можешь просто вызывать функции и метод в глобальной области видимости. Тебе нужно поместить твой код например в функцию main.
10.02.2016 в 19:42 в ответ на: Трансформация изображения (а так же его адаптивность под разные разрешения) #3020+1Пардонте, проглядел в доке, что x и y это поля класса, а не методы. Правильно будет так:
C++1234Image image;image.loadFromFile("img/015_cg02_02.png");Vector2u size = image.getSize();int sizeX = size.x, sizeY = size.y;10.02.2016 в 11:17 в ответ на: Трансформация изображения (а так же его адаптивность под разные разрешения) #3015+1Получить размеры загруженного изображения можно так:
C++1234sf::Image image;image.loadFromFile("file.png");sf::Vector2u size = image.getSize();int sizeX = size.x(), sizeY = size.y();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){}};09.02.2016 в 23:07 в ответ на: Подключение SFML 2.3.2 к Qt для разработки приложений под Android (Windows 7) #3006MatrixDeity, ты не совсем прав. Google рекомендует использовать ndk для приложений, интенсивно использующих CPU, таких как: игровые движки, работа с сигналами и симуляция физики.
Вот кстати wiki-страница c GitHub SFML по теме. Если я когда нибудь докачаю SDK, NDK и ANT, то попробую собрать пример.
MatrixDeity, только лучше делать не полями класса, а методами и лучше виртуальными. Таким образом мы можем варьировать урон и дать возможность легкой реализации критических атак. Так же в дальнейшем в наследуемых классах будет легко переопределить эту логику.
08.02.2016 в 20:55 в ответ на: Есть ли что то типа словаря с описанием всех функций и методов sfml? #2974+1Официальная документация: http://www.sfml-dev.org/documentation. Описание ко всем классам.
Приведи более развернутый пример.
Heisenberg, мне одному кажется что ты сначала умножаешь переменную angle на 180/PI, а затем на обратное число PI/180. Не лучше ли просто хранить угол в радианах?
C++12345// const float DIST_SHOOT_GUN = Расстояние от центра спрайта до дула ружья, подбирается методом тыка// Место появления пули будетfloat angle = atan2f(mousePos.y - hero.getPosition().y, mousePos.x - hero.getPosition().x);sf::Vector2f dist_Shot_Position(cos(angle) * DIST_SHOOT_GUN, sin(angle) * DIST_SHOOT_GUN);CreateBullet(dist_Shot_Position, ....);Лучше использовать cmath
-
АвторСообщения