Я написал следующее, но я не понимаю его после того, как изменил его так, чтобы он соответствовал одиночным пикселям (графические дисплеи) вместо отдельных символов (символьные дисплеи).
XRES x YRES - разрешение каждого символа в пикселях. LCDGraphic
рисует свои собственные символы на основе этих значений. Идея этого алгоритма перехода заключается в том, что вы можете перейти вправо, влево или (оба) вправо на одну строку, влево на следующую строку, затем вправо и т. Д. ... Текстовая версия работает так, как она должна, но когда я перевел ее для графические дисплеи, это ведет себя странно.
LCOLS
равно 256 (часовой), и transition_tick_
увеличивается до этого стража каждый раз при выполнении LCDGraphic::Transition()
. Таким образом, col
может находиться в диапазоне 0-255. Ну, когда пиксели идут влево и вправо, они должны двигаться вместе. Однако по какой-то причине линии, идущие вправо, перемещаются до их завершения, а затем линии, перемещающиеся влево, перемещаются до завершения. Похоже, что где col
равно < 128
, левые движущиеся линии корректируются, тогда, когда col
равно >= 128
, правые движущиеся линии корректируются. Я очень хорошо смущен этим.
void LCDGraphic::Transition() {
int direction = visitor_->GetDirection();
int col;
transitioning_ = true;
for(unsigned int row = 0; row < LROWS / YRES; row++) {
if( direction == TRANSITION_LEFT ||
(direction == TRANSITION_BOTH && row % 2 == 0))
col = LCOLS - transition_tick_;
else if( direction == TRANSITION_RIGHT || direction == TRANSITION_BOTH)
col = transition_tick_;
else
col = 0;
if(col < 0)
col = 0;
for(unsigned int i = 0; i < YRES; i++) {
int n = row * YRES * LCOLS + i * LCOLS;
for(unsigned int l = 0; l < 1; l++) {// LAYERS; l++) {
RGBA tmp[LCOLS];
memcpy(tmp + XRES, GraphicFB[l] + n + col + XRES, (LCOLS - col) * sizeof(RGBA));
for(unsigned j = 0; j < XRES; j++)
tmp[j] = NO_COL;
memcpy(GraphicFB[l] + n + col, tmp, sizeof(RGBA) * (LCOLS - col));
}
}
}
transition_tick_+=XRES;
if( transition_tick_ >= (int)LCOLS ) {
transitioning_ = false;
transition_tick_ = 0;
emit static_cast<LCDEvents *>(
visitor_->GetWrapper())->_TransitionFinished();
}
GraphicBlit(0, 0, LROWS, LCOLS);
}