Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.57/21: Рейтинг темы: голосов - 21, средняя оценка - 4.57
 Аватар для Limaaron
3 / 2 / 1
Регистрация: 14.08.2018
Сообщений: 51

Не работает отрисовка sfml

18.07.2019, 11:43. Показов 4651. Ответов 20
Метки dll, qt, sfml (Все метки)

Студворк — интернет-сервис помощи студентам
Написал небольшую обертку для sfml, которая регистрирует компоненты и вызывает функцию update и draw, проблема в том что когда я создаю компонент в dll всё отрисовывает, а когда в регистрирую компонент exe'шнике функция update и draw вызывается, но ничего не рисует

p.s пробовал передавать sf::RenderTarget по ссылке и указателю
Миниатюры
Не работает отрисовка sfml   Не работает отрисовка sfml   Не работает отрисовка sfml  

0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.07.2019, 11:43
Ответы с готовыми решениями:

Отрисовка в SFML
Уже не раз пытался найти ответ на вопрос как сделать отрисовку в отдельном потоке, ответ был таков что это невозможно. У меня возникла...

SFML отрисовка объектов
Здравствуйте. Помогите разобраться с отрисовкой объекта. У меня есть класс игрока. Для закрепления знаний решил попробовать создать класс...

Отрисовка в отдельном потоке SFML
Есть класс для фона, в нем функция возвращающая шейп этого фона. Нужно вынести отрисовку в отдельный поток, но вот что-то пошло не так... ...

20
 Аватар для Limaaron
3 / 2 / 1
Регистрация: 14.08.2018
Сообщений: 51
18.07.2019, 11:48  [ТС]
т.е если я создал наследника компонента в dll и скомпилировал то в exe'шнике я могу его зарегистрировать и он отрисует, а когда наследник компонента пишется в exe он не рисует
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
18.07.2019, 12:14
Цитата Сообщение от Limaaron Посмотреть сообщение
update и draw вызывается, но ничего не рисует
а эти методы у вас виртуальные?
0
 Аватар для Limaaron
3 / 2 / 1
Регистрация: 14.08.2018
Сообщений: 51
18.07.2019, 12:15  [ТС]
Да, функции start, draw и update виртуальные
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
18.07.2019, 12:17
попробуйте явно обозначить это с помощью override
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
18.07.2019, 12:19
Limaaron, а остальной код? Уж не насоздавали ли Вы глобальных объектов?

P.S. Выкладывать код скриншотами не нужно.
0
 Аватар для Limaaron
3 / 2 / 1
Регистрация: 14.08.2018
Сообщений: 51
18.07.2019, 12:20  [ТС]
Обозначил, не помогло
Миниатюры
Не работает отрисовка sfml  
0
 Аватар для Limaaron
3 / 2 / 1
Регистрация: 14.08.2018
Сообщений: 51
18.07.2019, 12:24  [ТС]
я создаю окно sfml через класс-обертку в котором есть sf::RenderWindow *renderWindow = new sf::RenderWindow(параметры)
в классе sf::RenderWindow *renderWindow - приватный, потом его я передаю в качестве renderTarget'a в Entity где через интерфейс component вызываю функции draw и update
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
18.07.2019, 12:28
Цитата Сообщение от Limaaron Посмотреть сообщение
я создаю окно sfml через класс-обертку
Покажите описание этого класса
1
 Аватар для Limaaron
3 / 2 / 1
Регистрация: 14.08.2018
Сообщений: 51
18.07.2019, 12:29  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
    class DESHARED_EXPORT De
    {
    public:
        De(int &argc, char **argv);
        void registerComponent(Component *component);
        bool isOpen();
        static void createRenderWindow(De*miniEngine, unsigned int width, unsigned int height, const QString &title, sf::Uint32 style = sf::Style::Default);
 
        void setFpsLimit(int fps);
        void start();
        void updateEvents();
        void update();
        void display();
 
        ~De();
    private:
        sf::RenderWindow *renderWindow;
        Entity *entity;
    };
 
 
    // статическая 
    void De::createRenderWindow(De* miniEngine, unsigned int width, unsigned int height, const QString &title, sf::Uint32 style)
    {
        miniEngine->renderWindow = new sf::RenderWindow(sf::VideoMode(width, height), title.toStdString(), style);
    } 
 
    void De::start()
    {
        entity->startEntities();
    }
 
    void De::updateEvents()
    {
        sf::Event event;
        while (renderWindow->pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                renderWindow->close();
 
            entity->updateEvents(&event);
        }
    }
 
    void De::update()
    {
        renderWindow->clear();
        entity->updateEntities(renderWindow);
    }
 
    void De::display()
    {
        renderWindow->display();
    }
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
18.07.2019, 12:34
Цитата Сообщение от Limaaron Посмотреть сообщение
Entity *entity;
А это что за обертка?
1
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
18.07.2019, 12:36
Где и когда вызывается createRenderWindow?
Вам необходимо проследить, чтобы до запуска main не создавались никакие мультимедийные объекты SFML.
0
 Аватар для Limaaron
3 / 2 / 1
Регистрация: 14.08.2018
Сообщений: 51
18.07.2019, 12:41  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    class Entity
    {
    public:
        void registerComponent(Component *component);
 
        void startEntities();
        void updateEvents(sf::Event *event);
        void updateEntities(sf::RenderTarget *target);
 
        void deleteComponentById(unsigned int id);
        void deleteComponentByTagName(QString name);
    private:
        std::list<Component*> entities;
        std::list<Component*>::iterator It;
    };
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
    void Entity::registerComponent(Component *component)
    {
        entities.push_back(component);
    }
 
    void Entity::startEntities()
    {
        for (auto entity : entities)
        {
            entity->start();
        }
    }
 
    void Entity::updateEvents(sf::Event *event)
    {
        for (auto entity : entities)
        {
            entity->event(event);
        }
    }
 
    void Entity::updateEntities(sf::RenderTarget *target)
    {
        for (auto entity : entities)
        {
            entity->update();
            entity->draw(target);
        }
    }
    // удаление пока не реализовано
Добавлено через 4 минуты
// main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <de.h>
int main(int argc, char *argv[])
{
    De *de = new De(argc, argv);
    De::createRenderWindow(de, 300,300, "GAME");
 
    Player player;
    de->registerComponent(&player);
 
    de->start();
 
//    sf::Clock clock;
 
    while (de->isOpen())
    {
        de->updateEvents();
        de->update();
        de->display();
    }
}
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
18.07.2019, 12:45
Limaaron, В вашем случае сигнатура draw у компонента должна принимать указатель а не ссылку(про override не забудьте, что бы не запутаться)
1
 Аватар для Limaaron
3 / 2 / 1
Регистрация: 14.08.2018
Сообщений: 51
18.07.2019, 13:00  [ТС]
обертка находится в dll файле, в main я только создаю эту обертку из dll и регистрирую Entity, подвох в том что если я создаю компонент в dll он работает и рисует, а если я создаю компонент в exe'шнике он вызывает методы, но не рисует...

Добавлено через 6 минут
draw принимает ссылку в конечном итоге
C++
1
2
3
4
5
6
7
8
    void Entity::updateEntities(sf::RenderTarget *target)
    {
        for (auto entity : entities)
        {
            entity->update();
            entity->draw(*target);
        }
    }
Добавлено через 7 минут
пробовал 2 разных метода во всех классах
C++
1
2
  void draw(sf::RenderTarget *target)
  void draw(sf::RenderTarget &target)
0
 Аватар для Limaaron
3 / 2 / 1
Регистрация: 14.08.2018
Сообщений: 51
18.07.2019, 13:14  [ТС]
Разница только в том что класс из неймспейса de был создан в dll, а тот что без неймспейса в exe, код одинаковый, я просто скопировал код из dll и убрал неймспейс
Миниатюры
Не работает отрисовка sfml   Не работает отрисовка sfml  
0
 Аватар для Limaaron
3 / 2 / 1
Регистрация: 14.08.2018
Сообщений: 51
18.07.2019, 13:26  [ТС]
zayats80888 он принимает указатель, это я тогда пробовал все варианты

Добавлено через 2 минуты
Croessmah renderWindow создается в main и только там, после чего идет регистрация компонентов, и вызов функций update и draw
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
18.07.2019, 13:30
Цитата Сообщение от Limaaron Посмотреть сообщение
Разница только в том что класс из неймспейса de был создан в dll, а тот что без неймспейса в exe
а класс de::Component, от которого вы наследуете своего Player описан как dllexport/dllimport?
1
 Аватар для Limaaron
3 / 2 / 1
Регистрация: 14.08.2018
Сообщений: 51
18.07.2019, 13:53  [ТС]
zayats80888, да

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    
class DESHARED_EXPORT Component
    {
    public:
        Component(const QString &name);
 
        virtual void start()                            = 0;
        virtual void event(sf::Event *event);
        virtual void update()                           = 0;
        virtual void draw(sf::RenderTarget *target)     = 0;
 
        QString getName() const;
        unsigned int getId() const;
 
        virtual ~Component();
 
    private:
        static unsigned int Count;
        unsigned int id;
        QString name;
    };
Добавлено через 21 минуту
zayats80888, методы update и draw в цикле после регистрации вызываются, не вызывается отрисовка
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
18.07.2019, 13:59
Лучший ответ Сообщение было отмечено Limaaron как решение

Решение

Limaaron, я так понимаю у вас VisualStudio, если это возможно, скиньте архив с проектом. Свободное время будет - я отладчиком побегаю посмотрю.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.07.2019, 13:59
Помогаю со студенческими работами здесь

Генерация сигнала и отрисовка результата используя SFML
Всем привет! Помогите пожалуйста разобраться, как правильно сгенерировать сигнал и передать эти данные для отрисовки в графической...

Не работает SFML
Debug.

Не работает отрисовка поля
Столкнулся с такой проблемой: не работает отрисовка игрового поля. Пишу игру &quot;Змейка&quot;. Делаю так: при нажатии на кнопку play...

Не работает SFML на Code::Blocks
Debug.

Не работает отрисовка background-image
Всем доброго времени суток. Создаю в дизайнере виджет с такой структурой: RodTypeDlg - QWidget - btnAddItem - QPushButton -...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru