могу решить. Есть события изменения размера окна: SDL_WINDOWEVENT_RESIZED и SDL_WINDOWEVENT_SIZE_CHANGED. То есть сначала пользователь нажимает на рамку окна, растягивает окно, затем отпускает мышку и происходит событие. А мне нужно событие что пользователь нажал мышкой на границу окна и начал растягивать окно но еще не отпустил мышку. Другими словами событие на то что окно в процессе изменения размера. Не знаете куда нужно посмотреть чтобы это сделать?
событие нажатия на мышь + ты знаешь где находится окно, складываешь 2 эти знания и тадааам
https://stackoverflow.com/questions/32294913/getting-contiunous-window-resize-event-in-sdl-2 это?
тут еще прикол в том, что при изменении размера окна но до того как окно мышь отпущена программа как бы замирает, например в консоль перестает идти вывод информации. Мне это вообще нужно для того чтобы закрашивать окно не после того как оно изменено а сразу в процессе изменения его размера (т.е до отпускания мыши)
это происходит не просто так. У тебя же винда?
потому что тебе нужен отдельный поток где эта сраная функция обработки сообщений
короче говоря мне нужно чтобы содержимое окна реагировало на изменение размера окна до того как я отпущу мышь
начинаю вникать
похоже этот топик тебе поможет https://www.gamedev.net/forums/topic/428022-sdl-window-resize-glitch/
спасибо, буду смотреть
@TonyWerner, @Kelbon, @SlavikMIPT при нажатии левой кнопкой на рамку окна, основной поток также останавливается. Я решил проблему растягивания и изменения размера окна с помощью SDL_AddEventWatch и ловли событий функцией SDL_GetWindowFromID. но я не нашел событие нажатия на рамку окна, и поэтому не могу поймать это событие. не знаешь как можно исправить?
Конечно он останавливается. Ты должен рендерить в одном потоке, а события обрабатывать в другом. Клик по рамке ищи как просто клик с координатами соответствующими координатам краев окна. Специального эвента для этого нет
если я буду делать через потоки <thread> то я смогу скомпилировать такое приложение на android?
привет, можешь помочь с тем, где именно мне нужно делать отдельный поток? я сделал вот так, но приложение виснет: SDL_Window *window = NULL; SDL_Surface *surface = NULL; int filling_window(){ surface = SDL_GetWindowSurface(window); SDL_FillRect(surface, NULL, SDL_MapRGB( surface->format, 0, 255, 0)); SDL_UpdateWindowSurface(window); return 0; } int init(){ ... } int events(bool *running){ SDL_Event event; while(SDL_PollEvent(&event)){ switch(event.window.event){ case SDL_WINDOWEVENT_RESIZED: cout << "SDL_WINDOWEVENT_RESIZED" << endl; filling_window(); break; break; } } } int run(){ bool running = true; while(running == true){ thread th1(filling_window); events(&running); th1.join(); } } void quit() { ... } int SDL_main(int argc, char *argv[]){ if(init() == 1){ return 1; } run(); quit(); return 0; }
Обычно нельзя юзать гуй (обращаться к гуёвому апи и т.д.) из разных потоков. А ты это и делаешь
Я сделал вот так, но у меня зависает приложение, не знаешь как можно исправить? #include <SDL2\SDL.h> #include <GL/gl.h> #include <GL/glu.h> #include <iostream> #include "thread\mingw.thread.h" #include <windows.h> using namespace std; SDL_Window *window = NULL; SDL_Surface *surface = NULL; int filling_window(){ surface = SDL_GetWindowSurface(window); SDL_FillRect(surface, NULL, SDL_MapRGB( surface->format, 0, 255, 0)); SDL_UpdateWindowSurface(window); return 0; } int init(){ ... } int events(bool *running){ SDL_Event event; while(SDL_PollEvent(&event)){ switch(event.window.event){ case SDL_WINDOWEVENT_RESIZED: cout << "SDL_WINDOWEVENT_RESIZED" << endl; filling_window(); break; break; } } } int run(){ bool running = true; while(running == true){ thread th1(filling_window); events(&running); th1.join(); } } void quit() { ... } int SDL_main(int argc, char *argv[]){ if(init() == 1){ return 1; } run(); quit(); return 0; }
Тебе не нужна многопоточность вообще.
а что нужно, чтобы решить эту задачу?
Научиться работать с этой твоей библиотекой GUI
Спасибо, но этот чат навряд ли создан чтобы на вопросы отвечать так как ты отвечаешь
Тебе наверное в другом чате нужно отвечать, а в этом чате как я понимаю люди помогают друг другу и делятся опытом
Я думал админ чата знает зачем нужен чат
Ты по существу моего вопроса можешь помочь? У меня появилась задача по SDL, не могу решить. Есть события изменения размера окна: SDL_WINDOWEVENT_RESIZED и SDL_WINDOWEVENT_SIZE_CHANGED. То есть сначала пользователь нажимает на рамку окна, растягивает окно, затем отпускает мышку и происходит событие. А мне нужно событие что пользователь нажал мышкой на границу окна и начал растягивать окно но еще не отпустил мышку. Другими словами событие на то что окно в процессе изменения размера. Не знаете куда нужно посмотреть чтобы это сделать?
что происходит с программой? Она возвращает 0? Она зависает? Она вообще не работает? Сейчас в коде где ты создал 2 потока
Возможно нужно отлавливать событие нажатие мыши с координатами рамки
Sfml тут знают пару человек, жди...
я пытаюсь разобраться с sdl a не sfml
Тогда ещё меньше человек)
Я плотно не работал, насчёт потоков в sdl он обычно один тк так работают системы под ним WinMain. И если вы хотите реализовать рендеринг из другого потока то нужно делать make current для opengl. Я бы попытался сделать то что вы хотите на микропримере с win32 досконально разобравшись какие там события прилетают если у вас Windows и потом попытался переложить это в sdl. Тк это просто обёртка. Так же там есть две версии библиотеки. Убедитесь что у вас вторая. Я работал с апи для окна клавиатурой и джойстиком. Всегда селектил события в одном потоке через switch по типу ивента. Можно ещё к автору на email постучать
Да все равно...
Кстати, очень хорошо бы создавать отдельный чат по этой штуке
Мне кажется, это в pro gamedev ближе
Я хочу попробовать создать событие нажатие на рамку окна, но пока не очень понимаю как создавать свои события, так как примеров в гугле маловато, или я не так ищу. Если я создам событие нажатия на рамку окна то смогу это событие отловить в функции SDL_AddEventWatch и получить его идентификатор через функцию SDL_GetWindowFromID и параллельно обработать. Ты можешь помочь понять как создать такое событие нажатие на рамку окна?
Изначально задача была в том, чтобы при изменении размеров окна, приложение не останавливалось а продолжало работать, я это сделал через захват события SDL_WINDOWEVENT_RESIZED с помощью функции SDL_AddEventWatch и получения идентификатора события. Но события нажатие на рамку окна не существует, поэтому я хочу создать такое событие самостоятельно. Ты сможешь в этом помочь?
Если сможешь помочь, то напиши пожалуйста мне в личные сообщения, чтобы было удобнее, заранее большое спасибо и спасибо за ответ
Подробнее не смогу помочь тк не такой большой эксперт этой либы. Пробовал в её исходники пойти? Они не очень большие были насколько помню. Может там станет понятнее
а изменение внешнего вида рамки окна, не знаешь куда копать?
Если это Windows то прям так и нужно гуглить: win32 api UI style. Может в чате по win api подскажут. Я работал с Linux и FullScreen UI на ios Android. Поэтому точнее не скажу.
Обсуждают сегодня