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

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

Вернуться   forum.boolean.name > Программирование в широком смысле слова > Алгоритмика

Алгоритмика Об алгоритмах вообще; методы, обсуждения способов решения

Ответ
 
Опции темы
Старый 15.08.2006, 21:13   #1
Valet
Знающий
 
Регистрация: 16.07.2006
Сообщений: 304
Написано 3 полезных сообщений
(для 0 пользователей)
Смущение Индикатор загрузки

Господа, не будет ли здесь кого-нибудь, кто разъяснит мне принцип работы loading_bara и метод его создания в Blitz3D? Заранее благодарю
(Offline)
 
Ответить с цитированием
Старый 16.08.2006, 00:33   #2
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Re: Индикатор загрузки

При создании программ вы рано или поздно сталкиваетесь с проблемой: программа выполняет какую-то неинтерактивную процедуру слишком долго. Причём в ходе написания она не раз зависала на этой процедуре, а вы тупо сидели минут пятнадцать в ожидании успешной загрузки; в более поздних стадиях, вы думали – «ну ещё секунд 20, и готово!» - на деле: вы сидели и ждали, вместо того, чтобы пройтись по комнате (в особо тяжких случаях – перекусить); и, наконец, когда игра была роздана друзьям-тестерам вы не раз наблюдали, как «тестер», посмотрев несколько секунд ваш чёрный экран (или, что того ещё хуже – застывший с выбранной кнопкой «START» GUI), кричал – «О, Боже! Всё повисло!»- и, в мгновение ока, дважды клацал по ctrl-alt-del.
Всё это из-за отсутствия визуализации процесса.
А ведь всего этого бы не произошло, если бы вы заметили, что кол-во процентов выполненной части процедуры подозрительно долго не меняется, или индикатор загрузки, ещё не скоро дойдёт до конца, или перед тестером висела надпись «LOAD…» и крутились красивые шестеренки.
Самый простой и привычный способ визуализации – прогресс бар (progress bar).

Давайте посмотрим на наш гипотетический код:
[highlight=blitzbasic]
For i=1 To 100
m(i)=LoadAnimMesh(MODEL_FOLDER$+"car"+i+".x")
Next
[/highlight]
Очевидно, что время уходит в нём на загрузку моделей (car1.x,car2.x и т.д.).
Допустим, одна модель грузиться 10 мсек., т.е. наш цикл эквивалентен:
[highlight=blitzbasic]
For i=1 To 100
Delay 10
Next
[/highlight]
Премудростей здесь искать не надо – я просто избавил код от конкретики, чтобы упростить объяснение.
Теперь нам надо чтобы определённая область закрашивалась соразмерно ходу выполнения цикла. Допустим область – это прямоугольник со сторонами 10 на 202 пикселей:
[highlight=blitzbasic]

Graphics 800,600
size_y%=10
size_x%=202
Color 255,0,0
For i=1 To 100
Rect 20,20,size_x,size_y,0
Flip
Delay 10
Next

[/highlight]
Степень проникновения в процесс загрузки у нас вообще никакая: мы модем только что-то сделать ДО и ПОСЛЕ. Следственно – обновить прогресс бар (сообщить о ходе загрузки) мы сможем только 100 раз. Значит, за один раз мы будем закрашивать 100-ую часть области.
Размеры этой части соответственно:
[highlight=blitzbasic]
ind_size_x%=(202-2)/100
ind_size_y%=10-2
[/highlight]
А вот так мы будем рисовать индикатор:
[highlight=blitzbasic]
Graphics 800,600
SetBuffer BackBuffer()
size_y%=10
size_x%=202
ind_size_x%=(202-2)/100
ind_size_y%=10-2
For i=1 To 100
Color 255,0,0
Rect 20,20,size_x,size_y,0
Color 120,120,120
Rect 20+1+ind_size_x*(i-1),20+1,ind_size_x,ind_size_y
Flip
Delay 10
Next

[/highlight]

Собственно – индикатор можно закрашивать и по-другому. Например, не 10 раз по одной 10ой со смещением, а 1/10 – затем, поверх неё, 2/10 и так далее. Или вывести в область картинку и поверх неё нарисовать чёрный прямоугольник, который будет всё время уменьшаться, однако на чёрном фоне окна, это создаст эффект появления картинки.
Можно использовать различные абстрактные формы и траектории движений – всё зависит от конкретики игры и вашей фантазии.
Единственное – не надо увлекаться: Время расчёта и вывода индикатора должно быть намного меньше времени выполнения одной итерации цикла. Если это никак не получается – обновляйте индикатор не каждый проход, а раз в N проходов. Или, возможно, вы выбрали неудачный масштаб? Например, при большом кол-ве вложенных циклов – обновлять прогресс бар в самом вложенном, почти всегда нерационально.
Если у вас несколько громоздких операций (к примеру – 2 цикла), рассчитайте коэффициенты для закраски соответствующим образом.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Strelok3848 (06.01.2008)
Старый 16.08.2006, 00:40   #3
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Re: Индикатор загрузки

Прогресс бар обычно является объектом GUI и для него предусмотрены уже готовые функции. Вот, например, как это может выглядеть на С++ с использованием MFC:
Мы создаём (в коде или редакторе) на форме объект – прогресс-бар, затем получаем на него указатель:
[highlight=cpp]
CProgressCtrl *PROG1=(CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);
[/highlight]
Устанавливаем диапазон принимаемых значений:
[highlight=cpp]
PROG1->SetRange(0,COUNT);
[/highlight]
Устанавливаем величину шага:
[highlight=cpp]
PROG1->SetStep(1);
[/highlight]
Ставим сам индикатор на 0
[highlight=cpp]
PROG1->SetPos(0);
[/highlight]
И каждую итерацию делаем один шаг индикатора:
[highlight=cpp]
PROG1->StepIt();
[/highlight]
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Старый 17.08.2006, 13:31   #4
Maxus
ПроЭктировщик
 
Регистрация: 17.02.2006
Сообщений: 144
Написано 13 полезных сообщений
(для 36 пользователей)
Re: Индикатор загрузки

[highlight=blitzbasic]
Graphics3D800,600,32,2
size_y# = 10
size_x# = 202
min# = 1
max# = 100
For i# = min To max
Color 255,0,0
Rect 20, 20, size_x, size_y, 0
Rect 22, 22, (i/max)*size_x-4, size_y-4, 1
Delay 30
Flip
Next[/highlight]
А вот модифицированный вариант.
Намного эффективнее.
(Offline)
 
Ответить с цитированием
Старый 17.08.2006, 14:35   #5
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Re: Индикатор загрузки

И вот так ещё:
[highlight=blitzbasic]
Graphics3D 800,600,32,2
size_y# = 10
size_x# = 202
min# = 1
max# = 100
Color 255,0,0
Rect 20, 20, size_x, size_y, 0
For i# = min To max
Rect 22, 22, (i/max)*size_x-4, size_y-4, 1
Delay 30
Flip
Next
[/highlight]
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Старый 17.08.2006, 18:33   #6
Maxus
ПроЭктировщик
 
Регистрация: 17.02.2006
Сообщений: 144
Написано 13 полезных сообщений
(для 36 пользователей)
Re: Индикатор загрузки

Сообщение от impersonalis
И вот так ещё:
[highlight=blitzbasic]
Graphics3D 800,600,32,2
size_y# = 10
size_x# = 202
min# = 1
max# = 100
Color 255,0,0
Rect 20, 20, size_x, size_y, 0
For i# = min To max
Rect 22, 22, (i/max)*size_x-4, size_y-4, 1
Delay 30
Flip
Next
[/highlight]
В твоем варианте невозможно будет преобразовать в функцию.
Да и прогрессбар по идее должен весь перерисовываться, а не по отдельности.
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Организация загрузки ресурсов? snikers BlitzMax 8 29.10.2008 11:05
полоса загрузки temned Основной форум 7 02.10.2008 06:05
Ключ загрузки bb ABTOMAT FAQ 2 01.10.2008 23:44
Имитация загрузки Strelok3848 3D-программирование 9 15.01.2008 21:12
ICQ индикатор. moka Наш форум 6 06.12.2006 16:41


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


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