Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.12.14;
Скачать: CL | DM;

Вниз

Помогите с алгоритмом   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.016 c
4-1185993816
Serega41
2007-08-01 22:43
2008.12.14
Как получить LinkName устройства?


2-1225795599
Петр
2008-11-04 13:46
2008.12.14
Виртуальный LPT


3-1211451730
FOX87
2008-05-22 14:22
2008.12.14
Совместное отображение данных ACCESS


15-1223864185
Slider007
2008-10-13 06:16
2008.12.14
С днем рождения ! 12 октября 2008 воскресенье


15-1223507703
Eraser
2008-10-09 03:15
2008.12.14
Об IT, госзаказах и немного об образовании