|
14.01.2008, 00:56
|
#1
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
"FastImage"+"Alt+Tab"="MAV"
вступление:
1) надеюсь все знают эту полезнейшую либу.
2) надеюсь те, кто юзает, также знают что чем меньше StartDraw()/EndDraw() тем лучше. в идеале вообще достаточно двух, StartDraw() после рендера и EndDraw() перед отображением (flip)
собственно проблемка:
если приложение свернуть Alt+Tab, Аккорд, Win, или еще каким угодно способом (включая системные сообщения, типа пропало соединение с сетью, соединить снова?), то может случиться такая аказия, что свернуто будет именно внутри етих, хм, операторных скобок. При возвращении в игру вылезает его величество MAV, оно и понятно, теряется инфа из бэк/фронт буферов.
чо делать?
собственно с необходимостью свернуть приложение я могу разделаться просто - написать большими, красными буквами "Сворачивать игру только в паузе", а в паузе что нибудь придумаю.
но вот что делать с системными сообщениями, которые насильно сворачивают игру?
|
(Offline)
|
|
14.01.2008, 10:27
|
#2
|
Дэвелопер
Регистрация: 17.01.2007
Сообщений: 1,552
Написано 351 полезных сообщений (для 774 пользователей)
|
Ответ: "FastImage"+"Alt+Tab"="MAV"
перехватывать их . Просто ловить нажатие клавиш, например если мы нажали alt+tab, то переключить игру в меню пауза, а там ты уж реши как нибудь . Ты случайно не пользуешься версией fastimage_1_61a ?, вроде именно там вылетает МАВ, попробуй поставить 1.6 версию, там кажись норм.
|
(Offline)
|
|
14.01.2008, 14:55
|
#3
|
|
Ответ: "FastImage"+"Alt+Tab"="MAV"
Перед началом цикла отрисовки (StartDraw()) ловить потерю девайса, после чего запретить отрисовку.
|
|
|
14.01.2008, 15:23
|
#4
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: "FastImage"+"Alt+Tab"="MAV"
не поможет.
MAV происходет при отрисовке и потерянном девайсе. как вариант отлавливать потерю девайса перед каждой отрисовкой, но будут тормоза.
|
(Offline)
|
|
14.01.2008, 16:50
|
#5
|
|
Ответ: "FastImage"+"Alt+Tab"="MAV"
Дык я о том же говорю...
Иначе никак.
Стабильность но тормоза или скорость но иногда с МАВ-ами...=(
|
|
|
14.01.2008, 20:03
|
#6
|
|
Ответ: "FastImage"+"Alt+Tab"="MAV"
а проверять имеет ли окно фокус ? ... хз если честно ...
в идеале надо перехватывать системные сообщения
|
|
|
14.01.2008, 20:40
|
#7
|
Бывалый
Регистрация: 12.10.2006
Сообщений: 737
Написано 131 полезных сообщений (для 452 пользователей)
|
Ответ: "FastImage"+"Alt+Tab"="MAV"
мда. это не есть хорошо... а что автор сего замечательного творения по этому поводу думает? кто-нить узнавал?
|
(Offline)
|
|
14.01.2008, 20:54
|
#8
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: "FastImage"+"Alt+Tab"="MAV"
* Blitz3D still can't survive desktop rez-mode change in windowed mode. However,
the new GraphicsLost() command can be used to detect this. The only thing you'll be
able to do after GraphicsLost() returns True is EndGraphics() (and then perhaps reload everything
back in if you can be arsed). Or, as I'd be inclined to do, just exit, eg:
...
If GraphicsLost() RuntimeError "Please restart Defender"
RenderWorld
...
Also added 2 new windowed graphics modes: 6 and 7. These are similar to modes 2 and 3, but will
auto-suspend the application when it loses activation. These new modes are highly recommended!
|
http://blitzbasic.com/Community/posts.php?topic=71312
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
14.01.2008, 20:55
|
#9
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: "FastImage"+"Alt+Tab"="MAV"
jimon, да, лучше бы как нибудь заставить неотдавать окно фокус.
проблема с alt+tab не так критична, говорю же, напишу большими буквами - сворачивать окно только в паузе.
а вот системные сообщения - ето проблемка.
импер, ето я знаю, но ета фишка не поможет.
Последний раз редактировалось HolyDel, 14.01.2008 в 21:06.
|
(Offline)
|
|
15.01.2008, 13:16
|
#10
|
Знающий
Регистрация: 04.08.2006
Адрес: Россия
Сообщений: 297
Написано 39 полезных сообщений (для 70 пользователей)
|
Ответ: "FastImage"+"Alt+Tab"="MAV"
Ну установи тогда на окно блица коллбэк и делай его поверх всех (HWND_TOPMOST) с помощью WINAPI - SetWindowPos. Заодно можешь отправлять приложение поспать когда оно теряет фокус.
Исходник на PureBasic:
Global BlitzWindow.l
Global BlitzCallback.l
Global BlitzActived.b
Procedure WindowCallback(Window, Message, WParam, LParam)
Select Message
Case #WM_KILLFOCUS
BlitzActived = 0
SetWindowPos_(Window, #HWND_TOPMOST, 0, 0, 0, 0, #SWP_NOMOVE|#SWP_NOSIZE)
Case #WM_SETFOCUS
BlitzActived = 1
Case #WM_ACTIVATE
BlitzActived = WParam & 1
EndSelect
ProcedureReturn CallWindowProc_(BlitzCallback, Window, Message, WParam, LParam)
EndProcedure
ProcedureDLL DetachProcess(Instance)
SetWindowLong_(BlitzWindow, #GWL_WNDPROC, BlitzCallback)
EndProcedure
ProcedureDLL SetCallback(Window)
BlitzWindow = Window
BlitzCallback = SetWindowLong_(Window, #GWL_WNDPROC, @WindowCallback())
SetWindowPos_(Window, #HWND_TOPMOST, 0, 0, 0, 0, #SWP_NOMOVE|#SWP_NOSIZE)
BlitzActived = 1
EndProcedure
ProcedureDLL IsActived()
ProcedureReturn BlitzActived
EndProcedure
Юзать на блице так
Graphics3D(800, 600, 32, 2)
SetBuffer(BackBuffer())
SetCallback(SystemProperty("AppHWND"))
Camera = CreateCamera()
Repeat
If IsActived()
RenderWorld()
Flip()
Else
Delay(20)
EndIf
Until KeyDown(1)
End
|
(Offline)
|
|
Эти 4 пользователя(ей) сказали Спасибо Platon за это полезное сообщение:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 04:08.
|