【发布时间】:2009-11-16 05:35:14
【问题描述】:
我写了以下内容,但在对其进行了一些修改以适应单个像素(图形显示)而不是单个字符(字符显示)后,我不理解它。
XRES x YRES 是每个字符的像素分辨率。 LCDGraphic 根据这些值绘制自己的字符。这种转换算法的想法是,您可以向右、向左或(两者)向右移动一行,向左移动下一行,然后向右等...文本版本的工作方式与预期相同,但是当我将其翻译为图形显示,它的行为很奇怪。
LCOLS 是 256(哨兵),每次执行 LCDGraphic::Transition() 时,transition_tick_ 都会递增直到这个哨兵。 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);
}
【问题讨论】:
-
“我写了以下,但我不明白” - 如果你不明白,你怎么写?
-
我首先用 Python 编写了它,其中“列表”非常易于处理。我确实很幸运,弄明白了一点。一点点试错会有很长的路要走。
-
我从来不明白为什么第一个字符是空白的,不管它是向右还是向左。就像我说的,反复试验。我没想到它会做它所做的事情,当它刚刚起作用时,我就不管它了。我现在比那时更了解它,但是这个特殊的问题让我无所适从。我仍然不明白它为什么这样做。这是我作为程序员的弱点;我有计算障碍,有些问题超出了我的范围。我反复思考问题,最终得到它们。
-
你对这段代码应该做什么的描述对你来说可能很清楚,但对我们来说却很不清楚。 “这种转换算法的想法是,您可以向右、向左或(同时)向右走一行,向左走下一行,然后向右,等等……” 什么?