![]() |
Модераторы: Rickert, Alexeis, BorisVorontsov |
![]() ![]() ![]() |
|
konekt |
|
|||
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 1.5.2008 Репутация: нет Всего: нет |
Изменяю цикл обработки сообщений следующим образом:
MSG mssg; PeekMessage(&messg,NULL,0,0,PM_NOREMOVE); while(mssg.message!=WM_QUIT){ if(PeekMessage(&mssg,NULL,0,0,PM_REMOVE)){ TranslateMessage(&mssg); DispatchMessage(&mssg); } else{ ///Нет сообщений для обработки - выполнить код игры Render(); } } Вроде бы цикл обработки сообщений должен постоянно вызывать Render() Но на самом деле такого у меня не происходит. Если кто знает причину то помогите разобраться. |
|||
|
||||
Mazzi |
|
|||
![]() Правильный ![]() ![]() Профиль Группа: Комодератор Сообщений: 825 Регистрация: 3.4.2003 Репутация: нет Всего: 21 |
поставь в обе ветви ( if и else) счётчики для подсчёта количества входов в каждую ветвь.
Увидишь куда чаще заходишь. -------------------- Мне нужны помощники. |
|||
|
||||
konekt |
|
|||
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 1.5.2008 Репутация: нет Всего: нет |
Счетчики ставил. Получается, что функция Render() никогда не вызывается, а должна , по идеи, вызываться все время
![]() Зато сообщение WM_PAINT вызывается постоянно. Логика вроде в этом коде есть и он ДОЛЖЕН вызывать функцию Render() но он НЕ ВЫЗЫВАЕТ. |
|||
|
||||
Mazzi |
|
|||
![]() Правильный ![]() ![]() Профиль Группа: Комодератор Сообщений: 825 Регистрация: 3.4.2003 Репутация: нет Всего: 21 |
Ветвь else не вызовется никогда, перенеси свой render в ветвь if и всё.
Добавлено через 2 минуты и 7 секунд А не вызовется, потому, что для этого нужно, чтобы не было сообщения для функции. А без сообщения не вызовется твоя функция обработки сообщений. Понял? -------------------- Мне нужны помощники. |
|||
|
||||
konekt |
|
|||
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 1.5.2008 Репутация: нет Всего: нет |
Вообще вставить функцию Render() в тело if веще хорошая, но этот код взят из книги по DirectX9 Алена Торна и по всем параметрам должен работать.
Если есть сообщений для обработки, то должна выполняться ветвь if, а если нет сообщений (тоесть я не посылаю окну ни-каких команд) должна выполняться ветвь else, которая минуте Translant Message и DispatchMassage. |
|||
|
||||
Supersedes |
|
|||
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 29.7.2008 Репутация: нет Всего: нет |
Все прекрасно работает. Ищи ошибку где-нить еще. Кстати у тебя я надеюсь "messg" и "mssg" -- это одно и то же!? |
|||
|
||||
konekt |
|
|||
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 1.5.2008 Репутация: нет Всего: нет |
Спасибо за цикл. Видно что он идентичен моему. Messg=mssg, просто я не могу копировать исходники т.к. интернет подключен к другому компьютеру.
Но к сожалению, этот цикл тоже не работает. Так как я пишу с помощью Visual Studio 2008 и свой проект создавал как не Win32 а как EmptyProgect. У меня все работает если функцию Render() запихать в if, но должен работать в теле else и код от Supersedes тому наглядный пример. |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: нет Всего: 250 |
и свой проект создавал как не Win32 а как EmptyProgect
a где расположен цикл обработки? |
|||
|
||||
Rickert |
|
|||
![]() Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: 2 Всего: 52 |
Перенеси функцию Render в обработку WM_PAINT - самый правильный вариант. ИМХО
-------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
Supersedes |
|
|||
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 29.7.2008 Репутация: нет Всего: нет |
Rickert, далеко не самый правильный вариант.
|
|||
|
||||
Rickert |
|
|||
![]() Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: 2 Всего: 52 |
Supersedes, утверждение без аргументов - сотресание воздуха.
-------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
Supersedes |
|
||||
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 29.7.2008 Репутация: нет Всего: нет |
Rickert
Абсолютно с тобой согласен!! Читай что сам пишешь! Это сообщение отредактировал(а) Supersedes - 18.8.2008, 08:16 |
||||
|
|||||
Rickert |
|
|||
![]() Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: 2 Всего: 52 |
А программисту разве нужно уже всё разжёвывать чтобы он понял, что отрисовка сцены OpenGL, после отрисовки самого окна - это логично
![]() -------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
Supersedes |
|
|||
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 29.7.2008 Репутация: нет Всего: нет |
Rickert, во-первых я не уверен что konekt на самом деле достаточно опытный программист.
Во-вторых, если бы ты сам был хорошим программистом, то ты наверняка бы понял что именно хочет автор статьи! То что функцию render() надо запихнуть в WM_PAINT это по-моему и так понятно.. Тем не менее я думаю что автор статьи хотел чтобы данная фунция выполнялась постоянно и, соответственно постоянно отрисовывалась сцена. В данном случае изречение:
неуместно ![]() |
|||
|
||||
Rickert |
|
|||
![]() Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: 2 Всего: 52 |
У человека есть проблема - я предложил решение. Все остальные наши разговоры неуместны в этой теме, предлогаю продолжить через ЛС.
-------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
konekt |
|
|||
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 1.5.2008 Репутация: нет Всего: нет |
Спасибо что пытаетесь помочь. Да программист я не опытный, но запихать в WM_PAINT это так мной было и сделано с самого начала ковыряния с этим кодом, так как по другому пока не работает кроме как установки функции в тело if что предложил мне Mazzi.
и я бы особо и не парился, но зная что WM_PAINT вызывается только когда нужно перерисовать окно когда оно например закрыто, а потом мы вытаскиваем его наружу, мне очень странно и пока не понятно почему оно вызывается постоянно. Наблюдая за другими окнами и смотря какие им посылаются сообщения я не вижу, чтобы им посылалось бесконечно WM_PAINT. Да и само то что взятый из Тутора по DirectX цикл обработки сообщений который мне предложил Supersedes идентичен моему - он тоже не работает. Так вот скажите - это что инициализация DirectDraw вызвала такой шквал сообшений WM_PAINT в мое окно. Тогда почему взятый из учебника цикл (который по логике должен работать - я ведь не сам его придумал) не работает. |
|||
|
||||
Supersedes |
|
||||
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 29.7.2008 Репутация: нет Всего: нет |
konekt, я был бы очень признателен если ты выволил весь код целиком. Думаю стало бы намного понятнее что к чему!
Заметь я не предлагал тебе свой код. Я просто сказал что у меня он прекрасно работает ![]() Rickert
Мне очень грустно об этом говорить, но решение ты не предложил... Если хочешь то можем поговорить об этом в аське. Мой UIN: 373706950 Знаешь что такое UIN !?)) Это сообщение отредактировал(а) Supersedes - 18.8.2008, 10:24 |
||||
|
|||||
konekt |
|
|||
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 1.5.2008 Репутация: нет Всего: нет |
Supersedes, вываливать то особо и нечего. Стандартное Windowoe приложение в котором происходит инициализация DirectDraw. Затем стандартный цикл обработки переделывается в тот что я привожу (он взят из книги).
Если я правильно понимаю работу стандартного цикла, то приложение ждет когда поступит сообщение, если оно поступает то начинается его обработка, если сообщений нет - программа бездействует. Так вот мой новый цикл должен заставлять программу не бездействовать в это время, а выполнять функцию Render() в которую может быть запихано все, что угодно. Но этого не происходит. Может быть я слишком тупой и мой вопрос уже всех достал. Но где в моих рассуждениях может быть ошибка. |
|||
|
||||
Rickert |
|
|||
![]() Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: 2 Всего: 52 |
konekt, текст функции WndProc в студию.
-------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
Supersedes |
|
|||
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 29.7.2008 Репутация: нет Всего: нет |
konekt, да, покажи нам WndProc.
|
|||
|
||||
Rpahut |
|
||||
![]() 0xdeadbeef ![]() Профиль Группа: Участник Сообщений: 243 Регистрация: 9.4.2006 Репутация: нет Всего: 7 |
Из хелпа по winapi(WM_PAINT):
так чо оно должно быть там постоянно, хотя чтобы сказать наверняка нужно глубоко копнуть в винапи. И мне класть на книги и туторы - моя голова мне подсказывает следующий код:
--------------------
C/C++ GameDevRSS Раздела программирования игрOpenGL - уроки от NeHeКак продать идею? |
||||
|
|||||
Supersedes |
|
||||
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 29.7.2008 Репутация: нет Всего: нет |
Rpahut,
в чем разница? |
||||
|
|||||
VK_Techno |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 29.9.2007 Репутация: нет Всего: нет |
Как вариант:
при обработке WM_CREATE (или где-нибудь рядом) запустить таймер с помощью SetTimer() на, скажем, 30 мс. В обработчике WM_TIMER (или функции таймера, указатель на которую передали SetTimer()) вызвать Render(). |
|||
|
||||
![]() ![]() ![]() |
Вы можете найти полезным что... | |
|
|
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |