forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Blitz3D (http://forum.boolean.name/forumdisplay.php?f=45)
-   -   "FastImage"+"Alt+Tab"="MAV" (http://forum.boolean.name/showthread.php?t=5571)

HolyDel 14.01.2008 00:56

"FastImage"+"Alt+Tab"="MAV"
 
вступление:
1) надеюсь все знают эту полезнейшую либу.
2) надеюсь те, кто юзает, также знают что чем меньше StartDraw()/EndDraw() тем лучше. в идеале вообще достаточно двух, StartDraw() после рендера и EndDraw() перед отображением (flip)

собственно проблемка:
если приложение свернуть Alt+Tab, Аккорд, Win, или еще каким угодно способом (включая системные сообщения, типа пропало соединение с сетью, соединить снова?), то может случиться такая аказия, что свернуто будет именно внутри етих, хм, операторных скобок. При возвращении в игру вылезает его величество MAV, оно и понятно, теряется инфа из бэк/фронт буферов.
чо делать?

собственно с необходимостью свернуть приложение я могу разделаться просто - написать большими, красными буквами "Сворачивать игру только в паузе", а в паузе что нибудь придумаю.
но вот что делать с системными сообщениями, которые насильно сворачивают игру?

H@NON 14.01.2008 10:27

Ответ: "FastImage"+"Alt+Tab"="MAV"
 
перехватывать их:-D. Просто ловить нажатие клавиш, например если мы нажали alt+tab, то переключить игру в меню пауза, а там ты уж реши как нибудь :). Ты случайно не пользуешься версией fastimage_1_61a ?, вроде именно там вылетает МАВ, попробуй поставить 1.6 версию, там кажись норм.

Черный крыс 14.01.2008 14:55

Ответ: "FastImage"+"Alt+Tab"="MAV"
 
Перед началом цикла отрисовки (StartDraw()) ловить потерю девайса, после чего запретить отрисовку.

HolyDel 14.01.2008 15:23

Ответ: "FastImage"+"Alt+Tab"="MAV"
 
не поможет.
MAV происходет при отрисовке и потерянном девайсе. как вариант отлавливать потерю девайса перед каждой отрисовкой, но будут тормоза.

Черный крыс 14.01.2008 16:50

Ответ: "FastImage"+"Alt+Tab"="MAV"
 
Дык я о том же говорю...
Иначе никак.
Стабильность но тормоза или скорость но иногда с МАВ-ами...=(

jimon 14.01.2008 20:03

Ответ: "FastImage"+"Alt+Tab"="MAV"
 
а проверять имеет ли окно фокус ? ... хз если честно ...
в идеале надо перехватывать системные сообщения

avel 14.01.2008 20:40

Ответ: "FastImage"+"Alt+Tab"="MAV"
 
мда. это не есть хорошо... а что автор сего замечательного творения по этому поводу думает? кто-нить узнавал?

impersonalis 14.01.2008 20:54

Ответ: "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

HolyDel 14.01.2008 20:55

Ответ: "FastImage"+"Alt+Tab"="MAV"
 
jimon, да, лучше бы как нибудь заставить неотдавать окно фокус.
проблема с alt+tab не так критична, говорю же, напишу большими буквами - сворачивать окно только в паузе.
а вот системные сообщения - ето проблемка.

импер, ето я знаю, но ета фишка не поможет.

Platon 15.01.2008 13:16

Ответ: "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



Часовой пояс GMT +4, время: 00:22.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot