Форум: "Начинающим";
Текущий архив: 2008.12.14;
Скачать: [xml.tar.bz2];
ВнизПомогите с алгоритмом Найти похожие ветки
← →
barbaroska (2008-11-06 18:00) [0]Имеется массив текста с временными метками, типа:
TmyText = record
myText: string;
time: DWord;
end;
myAr: array of TmyText;
в myText находятся слоги, первый символ "|" указывает на новую строку.
Необходимо составить алгоритм плавной прокрутки строк, с закраской слогов текущей строки. Что-то наподобии как в караоке.
Нюансы:
- в блоке вывода имеются объекты (колличество строк на экране)
- в данные блоки необходимо передавать битмапы с прорисованными строками
- можно управлять местоположением объектов путем указания их координат на экране
- передавать в последующем только новые строки и текущий битмап, где происходит закраска слогов текста по времени, а остальные объекты, если ещё видимы переданные в них строки - управлять местоположением.
Необходим сам алгоритм определения текущих строк, передачи полученных битмапов в блок вывода и управление там ими.
имеются данные Heigh блока вывода, TextHeigh - высота объекта, колличество строк на экране допустим 4
пол дня сижу втупую.
если есть мысли подскажите плиз..
← →
Jeer © (2008-11-06 18:12) [1]Так, может надо начать с "Hello World" ?
← →
barbaroska (2008-11-06 18:23) [2]Jeer ©, я про код молчу,
сам алгоритм никак в голове не строится.
читать книжки не поможет, если голова ещё не варит при большом алгоритме.
мало опыта видать в логике.
для учебного заведения пишу прогу по обучению английскому.
есть мп3 файл с текстовкой и сам текст, разбитый по времени.
нужно при воспроизведении мп3 показывать ещё текстовку, что бы было видно как оно пишется.
уже все готово, кроме подготовки и управление выводом.
сделал простенький вывод но он не красив. хочу добить этот вариант c плавной прокруткой
← →
Сергей М. © (2008-11-06 19:25) [3]И какова же максимально возможная и среднепрогнозируемая длина массива myAr ?
← →
barbaroska (2008-11-06 19:55) [4]Сергей М., на мой взгляд нет никакой разницы.
примерно около 30 строк. в строке в среднем по 22 символа, примерно 3 буквы на слог итого длина массива в районе 200
← →
Сергей М. © (2008-11-06 20:01) [5]А тишина (паузы в ходе диктовки) как тобой кодируется ?
← →
barbaroska (2008-11-06 20:38) [6]Нет.
например: |ти 500 ли 1000 ти 1500 ли 2000 |тра 2500 ...
тоесть данная строка закрашивается в диапазоне 500 - 2500 м.сек.
например, если время 1400 должно быть в строке закрашено только тили, тоесть время показывает когда закрашивается полностью слог.
имеется всегда текущее время.
я планирую делать закрашиваемой вторую сверху строку.
после того как закрасится, она станет на позицию первой и потом плавно исчезнет.
во время закраски второй строки все строки должны подниматься к верху, что бы когда пришло время третьей строчке она была бы на позиции второй строки.
голова вообще кипит.
думал будет просто, но пока никак.
в блоке вывода можно ввести до тысячи объектов.
каждый объект имеет свои координаты, прозрачность, указатель видимости.
в созданном объекте можно менять битмап.
по идее можно было бы каждый раз по таймеру уничтожать все объекты
и вычислив текущие строки заново создавать с первого..
но грузить не хочется комп и вариант когда уже объект создан и менять его позицию пока активна на экране данная строка, кажется более предпочтительным.
← →
Сергей М. © (2008-11-06 20:57) [7]Для начала, видимо, следует определить, какие строки в каждый момент времени подлежат визуализации (частичной или полной) ..
← →
barbaroska (2008-11-06 21:44) [8]все строки должны полностью отображаться.
текущая в данный момент строка должна закрашиваться по слогам, в зависимости от времени слогов.
определить какие строки должны выводится и текущая строка насколько должна быть закрашены проблем вроде бы нет.
пока мысли такие:
ввести дополнительный для удобства массив строк:
TMyString = record
Text: string;
BegTime: DWord;
EndTime: DWord;
obj: integer; // указатель на объект когда будет создан
end;
myString : array of TMyString;
CyrString: word;
1 при старте воспроизведения парсим массив слогов и забиваем массив строк со временем.
обнуляем CyrString;
2 событие по таймеру
если CyrString обнулена, тоесть вообще не было вывода, создаем объекты, отправляем им прорисованные строками битмапы, сохраняя указатели объектов в массиве строк, устанавливаем позиции, учитывая что первая строка должна быть выведена со второй позици (так как будет сдвигаться вверх на первую позицию)
иначе:
- определяем текущую строку.
если равна CyrString то перерисовываем и отправляем объекту новый битмап с учётом закраски слогов текущей строки. смотрим время следующей строки и двигаем объекты пропорционально позиции второй строки и оставшемуся времени, что бы третья строка, когда станет активной, заняла бы место второй строки
если текущая строка изменилась:
тут я пока застрял.
надо ещё учесть момент, что пользователь может сделать перемотку назад или вперед. хотя тут можно отслеживать это событие и обнулять CyrString и заново перерисовывать все объекты.
вообщем я уже понял, что это вопрос наверное не для форума, - слишком дохрена думать надо за спасибо..
тем не менее, Сергей М. большое спасибо :)
попробую за выходные все - таки побороть ))
← →
Сергей М. © (2008-11-07 00:14) [9]
> все строки должны полностью отображаться
С какого перепугу ?
Ты ж заявил про плавную прокрутку ?
А она вообще-то предполагает "шматкИ" видимых строк текста ..
"Типа караоке" - это отнюдь не "плавная прокрутка", насколько мне это известно ..
← →
Германн © (2008-11-07 01:15) [10]
> вообщем я уже понял, что это вопрос наверное не для форума,
> - слишком дохрена думать надо за спасибо.
Эт точно.
> Сергей М. © (07.11.08 00:14) [9]
>
>
> > все строки должны полностью отображаться
>
>
> С какого перепугу ?
>
> Ты ж заявил про плавную прокрутку ?
>
Это он не правильно высказался.В той же строке, но чуть далее было "Что-то наподобиЕ как в караоке"
← →
barbaroska (2008-11-07 11:26) [11]Да нет, это наверное я не правильно Вас понял.
Да, конечно не все строки, у меня будет переменная "видимых" строк, но я вначале написал, что допустим 4 строки:
1 - которая уже проиграла
2- текущая проигрываемая строка
3,4 следующие строки
в блоке вывода объекты, которым передаются битмапы строк, имеют:
AssignBitmap
topPosition
Visible
AlphaBlend
количество данных объектов равно переменной кол. видимых строк, как и допустили - 4
← →
MsGuns © (2008-11-07 12:09) [12]TRichEdit ?
← →
barbaroska (2008-11-07 12:17) [13]MsGuns ©, да нет..
блок вывода графический.
в оверлее на графику или видео выводятся объекты вывода (битмапы)
вот проблема с алгоритмом как парсить и управлять этими объектами что бы создать эффект плавающих строк, как титры в фильмах..
объекты получается по кругу должны тасоваться...
← →
MsGuns © (2008-11-07 14:54) [14]>barbaroska (07.11.08 12:17) [13]
Текст рисовать графикой ? Или я чего-то недопонял :( А почему нельзя просто показывать фрагмент текста в любом из стандартных компонентов, выделяя в нем цветом "пропетые" места ?
Нужно именно текст на кадре, как в кино ?
← →
barbaroska (2008-11-07 15:07) [15]MsGuns ©, вывод желательно красивый сделать, тем более что все уже сделано в плане графики.
я пока сделал простенький вывод статических двух строк (текущую и следующую).
хочется сделать красиво "текст на кадре, как в кино", да и на зрительное восприятие детям думаю лучше будет и глаза не так устанавать будут...
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.12.14;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.005 c