Pregunta

Estoy trabajando en un juego de mesa para la Nintendo DS. Estoy usando libnds para arreglar las cosas y me he encontrado con un comportamiento muy extraño. Hasta ahora sólo lo he probado en emuladores, pero yo utilizo tres diferentes y todos ellos presentan este comportamiento por lo que sospecho que estoy haciendo algo mal.

El problema real es que cuando utilizo capa de fondo 1 o superior para mis gráficos azulejos, consigo rayas extrañas todo esa capa. Si utilizo capa de fondo 0 el problema desaparece, pero desde que se representa el pasado, yo en realidad no puede dibujar sobre ella en otra capa, lo que yo quiero.

Mi código de configuración:

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);
}

En el código anterior que utilizan la capa 1 para BG0, que es mi azulejos capa de gráficos. Esto hace que aparezcan las rayas extrañas; si tuviera que cambiarlo a 0 como este, sería una muestra de como se esperaba:

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

Cualquier idea lo que causa el problema y cuál es la solución?

imagen de rayas extrañas

¿Fue útil?

Solución

breif un vistazo a background.h hace que parezca que está utilizando BG1 y BG2. Para el modo 5, de acuerdo con:

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

capa 0 y 1 son normales y 2 y 3 se extienden. No sé lo que extendió medios. Si desea simplemente hacer cosas baldosas normales es probable que desee bgInit 0 y 1 no 1 y 2.

Puede cambiar las prioridades en torno a voluntad, la capa 0 no es necesariamente por encima de 1, etc. Mira los registros BGxCNT (BG0CNT, BG1CNT, ...) y los bits de prioridad. Ahora bien, si la prioridad es un empate, entonces sí el número de capa determina quién gana.

Otros consejos

Dos cosas. Por un lado, la creación de bandas es más probable un conflicto VRAM, a pesar de que ha pasado un tiempo desde que hice DS dev pasado. Vuelva a comprobar donde está copiando los gráficos y los datos de baldosas. Modo 5 utiliza dos fondos de texto, que debe ser comportan exactamente lo mismo si están inicializadas de cierta manera, así que no estoy seguro de lo que está pasando allí.

En cualquier caso, ya que tiene dos antecedentes de trabajo, ¿por qué no acaba de establecer sus prioridades en sus registros de cambiar su orden z? Antecedentes solamente se dibujan en un orden determinado por por defecto , se puede establecer su prioridad para que el sistema que dibujen en el orden que desee.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top