Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D

Ответ
 
Опции темы
Старый 14.01.2008, 00:56   #1
HolyDel
 
Регистрация: 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
H@NON
Дэвелопер
 
Регистрация: 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
Черный крыс
 
Сообщений: n/a
Ответ: "FastImage"+"Alt+Tab"="MAV"

Перед началом цикла отрисовки (StartDraw()) ловить потерю девайса, после чего запретить отрисовку.
 
Ответить с цитированием
Старый 14.01.2008, 15:23   #4
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: "FastImage"+"Alt+Tab"="MAV"

не поможет.
MAV происходет при отрисовке и потерянном девайсе. как вариант отлавливать потерю девайса перед каждой отрисовкой, но будут тормоза.
(Offline)
 
Ответить с цитированием
Старый 14.01.2008, 16:50   #5
Черный крыс
 
Сообщений: n/a
Ответ: "FastImage"+"Alt+Tab"="MAV"

Дык я о том же говорю...
Иначе никак.
Стабильность но тормоза или скорость но иногда с МАВ-ами...=(
 
Ответить с цитированием
Старый 14.01.2008, 20:03   #6
jimon
 
Сообщений: n/a
Ответ: "FastImage"+"Alt+Tab"="MAV"

а проверять имеет ли окно фокус ? ... хз если честно ...
в идеале надо перехватывать системные сообщения
 
Ответить с цитированием
Старый 14.01.2008, 20:40   #7
avel
Бывалый
 
Аватар для avel
 
Регистрация: 12.10.2006
Сообщений: 737
Написано 131 полезных сообщений
(для 452 пользователей)
Ответ: "FastImage"+"Alt+Tab"="MAV"

мда. это не есть хорошо... а что автор сего замечательного творения по этому поводу думает? кто-нить узнавал?
(Offline)
 
Ответить с цитированием
Старый 14.01.2008, 20:54   #8
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 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
HolyDel
 
Регистрация: 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
Platon
Знающий
 
Регистрация: 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 за это полезное сообщение:
avel (15.01.2008), HolyDel (15.01.2008), sSwSs (15.01.2008), tormoz (15.01.2008)
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Можно ли сделать так чтобы при нажатии "вверх" и "вниз" двигалась одна картинка, а при нажатии "вправо" и "влево" - другая Total_Nube_&_Lamo Основной форум 2 13.12.2009 22:00
"Кодирование/декодирование изображений", или "Давайте попробуем скрыть ресурсы мидлетов" Richik Библиотеки 17 03.06.2009 14:18
"DarkWing Duck" aka "Черный Плащ" Chrono Syndrome Болтовня 19 04.12.2007 16:05
Игра "Три слова". Рассказ "Время планет" Ilyich Юмор 77 02.04.2007 17:49
"мапэд", или оживление "превед" культуры jimon Юмор 0 06.11.2006 17:45


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com