Символы TVout не выстраиваются в линию

Я возился с библиотекой Arduino TVout и создал несколько многосимвольных плиток (не знаю, как их еще назвать). Просто для начала я создал простой X, который охватывает 4 символа, но когда я печатаю их на экране, они правильно выравниваются.

Как они должны быть выровнены:

Как они на самом деле совпадают:

Вот код, который у меня есть:

Основной файл:

#include "expressions.h"
#include <TVout.h>

TVout win;
unsigned char x = 0, y = 0;

void setup() {
  win.begin(NTSC);
  win.select_font(expr8x8);
}

void loop() {
  win.clear_screen();
  x = 2, y = 5;
  print_char(0, x, y);

  win.delay(1);
}

void print_char(char c, int startx, int starty) {
  int tmpx = startx, tmpy = starty;
  for (char i = c; i < c + 4; i++) {
    win.print_char(tmpx * 8, tmpy * 8, i);
    if (++tmpx == c + 2) {
      tmpy++;
      tmpx = startx;
    }
  }
}

выражения.h

#define EXPRESSIONS8x8_H

#include <avr/pgmspace.h>
extern const unsigned char expr8x8[];

выражения.cpp

#include "expressions.h"

PROGMEM const unsigned char expr8x8[] = {
  8, 8, 0, // ширина, высота, начало
 
  // сломанный
  0x00, 0x00, 0x30, 0x38, 0x1c, 0x1e, 0x07, 0x03,
  0x00, 0x00, 0x0c, 0x1c, 0x38, 0x70, 0xe0, 0xc0,
  0x03, 0x07, 0x0e, 0x1c, 0x38, 0x38, 0x00, 0x00,
  0xc0, 0xc0, 0x70, 0x38, 0x1c, 0x0c, 0x00, 0x00,

  // счастливый
  0x00, 0x00, 0x00, 0x00, 0x07, 0x1f, 0x38, 0x70,
  0x00, 0x00, 0x00, 0x00, 0xe0, 0xf8, 0x1c, 0x0e,
  0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00
};

Я что-то делаю не так? Как исправить эту ошибку/проблему?

, 👍0

Обсуждение

Меньше строк кода было бы просто иметь 4 отпечатка, по одному для каждого символа., @Majenko


1 ответ


Лучший ответ:

4

Я думаю, ваша проблема в этой строке:

if (++tmpx == c + 2) {

Здесь вы смешиваете две разные вещи:

  • c — это код символа, т. е. индекс глифа в expr8x8 шрифт
  • tmpx – это индекс символьной ячейки (блок пикселей 8 × 8) в строка экрана

Сравнивать их не имеет смысла. И в самом деле, сравнение будет всегда быть ложным, так как c равно нулю, а tmpx начинается с 2 и увеличивается оттуда.

Я думаю, вы имели в виду следующее:

if (++tmpx == startx + 2) {
,