segunda-feira, julho 21, 2014

Apenas com o DevKitPro e a sua biblioteca LibNDS

Bom, PALib morreu. E antes de morrer já era incompatível com as versões mais novas (da época) do DevKitPro.

Resolvi então tentar aprender a mexer só com o DevKitPro, que vai sendo atualizado e a biblioteca NDS não se torna incompatível.

Vamos então ao primeiro programa:
#include <nds.h>
#include <stdio.h>

void clearScreen(r, g, b) {
    int i;
    for (i = 0; i < 256*192; i++) VRAM_A[i] = RGB15(r, g, b);
}

int main(void)
{
    int r = 0;
    int g = 0;
    int b = 0;
    int down;

    consoleDemoInit();
    videoSetMode(MODE_FB0);
    vramSetBankA(VRAM_A_LCD);

    while(1)
    {
        scanKeys();
        down = keysDown();
        if (down & KEY_DOWN) {
            r--;
            if (r < 0) r = 0;
        }
        if (down & KEY_UP) {
            r++;
            if (r > 31) r = 31;
        }
        if (down & KEY_B) {
            g--;
            if (g < 0) g = 0;
        }
        if (down & KEY_X) {
            g++;
            if (g > 31) g = 31;
        }
        if (down & KEY_L) {
            b--;
            if (b < 0) b = 0;
        }
        if (down & KEY_R) {
            b++;
            if (b > 31) b = 31;
        }
        if (down & KEY_START) {
            r = 0;
            g = 0;
            b = 0;
        }
        if (down & KEY_SELECT) {
            r = 31;
            g = 31;
            b = 31;
        }
       
        clearScreen(r, g, b);   
        iprintf("\x1b[10;0H    R = %02i\n", r);
        iprintf("    G = %02i\n", g);
        iprintf("    B = %02i\n", b);
           
   
        swiWaitForVBlank();
    }

    return 0;
}

 O programa acima mostra os dados RGB na tela de baixo e o resultado das cores na tela de cima. O comando consoleDemoInit diz que a tela de baixo vai ser um terminal texto. O comando videoSetMode(MODE_FB0)diz que a tela de cima vai ser frame buffer (são 256x192 pixels de 16 bits cada). O comando vramSetBankA(VRAM_A_LCD)aloca a memória usada pelo frame buffer.
O comando scanKeys deve ser rodado a cada loop para verificar o estado dos botões e da touch. A função keysDown é usada para ler o estado de cada botão somente se ele recém foi pressionado. Se eu quisesse pegar os botões que estão sendo mantidos apertados, o comando seria keysHeld e se quisesse os botões que foram recém soltos, o comando seria keysUp. O resultado da leitura dos botões deve ser "shifted" para ler os dados de cada botão individual. As informações de shift estão indexadas pelas seguntes constantes:
  KEY_A = BIT(0),
  KEY_B = BIT(1),
  KEY_SELECT = BIT(2),
  KEY_START = BIT(3),
  KEY_RIGHT = BIT(4),
  KEY_LEFT = BIT(5),
  KEY_UP = BIT(6),
  KEY_DOWN = BIT(7),
  KEY_R = BIT(8),
  KEY_L = BIT(9),
  KEY_X = BIT(10),
  KEY_Y = BIT(11),
  KEY_TOUCH = BIT(12),
  KEY_LID = BIT(13) 

 Por isso, para verificar se a seta para cima recém foi apertada, usei if (down & KEY_UP)

Nenhum comentário: