![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите с алгоритмом
barbaroska © (2008-11-06 18:00:00)Имеется массив текста с временными метками, типа:
TmyText = record
myText: string;
time: DWord;
end;
myAr: array of TmyText;
в myText находятся слоги, первый символ '|' указывает на новую строку.
Необходимо составить алгоритм плавной прокрутки строк, с закраской слогов текущей строки. Что-то наподобии как в караоке.
Нюансы:
- в блоке вывода имеются объекты (колличество строк на экране)
- в данные блоки необходимо передавать битмапы с прорисованными строками
- можно управлять местоположением объектов путем указания их координат на экране
- передавать в последующем только новые строки и текущий битмап, где происходит закраска слогов текста по времени, а остальные объекты, если ещё видимы переданные в них строки - управлять местоположением.
Необходим сам алгоритм определения текущих строк, передачи полученных битмапов в блок вывода и управление там ими.
имеются данные Heigh блока вывода, TextHeigh - высота объекта, колличество строк на экране допустим 4
пол дня сижу втупую.
если есть мысли подскажите плиз..
barbaroska (2008-11-07 15:07:00) [1]MsGuns ©, вывод желательно красивый сделать, тем более что все уже сделано в плане графики.
я пока сделал простенький вывод статических двух строк (текущую и следующую).
хочется сделать красиво "текст на кадре, как в кино", да и на зрительное восприятие детям думаю лучше будет и глаза не так устанавать будут...
MsGuns (2008-11-07 14:54:00) [2]>barbaroska (07.11.08 12:17) [13]
Текст рисовать графикой ? Или я чего-то недопонял :( А почему нельзя просто показывать фрагмент текста в любом из стандартных компонентов, выделяя в нем цветом "пропетые" места ?
Нужно именно текст на кадре, как в кино ?
barbaroska (2008-11-07 12:17:00) [3]MsGuns ©, да нет..
блок вывода графический.
в оверлее на графику или видео выводятся объекты вывода (битмапы)
вот проблема с алгоритмом как парсить и управлять этими объектами что бы создать эффект плавающих строк, как титры в фильмах..
объекты получается по кругу должны тасоваться...
MsGuns (2008-11-07 12:09:00) [4]TRichEdit ?
barbaroska (2008-11-07 11:26:00) [5]Да нет, это наверное я не правильно Вас понял.
Да, конечно не все строки, у меня будет переменная "видимых" строк, но я вначале написал, что допустим 4 строки:
1 - которая уже проиграла
2- текущая проигрываемая строка
3,4 следующие строки
в блоке вывода объекты, которым передаются битмапы строк, имеют:
AssignBitmap
topPosition
Visible
AlphaBlend
количество данных объектов равно переменной кол. видимых строк, как и допустили - 4
Германн (2008-11-07 01:15:00) [6]
> вообщем я уже понял, что это вопрос наверное не для форума,
> - слишком дохрена думать надо за спасибо.
Эт точно.
> Сергей М. © (07.11.08 00:14) [9]
>
>
> > все строки должны полностью отображаться
>
>
> С какого перепугу ?
>
> Ты ж заявил про плавную прокрутку ?
>
Это он не правильно высказался.В той же строке, но чуть далее было "Что-то наподобиЕ как в караоке"
Сергей М. (2008-11-07 00:14:00) [7]
> все строки должны полностью отображаться
С какого перепугу ?
Ты ж заявил про плавнуюпрокрутку ?
А она вообще-то предполагает "шматкИ" видимых строк текста ..
"Типа караоке" - это отнюдь не "плавная прокрутка", насколько мне это известно ..
barbaroska (2008-11-06 21:44:00) [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-06 20:57:00) [9]Для начала, видимо, следует определить, какие строки в каждый момент времени подлежат визуализации (частичной или полной) ..
barbaroska (2008-11-06 20:38:00) [10]Нет.
например: |ти 500 ли 1000 ти 1500 ли 2000 |тра 2500 ...
тоесть данная строка закрашивается в диапазоне 500 - 2500 м.сек.
например, если время 1400 должно быть в строке закрашено только тили, тоесть время показывает когда закрашивается полностью слог.
имеется всегда текущее время.
я планирую делать закрашиваемой вторую сверху строку.
после того как закрасится, она станет на позицию первой и потом плавно исчезнет.
во время закраски второй строки все строки должны подниматься к верху, что бы когда пришло время третьей строчке она была бы на позиции второй строки.
голова вообще кипит.
думал будет просто, но пока никак.
в блоке вывода можно ввести до тысячи объектов.
каждый объект имеет свои координаты, прозрачность, указатель видимости.
в созданном объекте можно менять битмап.
по идее можно было бы каждый раз по таймеру уничтожать все объекты
и вычислив текущие строки заново создавать с первого..
но грузить не хочется комп и вариант когда уже объект создан и менять его позицию пока активна на экране данная строка, кажется более предпочтительным.
Сергей М. (2008-11-06 20:01:00) [11]А тишина (паузы в ходе диктовки) как тобой кодируется ?
barbaroska (2008-11-06 19:55:00) [12]Сергей М., на мой взгляд нет никакой разницы.
примерно около 30 строк. в строке в среднем по 22 символа, примерно 3 буквы на слог итого длина массива в районе 200
Сергей М. (2008-11-06 19:25:00) [13]И какова же максимально возможная и среднепрогнозируемая длина массива myAr ?
barbaroska (2008-11-06 18:23:00) [14]Jeer ©, я про код молчу,
сам алгоритм никак в голове не строится.
читать книжки не поможет, если голова ещё не варит при большом алгоритме.
мало опыта видать в логике.
для учебного заведения пишу прогу по обучению английскому.
есть мп3 файл с текстовкой и сам текст, разбитый по времени.
нужно при воспроизведении мп3 показывать ещё текстовку, что бы было видно как оно пишется.
уже все готово, кроме подготовки и управление выводом.
сделал простенький вывод но он не красив. хочу добить этот вариант c плавной прокруткой
Jeer (2008-11-06 18:12:00) [15]Так, может надо начать с 'Hello World' ?