forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   BlitzMax (http://forum.boolean.name/forumdisplay.php?f=104)
-   -   Загрузочный экран (http://forum.boolean.name/showthread.php?t=13958)

Greenstyler 29.12.2010 02:39

Загрузочный экран
 
Всем привет.

Собственно, хочу сделать загрузочный экран. А то пока куча изображений вместе с музыкой загрузятся - 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 )

Прошу помощи. В идеале хотелось бы сделать как во флеше - побайтово узнавать, сколько уже от всех ресурсов загрузилось и, собственно, выводить это на экран. Совсем чудесно будет, если тут кто-нибудь кодом с пояснениями поделится. Хотя сойдёт и что-нибудь попроще, совет, например. Мне хотя бы сам принцип узнать, как это вообще делается.
Заранее спасибо.

Жека 29.12.2010 06:27

Ответ: Загрузочный экран
 
Варианты делания:
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().

baton4ik 29.12.2010 13:28

Ответ: Загрузочный экран
 
Вообще эта тема поднимается чуть ли не каждый месяц
site:forum.boolean.name blitzmax загрузка

Greenstyler 29.12.2010 16:36

Ответ: Загрузочный экран
 
Цитата:

Сообщение от Жека (Сообщение 173568)
Ещё на всякий случай: функции Flip() и Cls() и прочие можно использовать и вне главного цикла, главное чтобы после команды Graphics().

Вот за это +1. Про Flip-то я совсем забыл. Вернул как было - все функции загрузки поставил перед главным циклом, а перед ними написал отрисовку текста и flip после него. Всё заработало. Спасибо.

Теперь другого рода проблема. Разрешение экрана. Во-первых, как его узнать при запуске приложения? Я тут глянул по форуму, на эту тему всё исключительно по Blitz3d. И библы, и примеры. Мож кто тыкнёт, куда надо или подскажет?
Ну и второе - как сделать, чтобы изображения растягивались при смене разрешения? У меня моник 1600х900 и сейчас, если поставить 800х600 фон, например, показывается частично. А мне надо, чтобы он скалировался под разрешение и при этом выглядел более-менее прилично.

Randomize 29.12.2010 16:50

Ответ: Загрузочный экран
 
SetVirtualResolution?

Greenstyler 29.12.2010 17:39

Ответ: Загрузочный экран
 
Randomize
И? Блиц на эту функцию никак не отзывается.
Или я туплю?..

JeanWinters 30.12.2010 21:33

Ответ: Загрузочный экран
 
В материалах блитцмакса есть описание этой функции, значит второе.
Цитирую:
"Функция позволяет вам устанавливать "виртуальное" разрешение, не зависящее от графического, которое также позволяет спроектировать приложение для работы в установленном (фиксированном) разрешении, скажем 640 на 480, а также запускать его при любом графическом разрешении."

Greenstyler 31.12.2010 19:02

Ответ: Загрузочный экран
 
Ладно, с этим я тоже разобрался. Разрешение узнаю через перебор всех доступных графических режимов и беру последний, все изображения скалирую по формуле ширина_экрана/ширина_картинки. Но появилась ещё одна проблема.
Объявляю переменную типа float. В ней произвожу деление чисел 800 / 1600. Потом вывожу результат на экран. А он оказывается равен 0 (т. е. именно 0.000000). Причём если делить нацело, то всё прекрасно отображается (800 / 2 = 400.000000). Если делить с дробным остатком, то он обнуляется. Причём если просто присваивать переменной дробное число (к примеру, 0.5), она прекрасно его выводит.
Я даже отдельную прогу написал, состоящую ровно из двух строчек:
Код:

i# = 800 / 1600
Print i

И всё равно 0.000000. Бред какой-то... Мне кто-нибудь скажет, что с делением-то происходит?

JeanWinters 31.12.2010 19:50

Ответ: Загрузочный экран
 
i# = 800.0 / 1600.0
Print i

Черный крыс 14.01.2011 11:13

Ответ: Загрузочный экран
 
самый простой способ - это расширить TStreamWrapper


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

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