Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
1 / 1 / 0
Регистрация: 07.08.2014
Сообщений: 72
1

Переменная в классе сама обнуляется

11.02.2017, 14:42. Показов 2147. Ответов 20
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Сейчас начал изучать SFML и пишу мини-игру для закрепления. Но вопрос с SFML почти никак не связан, ибо такая проблема возникала и без SFML и окольными путями я ее решил. Сейчас же я запутался и прошу помощь.
В общем, ситуация такая. В мини-игре есть главный персонаж. Для него я сделал отдельный заголовочный файл и там определил класс главного персонажа. Также я создал файл исходного кода и в нем уже расписал методы класса.
В этом же исходнике я создал объект класса персонажа, для того, чтобы этот объект был доступен только в этом файле.
Также в нем я создал функцию, которая может быть вызвана в main(), чтобы воздействовать на персонажа.
Сейчас напишу упрощенный код, чтобы вы поняли.

C++
1
2
3
4
5
6
7
8
9
10
11
#include "Pers.h"
 
class_Pers Pers(19, 26, 5, 5);
...
//Методы класса
...
//Та самая функция, которая вызывается в main, обрабатывающая движение персонажа. 
void Lauf_Pers(sf::RenderWindow& Win, class_Level & Level)
{
    Pers.Lauf(Win, Level);
}
По замыслу в функции main должна вызываться эта функция. Она реагирует на нажатие кнопок и уже делает определенные действия. Так вот, в чем проблема. Класс персонажа содержит переменную для хранения спрайта. В конструкторе в эту переменную спрайт благополучно и помещается и там хранится. Но когда в main вызывается функция Lauf_Pers, и управление переходит к методу Lauf объекта, то внутри него мы видим, что эта переменная пустая. В итоге, вместо спрайта подгружается просто пустой квадрат.
Такое раньше было и с обычными переменными, но как-то я эту проблему решил, уже не помню как. Помогите разобраться с этой проблемой.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.02.2017, 14:42
Ответы с готовыми решениями:

Переменная не обнуляется до конца
Добрый день! Мне необходимо написать программу для расчета функции и вывести все ее значения в...

Переменная произвольно обнуляется
Здравствуйте. Есть класс: template<const int k,const int n> class GF { public: int F; //...

Почему во время чтения из файла переменная row_i в цикле постоянно обнуляется?
Имеется следующий код: #include <iostream> #include <fstream> using namespace std; int...

Переменная обнуляется
Здравствуйте. У меня есть такой код: class MyClass : MonoBehaviour { public static int...

20
Велосипедист...
353 / 220 / 73
Регистрация: 15.12.2015
Сообщений: 785
11.02.2017, 15:33 2
Цитата Сообщение от Саша Перков Посмотреть сообщение
В итоге, вместо спрайта подгружается просто пустой квадрат.
Насколько я помню, в конструктор объекта типа Sprite, нужно передавать объект типа Texture, в который, в свою очередь, должен быть передан объект типа Image.
Если вы передаете в конструктор перса спрайт, который содержит в себе текстуру без картинки, то вот, вот это и есть проблемой.
Или Вы все правильно сделали? Проверьте.
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
11.02.2017, 15:35 3
Зло глобальных переменных.
0
1 / 1 / 0
Регистрация: 07.08.2014
Сообщений: 72
11.02.2017, 16:07  [ТС] 4
Цитата Сообщение от Captain Maxee Посмотреть сообщение
Насколько я помню, в конструктор объекта типа Sprite, нужно передавать объект типа Texture, в который, в свою очередь, должен быть передан объект типа Image.
Если вы передаете в конструктор перса спрайт, который содержит в себе текстуру без картинки, то вот, вот это и есть проблемой.
Или Вы все правильно сделали? Проверьте.
Это проверил. Все сделал, как надо. Тут писали, что дело в глобальных переменных. Я тоже думаю, что из-за этого. Только вот никак не придумаю, куда ее деть, чтобы не была глобальной.
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
11.02.2017, 16:17 5
Саша Перков, для эксперимента, перенеси определение этой глобальной переменной в файл с main(), а в этом .cpp оставь объявление:
C++
1
extern class_Pers Pers;
0
1 / 1 / 0
Регистрация: 07.08.2014
Сообщений: 72
11.02.2017, 17:06  [ТС] 6
Цитата Сообщение от nd2 Посмотреть сообщение
Саша Перков, для эксперимента, перенеси определение этой глобальной переменной в файл с main(), а в этом .cpp оставь объявление:
Сделал. Все-равно тоже самое.
0
1 / 1 / 0
Регистрация: 07.08.2014
Сообщений: 72
11.02.2017, 17:12  [ТС] 7
Вот суть проблемы. На первом скриншоте показано, что происходит после создания объекта. А на втором, что происходит после метода. Я не понимаю, из-за чего такое произошло.
Миниатюры
Переменная в классе сама обнуляется   Переменная в классе сама обнуляется  
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
11.02.2017, 17:19 8
Цитата Сообщение от Саша Перков Посмотреть сообщение
Я не понимаю, из-за чего такое произошло.
В методе что происходит?
0
1 / 1 / 0
Регистрация: 07.08.2014
Сообщений: 72
11.02.2017, 17:32  [ТС] 9
Цитата Сообщение от nd2 Посмотреть сообщение
В методе что происходит?
Единственное, что там контактирует со спрайтом - это метод окна .draw, который использует спрайт как аргумент и рисует его в этом самом окне. Но я попробовал вывести этот метод в main, что никак не помогло.
Но теперь вот в каком моменте спрайт ведет себя неадекватно.
Что-то метод clear() творит.
Причем, если его убрать вообще, то ничего не меняется. Спрайт начинает вести себя неадекватно после отрисовки уровня. Но он никак не контактирует со спрайтом игрока.
Миниатюры
Переменная в классе сама обнуляется   Переменная в классе сама обнуляется  
0
1 / 1 / 0
Регистрация: 07.08.2014
Сообщений: 72
11.02.2017, 17:45  [ТС] 10
Перевел объект класса в main полностью. Теперь она не глобальная переменная. Но проблема не исчезла. Это видимо надо на форум SFML-щикам писать.
0
Велосипедист...
353 / 220 / 73
Регистрация: 15.12.2015
Сообщений: 785
11.02.2017, 19:06 11
Саша Перков, скинь код функции, возможно, ошибка там.
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
11.02.2017, 19:12 12
Код в студию.
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
11.02.2017, 19:51 13
Прикол спрайтов в SFML в том, что если текстура удаляется, то спрайт будет белым. Сам сталкивался, решилось хранением текстуры вместе со спрайтом.
1
1 / 1 / 0
Регистрация: 07.08.2014
Сообщений: 72
11.02.2017, 19:52  [ТС] 14
Цитата Сообщение от Croessmah Посмотреть сообщение
Код в студию.
А как большой код можно, скинуть, строчек там очень много? Даже если ненужное вырезать, то будет прилично. Может файлом как-то или на сайт специальный?

Добавлено через 52 секунды
Цитата Сообщение от GbaLog- Посмотреть сообщение
Прикол спрайтов в SFML в том, что если текстура удаляется, то спрайт будет белым. Сам сталкивался, решилось хранением текстуры вместе со спрайтом.
То есть как нужно сделать? Хранить и текстуру в объекте класса и постоянное ее в спрайт подгружать, так?
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
11.02.2017, 19:54 15
Цитата Сообщение от Саша Перков Посмотреть сообщение
То есть как нужно сделать?
Хранить текстуру, а рядом спрайт, спрайт можно и один раз инициализировать данной текстурой.
1
1 / 1 / 0
Регистрация: 07.08.2014
Сообщений: 72
11.02.2017, 19:57  [ТС] 16
Цитата Сообщение от GbaLog- Посмотреть сообщение
Хранить текстуру, а рядом спрайт, спрайт можно и один раз инициализировать данной текстурой.
Ну спрайт у меня хранится как переменная-член класса. Также и с текстурой сделать?
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
11.02.2017, 19:58 17
Цитата Сообщение от Саша Перков Посмотреть сообщение
Также и с текстурой сделать?
Агась.
0
1 / 1 / 0
Регистрация: 07.08.2014
Сообщений: 72
11.02.2017, 20:00  [ТС] 18
Цитата Сообщение от GbaLog- Посмотреть сообщение
Хранить текстуру, а рядом спрайт, спрайт можно и один раз инициализировать данной текстурой.
Парень - ты мой герой. Я сделал как ты сказал и все получилось. Весь день убил на решение проблемы. Спасибо тебе огромное. Ты, я так понял, SFML хорошо знаешь, можно как-то с тобой связываться, если будут вопросы? А то формы по SFML пусты обычно.

Все остальным, кто будет интересовать как я решил проблему - просто храните не только спрайт в классе, но и текстуру. Не знаю как это влияет, но это помогло.
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
11.02.2017, 20:05 19
Цитата Сообщение от Саша Перков Посмотреть сообщение
Ты, я так понял, SFML хорошо знаешь
Не, я просто с этим сталкивался неоднократно, поэтому пришлось искать причины.
Цитата Сообщение от Саша Перков Посмотреть сообщение
А то формы по SFML пусты обычно.
У нас есть, и он отнюдь не пустой! Милости просим.
https://www.cyberforum.ru/sfml/
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
11.02.2017, 20:19 20
Саша Перков, архив к сообщению приложите.
Врядли тут дело в sfml.
Скорее всего Вы допустили где-то ошибку.

upd:
как это влияет?
В спрайте sfml хранит указатель на текстуру.
Соответственно, та должна быть жива.
Для текстур лучше сделайте менеджер,
а не храните текстуры непосредственно в своих объектах
без особой на то причины. Текстуры - тяжелый ресурс.
0
11.02.2017, 20:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.02.2017, 20:19
Помогаю со студенческими работами здесь

Обнуляется переменная
Ребята, в общем такая проблема. При нажатии кнопки ok формы у меня почему-то обнуляется переменная...

Обнуляется переменная
Добрый день. Сразу предупреждаю, мягко говоря, код не очень красивый. Проблема такая, есть 2...

Обнуляется переменная
using System; namespace ConsoleApp6 { class Program

Обнуляется глобальная переменная
Добрый день. У меня обнуляется глобальная переменная, хотя и не должна. Идея в том, что каждой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru