Sfml окно сразу закрывается

Обновлено: 20.05.2024

SFML окно не появляется

Программа написана на C ++ с использованием Codelite и скомпилирована с использованием g ++. В данный момент я работаю с планшетом / нетбуком Windows 8 Professional, и хотя я не могу его протестировать, пока не получу доступ к другому компьютеру, ранее он работал нормально, и у меня нет оснований полагать, что он перестал работать так вне текущей среды. Какие-либо предложения?

Ничего не выводится на консоль, кроме запроса ввода для ввода, который приходит после выполнения. Программа возвращает 0.

Решение

Мне кажется, что ваша функция инициализации окна рендеринга, скорее всего, является проблемой. Вы возвращаете указатель на локальную переменную, которая будет работать, но вы не получите свое окно.

Либо вам нужно объявить указатель вашего приложения вне основного, как

или вы можете перейти к более простому решению и просто создать окно в основной функции.

Обратите внимание, что вы все равно можете передать это окно в свои функции, если оно создано в main, выполнив

Где ваша функция инициализации должна взять sf::RenderWindow* в качестве параметра.

Другие решения

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

C ++ sfml получает событие закрытия сразу после открытия окна

Я пытаюсь следовать руководству по SFML по этой ссылке, однако по какой-то причине мое приложение похоже, вызывает событие закрытия, как только моя программа входит в цикл событий.

После этого окно открывается и работает, как ожидалось.

P.S это сделано с использованием xcode и шаблона SFML.

Изменить:
Только что создал новый проект SFML xcode и удалил из него некоторый код, чтобы сделать пустое окно, и оно, кажется, работает. Код выглядит точно так же. Это выглядит странно, потому что это точно такой же код.

iProgram 11 Фев 2015 в 20:59

2 ответа

Лучший ответ

Из того, что я видел, не используйте оператор if для проверки событий, используйте оператор switch. Также используйте while(window.isOpen()) при попытке опроса событий

Gor1999 13 Фев 2015 в 16:31

Ваша проблема в том, что вы объявили переменную Event Event type, вам нужно изменить имя переменной на нижний регистр.

Зависающее окно. Окно не отвечает

В этой теме 3 ответа, 2 участника, последнее обновление KindRedSand 4 года/лет, 3 мес. назад.

Репутация:0

Всем доброго дня! Впервые пишу вам на форум, ибо все перерыл.Пишу игру. Типо арены. Через компилятор все норм. но когда запускаю Debug вот это и выходит. пробовал через новый поток, пробовал переписывать несколько раз, даже sendMessege пробовал, ну как пробовал. пытался попробовать) Буду очень признателен за любой совет и помощь. исходник получился очень большой со множеством файлов, поэтому хз как прикрепить его)

SFML(?) Зависающее окно

Есть программа. При нажатии на кнопке в основном меню запускается процедура для совершения определенного действия. Процедура работает некоторое время (сек 5-10), после чего окно становится "серым", и в титле написано "не отвечает".

Кликните здесь для просмотра всего текста
Во время зависания в консоль не останавливает своей работы, все выводит нормально. Главное окно перестает считывать нажатия.

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы ( 1 ) 94731 / 64177 / 26122 Ответы с готовыми решениями:

Не отвечает окно приложения SFML
Собрал приложение простой отрисовки круга. Запускаю exe, открывается приложение и просто висит.

SFML не появляется окно при запуске exe файла
Не появляется окно при запуске exe файла. Ни с release ни с debug. Ни с х64 ни с х86. Но если.

SFML окно, нету методов создания поля для ввода?
Вот понадобилось в окне поле для ввода, вот только где мне его найти, создавши консольный проект, и.

1356 / 994 / 315 после чего окно становится "серым", и в титле написано "не отвечает".

nonedark2008, до сего момента я не имел представления о понятии поток. Сейчас я прочитал краткие обобщенные понятия, и мне кажется что я понял ваш ответ. Но я не совсем понимаю, как могло получится что они работают в одном потоке?

И что мне делать в данном случае, как сказать системе выбрать другой поток?

1356 / 994 / 315

Решение

И что мне делать в данном случае, как сказать системе выбрать другой поток?

nonedark2008, все прекрасно и доходчиво объяснили. Спасибо.

Добавлено через 7 минут
//
В моем случае достаточно было добавить обработку событий, которые, если я таки понял правильно, являются потоками.

87844 / 49110 / 22898

Помощь в написании контрольных, курсовых и дипломных работ здесь.

SFML в C::B пытается что-то найти в D:\sfml-release\ которого нет
Добрый день, вторые сутки пытаюсь подключить SFML библиотеку к C::B. При подключении по мануалу с.


D:\C++ Projekts\SFML\main.cpp [Error] SFML\Graphics.hpp: No such file or directory
Пытаюсь начать кодить на библиотеке SFML но при компиляции пучтого проэкта выдает .


Не могу вставить фото в окно sfml (failed to load image "hero.jpg". Reason: Unable to open file)
Не могу вставить фото в окно sfml(failed to load image "hero.jpg". Reason: Unable to open file)


Ошибка: CMake Error at deps/SFML/src/SFML/Window/CMakeLists.txt:106 (message): Xrandr library not found
Собсна, решил собрать библиотеку , столкнулся с непонятками, но потом дошло что не так, начал.


Создание релиза exe файла SFML C++ на VS 2017 (не удается открыть входной файл "sfml-graphics-s.lib")
не могу собрать решение релиз версии, не пойму что я делаю не так постоянно выдает ошибку 1>LINK.

Создать окно произвольного размера, скрыть окно, показать окно, удалить окно.
Создать окно произвольного размера, скрыть окно, показать окно, удалить окно. Для создания окна.

Не отвечает окно приложения SFML

Помощь в написании контрольных, курсовых и дипломных работ здесь.

94731 / 64177 / 26122 Ответы с готовыми решениями:


SFML(?) Зависающее окно
Есть программа. При нажатии на кнопке в основном меню запускается процедура для совершения.

Свойство, которое отвечает за модальное окно со скроллом
вообще я пишу на ПХП, но тут срочно понадобилось открыть по ссылке модальное окно со скроллом. а.

Плата не отвечает на сигналы Bluetooth приложения
Хочу задать вам вопрос как специалистам программирования. Есть плата, она запрограммирована на.

SFML проект вылетает

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы ( 1 ) 94731 / 64177 / 26122 Ответы с готовыми решениями:

Не могу скомпилировать проект компилятором g++ (SFML, Debian 9)
Установлена библиотека libsfml-dev 2.4.1 Пример программы переписал из ролика на youtube.

Проект на OpenCV вылетает
Коротко: 1. Скачал бинарники (Win) 2. Создал проект (VS2010). 3. Написал семпл код. 4.


Не получается скомпилировать проект SFML (2.3.2)
Причем именно Release не получается, Debug исправно работает :с Ошибка 19 error LNK2001.

SFML проект не хочет компилироваться
Все правильно настраивал, по инструкции. Пишет: Ошибка LNK2019 ссылка на неразрешенный внешний.

Окно SFML закрывается с ошибкой сегментации

Работаем над реализацией базового стека состояний и сделали базовое меню. Я получаю доступ к меню через общий указатель. Окно загружается правильно, но когда я иду рисовать объект (из другого класса, который имеет копию общего указателя в качестве атрибута), ничего не происходит. Окно остается пустым (или, скорее, прозрачным) пример здесь , хотя не останавливается (окно все еще можно перемещать) до тех пор, пока оно не закроется, где программа останавливается с ошибкой сегмента на строке, где класс пытается нарисовать объект.

game указатель на класс игрового менеджера (который обрабатывает стек состояний), и он имеет умный указатель на window как один из его атрибутов

Я установил, что все соответствующие функции (init, update и draw) запущены и проверил, что объект окна не уничтожен, но не может найти причины для этого.

Я разрабатываю программу на GitHub Вот и был бы благодарен за любой вклад в то, почему программа не функционирует.

РЕДАКТИРОВАТЬ: Окно не появилось, потому что я не вызывал функцию рисования окон. Однако программа по-прежнему завершается с ошибкой сегмента, когда окно закрывается в функции рисования менеджера игр:

SFML окно не отвечает

Я начинающий программист на C ++, я делаю игру со змеями и пытаюсь использовать библиотеку SFML. Я хочу сделать свое приложение змеиной консоли, но я хочу отобразить счет в окне SFML. Мало того, что я не знаю, как отобразить счет в окне, хотя я всю ночь искал решение. Плюс мое окно SFML продолжает не отвечать.

Я рендерил окно со следующим кодом:

Затем я попытался отобразить счет внутри игрового цикла:

Полный код внутри main ():

Решение

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

3.1 Открытие и управление окнами


От переводчика: данная статья является девятой в цикле переводов официального руководства по библиотеке SFML. Прошлую статью можно найти тут. Данный цикл статей ставит своей целью предоставить людям, не знающим язык оригинала, возможность ознакомится с этой библиотекой. SFML — это простая и кроссплатформенная мультимедиа библиотека. SFML обеспечивает простой интерфейс для разработки игр и прочих мультимедийных приложений. Оригинальную статью можно найти тут. Посвящается Еве Вайт. С днем рождения;). Начнем.

Оглавление:

1. Приступая к работе

  1. Рисование 2D объектов
  2. Спрайты и текстуры
  3. Текст и шрифты
  4. Формы
  5. Проектирование ваших собственных объектов с помощью массивов вершин
  6. Позиция, вращение, масштаб: преобразование объектов
  7. Добавление специальных эффектов с шейдерами
  8. Контроль 2D камеры и вида
  1. Проигрывание звуков и музыки
  2. Запись аудио
  3. Пользовательские потоки аудио
  4. Спатиализация: звуки в 3D

Вступление

Эта статья объясняет, как открыть и управлять окном. Рисование в окне выходит за пределы задач, решаемых модулем sfml-window ; эту задачу решает модуль sfml-graphics . Однако управление окном с использование модуля sfml-graphics выполняется также, так что чтение данной статьи важно в любом случае.

Открытие окна

В SFML окна представлены классом sf::Window. Окно может быть создано напрямую из конструктора данного класса:


Первый аргумент — видео режим, определяет размер создаваемого окна (размер области окна, без заголовка окна и границ). Тут мы создали окно размером 800x600 пикселей.

Класс sf::VideoMode имеет интересные статические функции, с помощью которых можно получить разрешение рабочего стола или доступные видео режимы. Советуем посмотреть документацию по этому классу.

Второй аргумент — имя создаваемого окна.

Конструктор класса sf::Window может принять и третий аргумент: стиль, который позволяет вам выбрать, какие украшения и функции вы хотите использовать.

Вы можете использовать любую комбинацию следующих стилей:

sf::Style::None Никаких украшений (используется, например, для загрузочных экранов); этот стиль не может быть использован с другими
sf::Style::Titlebar У окна есть заголовок
sf::Style::Resize Можно изменить размер окна и появляется кнопка открытие на весь экран
sf::Style::Close У окна появляется кнопка закрытия
sf::Style::Fullscreen Окно открывается в полноэкранном режиме; этот стиль не может быть скомбинирован с другими и требует доступный видео режим
sf::Style::Default Стандартный стиль, который является сокращение Titlebar | Resize | Close

Также есть четвертый аргумент, определяющий специфичные опции OpenGL. Эта тема рассматривается более подробно в статье по OpenGL.

Если вы хотите создать окно после создания экземпляра sf::Window или создать окно заново, с другим видео режимом или названием, вы можете использовать функцию create . Она принимает те же аргументы, что и конструктор класса.

Оживление окна

Если вы попробуете выполнить код выше (удалив ". "), вы вряд ли что-то увидите. Во-первых, потому что программа завершается немедленно. Во-вторых, потому что программа не обрабатывает события; так что, даже если вы добавили этот код в бесконечный цикл, вы увидите мертвое окно, которое не может быть перемещено или закрыто.

Давайте добавим немного кода, что бы сделать эту программу более интересной:


Код выше открывает окно и уничтожает его, когда пользователь закрывает его. Давайте посмотрим более детально, как он работает:

Во-первых, мы добавили цикл, который гарантирует, что приложение будет обновляться/дополняться до закрытия окна. Большинство (если не все) SFML программы будут иметь схожую конструкцию; иногда этот цикл называется main loop или game loop.

Затем, первое, что мы хотим сделать внутри нашего цикла — проверить наличие необработанных событий. Обратите внимание, что мы используем цикл while так, чтобы обработать все ожидающие обработки события. Функция pollEvent возвращает true , если есть события, ожидающие обработки, или false , если их нет.

Люди часто забывают о цикле обработки событий, потому что им не нужно обрабатывать события (вместо этого они используют ввод с клавиатуры). Без цикла обработки событий, окно перестанет отвечать на запросы. Важно помнить, что цикл обработки событий имеет две роли: в дополнение к обработке пользовательских событий, это еще и обработка внутренних событий окна, которые могут быть вызваны перемещением или изменением размера окна.

После того, как окно закрылось, основной цикл завершается и программа завершает свое выполнение.

В этот момент, вы, наверное, заметили, что мы не говорили о рисовании чего-то в окне. Как указывалось во введении, это не задача модуля sfml-window . Рисование объектов (спрайтов, текста или фигур) будет обсуждаться в статьях по sfml-graphics .

Чтобы что-то рисовать, вы также можете использовать OpenGL напрямую и игнорировать модуль sfml-graphics . sf::Window создает OpenGL контекст и готова к принятию вызовов к OpenGL. Вы можете более подробно ознакомиться с данной темой в статье по использованию OpenGL.

Не ожидайте увидеть что-то интересное в новом окне: мы можете увидеть какой-нибудь цвет (черный или белый), или содержимое прошлого приложения, использовавшего OpenGL, или… что-то еще.

Играемся с окном

Конечно, SFML позволяет вам играться с вашими окнами. Основные операции с окнами, например изменение размера, положения, названия или иконки поддерживаются, но, в отличие от специальных библиотек GUI (Qt, wxWidgets), SFML не предоставляет расширенный функционал. Окна SFML предназначены только для обеспечения среды для OpenGL или SFML.


Вы можете обратиться к документации по API для получения полного списка функций sf::Window.

В случае, если вам действительно нужны расширенный функционал для вашего окна, вы можете создать одно окно с помощью другой библиотекой и внедрить его в SFML. Чтобы это сделать, вы можете использовать другой конструктор или создать функцию, которая передает sf::Window дескриптор существующего окна. В этом случае, SFML будет создавать контекст рисования внутри переданного окна и отлавливать все события без вмешательства в родительский менеджер окна.


Если вам нужна дополнительная, очень специфичная функция, вы можете сделать иначе: создать окно SFML, получить его дескриптор и сделать то, чего не позволяет SFML.


Интеграция SFML с другими библиотеками требует работы и не будет описана здесь, но вы можете обратиться к другим статьям, примерам или постам на форумах.

Контроль кадровой частоты

Иногда, когда приложение работает быстро, вы можете заметить визуальные артефакты. Причина в том, что частота обновления вашего приложения не синхронизирована с кадровой разверткой вашего монитора, и, как результат, нижняя часть предыдущего кадра смешивается с верхом следующего.

Решением этой проблемы является активизация вертикальной синхронизации. Синхронизация производится автоматически видеокартой и может быть просто включена или выключена с помощью функции setVerticalSyncEnabled :


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

Иногда вызов setVerticalSyncEnabled не дает никакого эффекта: скорее всего, потому что вертикальная синхронизация выключена в настройках драйвера вашей видеокарты. Вы должны включить опцию «controlled by application» в настройках видеодрайвера.

Вы можете захотеть, чтобы ваше приложение работало на заданной кадровой частоте, вместо частоты обновления монитора. Это может быть достигнуто с помощью вызова setFramerateLimit :


В отличие от setVerticalSyncEnabled , эта функция реализована SFML и использует комбинация sf::Clock и sf::sleep . Важно отметить, что эта функция не является надежной на 100%, особенно для высокой кадровой частоты: возможности sf::sleep зависят от ОС и оборудования; минимальное время приостановки составляет 10-15 миллисекунд. Не полагайтесь на эту функцию, если вы создаете приложение, сильно зависящее от времени.

Никогда не используйте setVerticalSyncEnabled и setFramerateLimit вместе. Это может вызвать плохие последствия.

Вещи, которые нужно знать об окнах

Ниже приведен список того, что вы можете и чего не можете делать с окнами SFML.

Вы можете создавать множество окон

SFML позволяет создавать множество окон, а так же обрабатывать их события и управлять ими в главном потоке или в множестве потоков (но… смотрите ниже). В этом случае, не забудьте создать цикл обработки событий для каждого из них.

Пока что, множество мониторов не поддерживается

SFML неявным образом управляет несколькими мониторами. По этой причине, вы не можете выбрать, на каком мониторе появится окно, и вы не можете создать более одного полноэкранного окна. Это должно быть исправлено в будущих версиях.

События окна должны быть обработаны в потоке окна

Это является серьезным сдерживающим фактором для большинства операционных систем: цикл обработки событий (точнее, функция pollEvent или waitEvent ) должен вызываться в том же потоке, в котором было создано окно. Это означает, что если вы хотите создать выделенный поток для обработки событий, вы должны убедиться, что окно создается в том же потоке. Если вы действительно хотите разделить задачи между потоками, удобнее обрабатывать события в главном потоке, и производить операции с окнами (например, отрисовку графики) в отдельном потоке. Эта конфигурация также будет совместима с других ограничений, описанными ниже.

На Mac OS X обслуживание окон и обработка событий должны производиться в главном потоке

Ага, это правда. Mac OS X не позволит вам создать окно или обработать события в потоке, отличном от главного.

На Windows окно, размером больше рабочего стола, не обрабатывается корректно

По какой-то причине, Windows не позволяет созвать окна, размером больше, чем рабочий стол. Это затрагивает окна, созданные с помощью VideoMode::getDesktopMode() : если вы будете использовать оформление окон (границы и заголовок), вы получите окно, которое будет немного больше, чем рабочий стол.

Читайте также: