|
29.12.2010, 02:39
|
#1
|
AnyKey`щик
Регистрация: 18.10.2009
Сообщений: 6
Написано 0 полезных сообщений (для 0 пользователей)
|
Загрузочный экран
Всем привет.
Собственно, хочу сделать загрузочный экран. А то пока куча изображений вместе с музыкой загрузятся - 5-6 секунд чёрного монитора. Некрасиво.
Все ресурсы загружаю перед главным циклом через функции, которые разнесены по разным bmx-файлам. При таком раскладе, ясен пень, сделать загрузочный экран не представляется возможным. Тогда я подумал (видимо, плохо) и занёс функции загрузки в главный цикл, с дополнительной переменной, чтобы всё это дело загрузилось всего один раз, плюс вывел текст, мол, загружаемся. Так же имеется переменная текущего "экрана" (ну, там, -1 = загрузка, 0 = меню, 1 = опции, и т. д.), по которой всё и проверяется. Собственно, у меня такая мысль, что я что-то (если не всё) делаю не так:
Include "_loadimgs.bmx"
Include "_drawimgs.bmx"
Include "_loadmusic.bmx"
Global UserQuit = False
Global Screen = -1 ' Та самая переменная "экрана"
Global Loading = 0
Global LoadingTemp = 0
Graphics 1600, 900, 1
HideMouse()
SeedRnd( MilliSecs() )
SetBlend( ALPHABLEND )
Repeat
If Screen = -1 Then
DrawText( "Загружаем...", 15, 15 )
If ( Loading = 0 ) And ( LoadingTemp = 0 ) Then
LoadingTemp = 1
LoadAllImgs() 'по окончанию загрузки - LoadingTemp = 0 и Loading = 1
EndIf
If ( Loading = 1 ) And ( LoadingTemp = 0 ) Then
LoadingTemp = 1
LoadAllMsc() ' здесь после загрузки Loading = 0 и Screen = 0
EndIf
EndIf
If Screen = 0 Then
DrawAllImgs()
If GlobalMusicTemp = 0 Then
GlobalMusicTemp = 1
PlayMsc()
EndIf
EndIf
If KeyHit( key_escape ) Then UserQuit = True
Flip
Cls
Until ( AppTerminate() ) Or ( UserQuit = True )
Прошу помощи. В идеале хотелось бы сделать как во флеше - побайтово узнавать, сколько уже от всех ресурсов загрузилось и, собственно, выводить это на экран. Совсем чудесно будет, если тут кто-нибудь кодом с пояснениями поделится. Хотя сойдёт и что-нибудь попроще, совет, например. Мне хотя бы сам принцип узнать, как это вообще делается.
Заранее спасибо.
|
(Offline)
|
|
29.12.2010, 06:27
|
#2
|
Дэвелопер
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений (для 886 пользователей)
|
Ответ: Загрузочный экран
Варианты делания:
1. многопоточность (стоит ли оно того - хз)
2. ресурс-менеджер, или подобие его, в котором перед загрузкой определяются нужные для загрузки ресурсы. тут хоть не побайтово будет, но всё-таки единица загрузки будет поменьше (кроме музыки).
а для больших файлов как вариант - открывать поток, читать из него порциями по сколько-то килобайт, проматывая ползунок загрузки, а потом из полученных данных собирать объекты.
3. сделать циклическую анимацию загрузки и вызывать её перерисовку после каждого нового загруженного ресурса.
Ещё, в LoadAllImgs(), LoadAllMsc() - слово All настораживает. Грузить лучше по мере необходимости.
И ещё:
LoadAllImgs() 'по окончанию загрузки - LoadingTemp = 0 и Loading = 1
где-то внутри функции менять глобальные флаги загрузки, да ещё и два штуки, это видится (мне) не лучшим вариантом.
Я б сделал переменную, хранящую статус загрузки, и константы статусов по желанию:
Global loadingState%
const LOADING_NONE% = 0
const LOADING_IMAGES% = 1
const LOADING_SOUNDS% = 2
const LOADING_SOMETHING% = 3
и при загрузке пишешь
loadingState = LOADING_IMAGES
а в твоём коде загрузка идёт последовательно всего и сразу, поэтому даже статусы не нужны, пишешь перед главным циклом
LoadAllImgs()
LoadAllMsc()
да и всё.
Ещё на всякий случай: функции Flip() и Cls() и прочие можно использовать и вне главного цикла, главное чтобы после команды Graphics().
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
29.12.2010, 13:28
|
#3
|
Дэвелопер
Регистрация: 21.11.2009
Адрес: Афула
Сообщений: 1,700
Написано 658 полезных сообщений (для 1,963 пользователей)
|
Ответ: Загрузочный экран
Вообще эта тема поднимается чуть ли не каждый месяц
site:forum.boolean.name blitzmax загрузка
__________________
kali surgeon
|
(Offline)
|
|
29.12.2010, 16:36
|
#4
|
AnyKey`щик
Регистрация: 18.10.2009
Сообщений: 6
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Загрузочный экран
Сообщение от Жека
Ещё на всякий случай: функции Flip() и Cls() и прочие можно использовать и вне главного цикла, главное чтобы после команды Graphics().
|
Вот за это +1. Про Flip-то я совсем забыл. Вернул как было - все функции загрузки поставил перед главным циклом, а перед ними написал отрисовку текста и flip после него. Всё заработало. Спасибо.
Теперь другого рода проблема. Разрешение экрана. Во-первых, как его узнать при запуске приложения? Я тут глянул по форуму, на эту тему всё исключительно по Blitz3d. И библы, и примеры. Мож кто тыкнёт, куда надо или подскажет?
Ну и второе - как сделать, чтобы изображения растягивались при смене разрешения? У меня моник 1600х900 и сейчас, если поставить 800х600 фон, например, показывается частично. А мне надо, чтобы он скалировался под разрешение и при этом выглядел более-менее прилично.
|
(Offline)
|
|
29.12.2010, 16:50
|
#5
|
[object Object]
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,361
Написано 2,473 полезных сообщений (для 6,856 пользователей)
|
Ответ: Загрузочный экран
SetVirtualResolution?
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 4090 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
|
(Offline)
|
|
29.12.2010, 17:39
|
#6
|
AnyKey`щик
Регистрация: 18.10.2009
Сообщений: 6
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Загрузочный экран
Randomize
И? Блиц на эту функцию никак не отзывается.
Или я туплю?..
|
(Offline)
|
|
30.12.2010, 21:33
|
#7
|
Знающий
Регистрация: 22.12.2007
Сообщений: 223
Написано 22 полезных сообщений (для 51 пользователей)
|
Ответ: Загрузочный экран
В материалах блитцмакса есть описание этой функции, значит второе.
Цитирую:
"Функция позволяет вам устанавливать "виртуальное" разрешение, не зависящее от графического, которое также позволяет спроектировать приложение для работы в установленном (фиксированном) разрешении, скажем 640 на 480, а также запускать его при любом графическом разрешении."
|
(Offline)
|
|
31.12.2010, 19:02
|
#8
|
AnyKey`щик
Регистрация: 18.10.2009
Сообщений: 6
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Загрузочный экран
Ладно, с этим я тоже разобрался. Разрешение узнаю через перебор всех доступных графических режимов и беру последний, все изображения скалирую по формуле ширина_экрана/ширина_картинки. Но появилась ещё одна проблема.
Объявляю переменную типа float. В ней произвожу деление чисел 800 / 1600. Потом вывожу результат на экран. А он оказывается равен 0 (т. е. именно 0.000000). Причём если делить нацело, то всё прекрасно отображается (800 / 2 = 400.000000). Если делить с дробным остатком, то он обнуляется. Причём если просто присваивать переменной дробное число (к примеру, 0.5), она прекрасно его выводит.
Я даже отдельную прогу написал, состоящую ровно из двух строчек:
И всё равно 0.000000. Бред какой-то... Мне кто-нибудь скажет, что с делением-то происходит?
|
(Offline)
|
|
31.12.2010, 19:50
|
#9
|
Знающий
Регистрация: 22.12.2007
Сообщений: 223
Написано 22 полезных сообщений (для 51 пользователей)
|
Ответ: Загрузочный экран
i# = 800.0 / 1600.0
Print i
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
14.01.2011, 11:13
|
#10
|
|
Ответ: Загрузочный экран
самый простой способ - это расширить TStreamWrapper
|
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 02:59.
|