@Aassians2
Любитель игр.

Можете объяснить, как закодированы рисунки и анимация в 16-ричном коде тамагочи?

Что-бы я тоже мог свои закодировать...
gist.github.com/aerospark/80c60e801398fd961e3f
  • Вопрос задан
  • 740 просмотров
Решения вопроса 1
Andrew_Pinkerton
@Andrew_Pinkerton
Backend-разработчик
Используется матрица 32x32, в ней закодированы значения
Этот класс отвечает за анимацию:
class AnimationFrame {
    int[] framedata;
    
    public AnimationFrame(int[] framedata){
        this.framedata = framedata;
    }
    public AnimationFrame(byte[][] drawmatrix){
        framedata = new int[32];
        for(int i = 0; i < 32; i++){
            int shift = 0;
            for(int e = 31; e > -1; e--){
                byte b = drawmatrix[i][e];
                shift = (shift<<1) | b;
            }
            framedata[i] = shift;
        }
    }
}


Это пример кодирования:
public static final Animation OVERLAY_STINK = new Animation(new AnimationFrame[]{new AnimationFrame(new int[]{0x0,0x0,0x0,0x0,0x10000000,0x8000008,0x10000004,0xa000028,0x11000044,0xa000028,0x1000044,0x12000020,0x21000040,0x10000000,0x20000000,0x10000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}),new AnimationFrame(new int[]{0x0,0x0,0x0,0x10000000,0x8000008,0x10000004,0xa000028,0x11000044,0xa000028,0x1000044,0x12000020,0x21000040,0x10000000,0x20000000,0x10000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0})});


А так выглядит результат, после компиляции этого кода:
5cb4557e088f1968430083.png
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Zoominger
@Zoominger
System Engineer
Я вот пытался долго вникнуть, но без подсказки трудно. Варианты:
1. Спросите у автора кода;
2. Дайте пример картинки, тогда можно будет сопоставить пикчу и код.

Мне пока кажется, что там указана координата закрашенного пикселя на матрице 32х32.
Ответ написан
SagePtr
@SagePtr
Еда - это святое
Да, судя по коду отрисовки, там битовый массив пикселей:
public void renderComponent(Graphics2D g, AnimationFrame fr, int xo, int yo){
    for(int x = 0; x < 32; x++){
        int v = fr.framedata[x];
        for(int y = 0; y < 32; y++){
            int bv = (v & (1 << y-1));
            if(bv != 0)
                g.setColor(PIXEL_COLOR);
            else
                g.setColor(NONPIXEL_COLOR);
            g.drawLine(y+xo,x+yo,y+xo,x+yo);
        }
    }
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы