Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1225983644
barbaroska
2008-11-06 18:00
2008.12.14
Помогите с алгоритмом


6-1196409724
Ш-К
2007-11-30 11:02
2008.12.14
Как реализовать обсервер.


15-1223537558
Василий Жогарев
2008-10-09 11:32
2008.12.14
Улыбнуло


15-1223026051
Виталий Глуниц
2008-10-03 13:27
2008.12.14
Премирование программистов


2-1225459016
Alex_Ford
2008-10-31 16:16
2008.12.14
реестр





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский