Эффект "щлейфа" на OLED-дисплее 128*64

the_matrix
the_matrix аватар
Offline
Зарегистрирован: 06.03.2018

Добрый день.

Задание: сделать рожицу на дсиплее,которая будет кататься по экрану от координат привязанного к экрану акселерометра.

Вопрос: рожица катается, но оставляет за собой шлейф. Как его убрать?

Рожица отрисована в hex-массиве.

Logik
Offline
Зарегистрирован: 05.08.2014

А за ней зарисовать фон забыли?

the_matrix
the_matrix аватар
Offline
Зарегистрирован: 06.03.2018

Нет,у меня на дисплее есть "игровое поле", по достижении его границ происходит "смерть_героя".

Или Вы о каком фоне?

Logik
Offline
Зарегистрирован: 05.08.2014

том, которым игровое поле должно быть залито в отсутствии героя.

the_matrix
the_matrix аватар
Offline
Зарегистрирован: 06.03.2018
void Location()
{
   display.drawRect (0, 0, 127, 63, false, 1);
}

void CheckBlock()
{
  if (x > 111 || x < 2 || y > 63 || y < 16){GameOver();}
}

void Face()
{
  display.drawImage (pers_1, x, y);
}

У меня нарисован квадрат, у него есть "смертельные" границы и отрисована рожица. Где я упустил момент с прорисовкой фона за персонажем и как это можно исправить, подскажите пожалуйста.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Смотри, какое дело: ты залил определённые пиксели (display.drawImage это и делает, строго говоря) определёнными цветами. И эти пиксели будут светиться своими цветами до посинения, понимаешь? Чтобы отрисовать персонаж в новой позиции - тебе надо, если по простому - взять рисунок с цветом фона экрана, отрисовать его в предыдущей позиции, затем отрисовать персонаж в новой позиции.

ven-til
Offline
Зарегистрирован: 13.02.2018
void deleteFaceFromOldPosition()
{
display.drawFill(xOld,yOld,xOld+faceWIdth, yOld+faceHeight, color);
}

 

the_matrix
the_matrix аватар
Offline
Зарегистрирован: 06.03.2018

Не могли бы вы хотя бы примерно в виде кода это отобразить?

Смысл я понял,не очень понятен ряд дальнейших действий.

Клапауций 555
Offline
Зарегистрирован: 10.03.2018

DIYMan пишет:

Смотри, какое дело: ты залил определённые пиксели (display.drawImage это и делает, строго говоря) определёнными цветами. И эти пиксели будут светиться своими цветами до посинения, понимаешь? Чтобы отрисовать персонаж в новой позиции - тебе надо, если по простому - взять рисунок с цветом фона экрана, отрисовать его в предыдущей позиции, затем отрисовать персонаж в новой позиции.

и, изображение будет мерцать.

может сразу рисовать готовое картинко на весь экран - с фоном и мордой?

или рисовать только те пиксели, которые изменились в отношении старой картинко?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Клапауций 555 пишет:

и, изображение будет мерцать.

может сразу рисовать готовое картинко на весь экран - с фоном и мордой?

или рисовать только те пиксели, которые изменились в отношении старой картинко?

Не, ну епстессно, это так, навскидку. Ты мне предлагаешь за ТС всё сделать? Через эти тернии надо самому пройти, считаю. Крайний твой вопрос - самое годное решение, кстати, но - требует хороших навыков в той же математике.

b707
Offline
Зарегистрирован: 26.05.2017

DIYMan пишет:

Крайний твой вопрос - самое годное решение, кстати, но - требует хороших навыков в той же математике.

да какая там математика... проверенный старый способ - XOR рисуем . потом второй XOR по этому же пикселю - стираем

the_matrix
the_matrix аватар
Offline
Зарегистрирован: 06.03.2018

Прошу прощения, можно ли подробнее объяснить?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

b707 пишет:

да какая там математика... проверенный старый способ - XOR рисуем . потом второй XOR по этому же пикселю - стираем

Математика там в том, чтобы не делать лишних операций по медленной шине ;) Если у тебя изменилось 5 пикселей - зачем гнать команды на изменение сотни пикселей? Я только об этом ;)

Logik
Offline
Зарегистрирован: 05.08.2014

Так чтоб XOR делать надо иметь доступ к картинке на чтение. А это у OLED не всегда возможно, от шины зависит. Тогда приийдется промежуточный буфер в 1КБ держать, что плохо.

В таком случае правильно - хранить координаты и размер окна области морды с предыдущего шага. На следующем шаге определяем новую область морды. Дальше ту часть старой области, что не покрывается новой областю  перерисовывать фоном. Ну и новую область морды прорисовать мордой ))

ПС. Опять таки помним что вывод не по 1 пикселю а сразу по 8. Специфика вобщем.