Есть дисплей 320*240 на ESP32. Работает через библиотеку TFT_ESPI. Нужно - плавно скроллировать длинные строки текста слева-направо и сверху-вниз (выводится с другого устройства лог, который надо отобразить на экране и иметь возможность прокрутить текст вправо, т.к. на экран влазит только 40 символов. Решил использовать спрайты высотой в 10px и длинной в 960px (и всего их 32шт по высоте). Заполняю их текстом и Pushаю слева направо. НО! теперь надо текст в них обновлять. Допустим по вертикали их номера от 0 до 32. Берем последний спрайт, заполняем новым текстом. и теперь надо сдвинуть каждый из спрайтов на 10px вверх. Их номера должны ходить по кругу 31->30->29…1->0->31… Т.е. хотелось бы видеть их “номера” в виде индексов как в массиве img[x], а не просто имя img31… Как бы это описать?
Бред придумал. Храни строкой и рисуй по необходимости с необходимым сдвигом.
Выводить текст спрайтами - бред.
Если не можете ничего путного придумать сами, поищите по “си плавный скроллинг текста”.
А что мешает сделать ещё одно измерение в массиве где хранятся спрайты ?
перерисовать текст и очищать перед этим весь экран выходит гораздо дольше. спрайты на экран pushем гораздо быстрее. И не надо перед этим екран чистить. Мерцание при очистке и нифига красиво не получается. Чтобы избавится он мерцания надо только спрайт выводить. Ну и там в спрайте будет не совсем текст, вернее символы, но отрисованые двумя разными шрифтами загружаемыми по очереди.
Не нужно выдумывать несуществующие проблемы.
ну так попробуй так выводить и увидишь как оно криво выглядит. Сначала пробовал текст перерисовывать. херня выходит
так вот не пойму как это описать. Спрайт декларируется через конструктор библиотеки TFT_TSPI
TFT_eSprite row0 = TFT_eSprite(&tft);
и выделяется ему память
row0.createSprite(960,10);
Как сюда измерение с номером спрайта втулить.
плавный скроллинг на этом форуме не гуглится. А выводить текст со смещением координаты по пикселю - рисует долго и мигает…
зачем? на каждый спрайт - свой обьект. На ЕСП32 памяти до черта.
Создал и двигай.
@AVP , если Вы хотите что-то спросить - спрашивайте. А жаловаться на жизнь - это, IMHO, не для этого форума.
Только когда будете спрашивать (если меня), то спрашивайте по существу, а не по форме: я пользуюсь исключительно собственными библиотеками для экрана, поэтому что творится в “стандартных” не знаю.
Ваши рассуждения вызывают у меня легкое удивление: IMHO спрайт должен лежать во флеш, а потому никакого create для него быть не может, т.к. на момент начала работы прошивки он уже существует.
И потом, Вы все-таки определитесь, Вы текст выводите или спрайты - это разные сущности и они обладают различными свойствами, что весьма существенно, если их нужно выводить быстро и без артефактов на экране.
не выходит так - данные то приходят новые (псевдографика из шрифта и текст) и их надо отрисовать в самый нижний спрайт, а остальные подвинуть вверх. Но номера то их меняются по кругу - допустим первый цикл 0-1-2…31, второй цикл - обновили нижний 31, сместили 1->0, 2->1…31->30,и так далее. номера спрайтов по кругу крутится должны. С индексом как в массиве это было б просто, а имя элемента менять - не то пальто…
Без кода хули тут мусолить ???
Нужно решение - выкладывайте код…
@andriano , вы тоже не горячитесь. Я вполне понимаю, о чем потерпевший говорит.
Когда вам нужно двигать длинную надпись, набранную кастомным шрифтом - значительно проще один раз напечатать ее в отдельный экранный буфер (“спрайт”) и потом просто копировать на экран в нужные координаты, через сотню раз печатать заново при сдвиге на пиксель.
Генерация текста из фонта попиксельно - медленное дело.
вопрос четкий - как проиндексировать эти 32 имени. У вас свои библиотеки, умеющие в рисовать геометрические обьекты и на цветных дисплеях? сомневаюсь. Спрайты во флеш у меня не будет лежать, он создается из шрифта на основе полученных данных от диагностируемого устройства (русские буквы плюс немного псевдографики ). Длинна строки 120 символов.
это кто вам такое сказал?
Вам кто запретит называть спрайты вообще без номера, например “babka” “dedka” “vhuchka”, “zhuchka” ?
Массив/вектор объектов типа спрайт … … покажите код и вероятно мы пнём в нужную сторону
блин, мне на каждый цикл прокрутки строки текста описать куда пойдет на экран каждый из 32 строк-спрайтов? при появлении новых данных обновляется последняя строка спрайт - остальные скроллируют выше не перерисовываясь. Мне нужно получить что-то вроде
for (i=30;i>0;i–) {row[i].pushSprite(“позиция спрайта (i-1)”,0); }. Но я не могу индекс присвоить! только умею декларировать имя спрайта в этой функции
массивами пользоваться не умеете?
TFT_eSprite *rows[32];
// create a new sprite
rows[3] = new TFT_eSprite(&tft);
и можете их как угодно тасовать по массиву.
Не забывайте только зачищать, когда не нужны, а то памяти не хватит
и в чем проблема?
так и делайте
for (i=30;i>0;i–) {
rows[i]->pushSprite(“позиция спрайта (i-1)”,0);
}
о, щас попробую. наверное * забыл. компилятор меня обматерил