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

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

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

Ответ
 
Опции темы
Старый 29.12.2010, 02:39   #1
Greenstyler
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)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Greenstyler (29.12.2010)
Старый 29.12.2010, 13:28   #3
baton4ik
Дэвелопер
 
Аватар для baton4ik
 
Регистрация: 21.11.2009
Адрес: Киев
Сообщений: 1,699
Написано 657 полезных сообщений
(для 1,962 пользователей)
Ответ: Загрузочный экран

Вообще эта тема поднимается чуть ли не каждый месяц
site:forum.boolean.name blitzmax загрузка
(Offline)
 
Ответить с цитированием
Старый 29.12.2010, 16:36   #4
Greenstyler
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
Randomize
[object Object]
 
Аватар для Randomize
 
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,354
Написано 2,470 полезных сообщений
(для 6,850 пользователей)
Ответ: Загрузочный экран

SetVirtualResolution?
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 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
Greenstyler
AnyKey`щик
 
Регистрация: 18.10.2009
Сообщений: 6
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Загрузочный экран

Randomize
И? Блиц на эту функцию никак не отзывается.
Или я туплю?..
(Offline)
 
Ответить с цитированием
Старый 30.12.2010, 21:33   #7
JeanWinters
Знающий
 
Регистрация: 22.12.2007
Сообщений: 223
Написано 22 полезных сообщений
(для 51 пользователей)
Ответ: Загрузочный экран

В материалах блитцмакса есть описание этой функции, значит второе.
Цитирую:
"Функция позволяет вам устанавливать "виртуальное" разрешение, не зависящее от графического, которое также позволяет спроектировать приложение для работы в установленном (фиксированном) разрешении, скажем 640 на 480, а также запускать его при любом графическом разрешении."
(Offline)
 
Ответить с цитированием
Старый 31.12.2010, 19:02   #8
Greenstyler
AnyKey`щик
 
Регистрация: 18.10.2009
Сообщений: 6
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Загрузочный экран

Ладно, с этим я тоже разобрался. Разрешение узнаю через перебор всех доступных графических режимов и беру последний, все изображения скалирую по формуле ширина_экрана/ширина_картинки. Но появилась ещё одна проблема.
Объявляю переменную типа float. В ней произвожу деление чисел 800 / 1600. Потом вывожу результат на экран. А он оказывается равен 0 (т. е. именно 0.000000). Причём если делить нацело, то всё прекрасно отображается (800 / 2 = 400.000000). Если делить с дробным остатком, то он обнуляется. Причём если просто присваивать переменной дробное число (к примеру, 0.5), она прекрасно его выводит.
Я даже отдельную прогу написал, состоящую ровно из двух строчек:
i# = 800 / 1600
Print i
И всё равно 0.000000. Бред какой-то... Мне кто-нибудь скажет, что с делением-то происходит?
(Offline)
 
Ответить с цитированием
Старый 31.12.2010, 19:50   #9
JeanWinters
Знающий
 
Регистрация: 22.12.2007
Сообщений: 223
Написано 22 полезных сообщений
(для 51 пользователей)
Ответ: Загрузочный экран

i# = 800.0 / 1600.0
Print i
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Greenstyler (31.12.2010)
Старый 14.01.2011, 11:13   #10
Черный крыс
 
Сообщений: n/a
Ответ: Загрузочный экран

самый простой способ - это расширить TStreamWrapper
 
Ответить с цитированием
Ответ


Опции темы

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

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


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


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