Pergunta

Eu estou trabalhando em um jogo pong para o Nintendo DS. Estou usando libnds a coisas configurar e eu me deparei com um comportamento muito estranho. Até agora eu só tentei-lo em emuladores, mas eu uso três diferentes e todos eles apresentam este comportamento, então eu suspeito que eu estou fazendo algo ruim.

O problema real é que quando eu uso camada de fundo 1 ou acima para meus gráficos azulejos, fico com listras estranhas todo essa camada. Se eu usar camada de fundo 0 o problema desaparece, mas desde que é processado passado, eu realmente não pode desenhar sobre ele em outra camada, o que eu quero.

Meu código de configuração:

void pong::setup_engine()
{
    // Setup DS graphics engine.
    // -------------------------
    videoSetMode(MODE_5_2D | DISPLAY_BG0_ACTIVE | DISPLAY_BG1_ACTIVE | DISPLAY_BG2_ACTIVE);
    vramSetBankA(VRAM_A_MAIN_BG_0x06000000);
    vramSetBankB(VRAM_B_MAIN_BG_0x06020000);

    u8 *tileMemory = reinterpret_cast<u8 *>(BG_TILE_RAM(1));
    u16 *mapMemory = reinterpret_cast<u16 *>(BG_MAP_RAM(0));

    int bg0 = bgInit(1, BgType_Text8bpp, BgSize_T_256x256, 0, 1);
    int bg1 = bgInit(2, BgType_Bmp16, BgSize_B16_256x256, 0, 0);
    //bgScroll(bg0, 256, 256);

    u16 *ptr = bgGetGfxPtr(bg1);
    for (int y = 10; y < 128*60; y++)
    {
        ptr[y] = 0xFFFF;
    }

    BG_PALETTE[1] = grey0;
    BG_PALETTE[2] = grey1;
    BG_PALETTE[3] = grey2;
    BG_PALETTE[4] = grey3;
    BG_PALETTE[5] = grey4;
    BG_PALETTE[6] = grey5;
    BG_PALETTE[7] = grey6;

    // 32 here is not 32 bytes but 32 half-words, which is 64 bytes.
    swiCopy(CORNER_TILE, tileMemory, 32);
    swiCopy(TOP_TILE, tileMemory + 64, 32);
    swiCopy(SIDE_TILE, tileMemory + (64 * 2), 32);
    swiCopy(MAIN_TILE, tileMemory + (64 * 3), 32);

    swiCopy(MAP, mapMemory, 32*24);
}

Na camada acima código que eu uso 1 para BG0, que é a minha camada de gráficos azulejos. Isso faz com que as listras estranhas aparecem; se eu fosse para alterá-lo para 0 como este, ele iria aparecer como esperado:

int bg0 = bgInit(0, BgType_Text8bpp, BgSize_T_256x256, 0, 1);

Todas as idéias que causa o problema, e qual é a solução?

imagem de listras estranhas

Foi útil?

Solução

um olhar breif em background.h faz com que pareça que você está usando BG1 e BG2. Para o modo 5, de acordo com:

http://nocash.emubase.de/gbatek.htm

e uma camada de 0 são normais e 2 e 3 são estendidos. Eu não sei o que estendeu meios. Se você quiser apenas fazer coisas telha normal, você provavelmente vai querer bgInit 0 e não 1 1 e 2.

Você pode alterar as prioridades em torno à vontade, camada de 0 não é necessariamente no topo de 1, etc. Olhe para os registros BGxCNT (BG0CNT, BG1CNT, ...) e os bits de prioridade. Agora, se a prioridade é um empate, então sim o número camada determina quem ganha.

Outras dicas

Duas coisas. Por um lado, o striping é mais provável um conflito VRAM, embora Tem sido um tempo desde que eu fiz DS dev passado. verifique onde você está copiando seus gráficos e seus dados de azulejos. Modo 5 utiliza dois fundos de texto, que deve estar se comportando exatamente o mesmo se eles estão inicializado uma certa maneira, então eu não tenho certeza do que está acontecendo lá.

Em qualquer caso, desde que você tenha dois fundos de trabalho, porque não basta definir as suas prioridades nos seus registos para trocar sua ordem z? Fundo são desenhados apenas em uma ordem específica pela padrão , você pode definir sua prioridade para ter o sistema de desenhá-los em qualquer ordem que desejar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top