Anuncios Google

libnds y fondos(un mundo a parte con problemas)

buenas

he estado volviendo a programar de nuevo, bueno a aprender de nuevo libnds y resulta que por mas que intento cargar dos capas de fondos en la misma pantalla, pos o se cambia la paleta o no funiones o se queda negro u otros problemas.

deberia aparecer madera en 3 plano y en segundo un fondo magenta con letras, lo que mas me he acercado es que se me cargo el magenta encima, pero ya no consegui

este es el codigo actual

/*---------------------------------------------------------------------------------
---------------------------------------------------------------------------------*/
#include <nds.h>
#include <stdio.h>
#include <string.h>
#include "woodTiles_bin.h"
#include "woodMap_bin.h"
#include "woodPal_bin.h"
#include "fondo2Tiles_bin.h"
#include "fondo2Map_bin.h"
#include "fondo2Pal_bin.h"
#include "fondo1Tiles_bin.h"
#include "fondo1Map_bin.h"
#include "fondo1Pal_bin.h"
#include "fondo0Tiles_bin.h"
#include "fondo0Map_bin.h"
#include "fondo0Pal_bin.h"
//---------------------------------------------------------------------------------
int main(void) {
//---------------------------------------------------------------------------------
	irqInit();
	irqEnable(IRQ_VBLANK);
	//Modo de Video
	REG_DISPCNT = MODE_0_2D | DISPLAY_BG0_ACTIVE | DISPLAY_BG1_ACTIVE | DISPLAY_BG2_ACTIVE | DISPLAY_BG3_ACTIVE;
	REG_BG0CNT = BG_32x32 | BG_COLOR_256 | BG_MAP_BASE(0) | BG_TILE_BASE(1) | BG_PRIORITY(0);
	REG_BG1CNT = BG_32x32 | BG_COLOR_256 | BG_MAP_BASE(1) | BG_TILE_BASE(2) | BG_PRIORITY(1);
	REG_BG2CNT = BG_32x32 | BG_COLOR_256 | BG_MAP_BASE(2) | BG_TILE_BASE(3) | BG_PRIORITY(2);
	REG_BG3CNT = BG_32x32 | BG_COLOR_256 | BG_MAP_BASE(3) | BG_TILE_BASE(4) | BG_PRIORITY(3);
 
	REG_DISPCNT_SUB = MODE_0_2D | DISPLAY_BG0_ACTIVE | DISPLAY_BG1_ACTIVE | DISPLAY_BG2_ACTIVE | DISPLAY_BG3_ACTIVE;
	REG_BG0CNT_SUB = BG_32x32 | BG_COLOR_256 | BG_MAP_BASE(0) | BG_TILE_BASE(1) | BG_PRIORITY(0);
	REG_BG1CNT_SUB = BG_32x32 | BG_COLOR_256 | BG_MAP_BASE(1) | BG_TILE_BASE(2) | BG_PRIORITY(1);
	REG_BG2CNT_SUB = BG_32x32 | BG_COLOR_256 | BG_MAP_BASE(2) | BG_TILE_BASE(3) | BG_PRIORITY(2);
	REG_BG3CNT_SUB = BG_32x32 | BG_COLOR_256 | BG_MAP_BASE(3) | BG_TILE_BASE(4) | BG_PRIORITY(3);
 
	//Memoria Vram
	vramSetBankA(VRAM_A_MAIN_BG);
	vramSetBankE(VRAM_E_LCD);
	vramSetBankC(VRAM_C_SUB_BG);
	vramSetBankH(VRAM_H_LCD);
 
	//Cargar fondos pantalla arriba
	memcpy((void*)BG_TILE_RAM(1), woodTiles_bin, woodTiles_bin_size);
	memcpy((void*)BG_MAP_RAM(0), woodMap_bin, woodMap_bin_size);
	memcpy((void*)BG_PALETTE, woodPal_bin, woodPal_bin_size);
 
	memcpy((void*)BG_TILE_RAM(2), fondo2Tiles_bin, fondo2Tiles_bin_size);
	memcpy((void*)BG_MAP_RAM(1), fondo2Map_bin, fondo2Map_bin_size);
	memcpy((void*)BG_PALETTE, fondo2Pal_bin, fondo2Pal_bin_size);
 
	//Cargar fondos pantalla abajo
	memcpy((void*)BG_TILE_RAM_SUB(1), woodTiles_bin, woodTiles_bin_size);
	memcpy((void*)BG_MAP_RAM_SUB(0), woodMap_bin, woodMap_bin_size);
	memcpy((void*)BG_PALETTE_SUB, woodPal_bin, woodPal_bin_size);
 
	while(1) {
		swiWaitForVBlank();
	}
 
}

ayuda pliss


Be Libre my Friend.


Anuncios Google

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de kNightFox

Inicializa en sub engine con

Inicializa en sub engine con los valores sub.
Si no usas paletas extendidas (no te pase nada), los fondos de cada pantalla deben usar LA MISMA, paleta.


Nuestra web oficial:
http://www.nightfoxandco.com/
 
Siguenos en facebook:
http://www.facebook.com/pages/NightFox-Co/284338634917917
 
Por favor, no useis los MP para preguntas, usar el FORO:
http://www.nightfoxandco.com/forum/
Asi nos ahorramos de contestar lo mismo 20 veces.

 

Imagen de OdnetninI

si te refieres a

si te refieres a esto:

REG_DISPCNT_SUB = MODE_0_2D | DISPLAY_BG0_ACTIVE | DISPLAY_BG1_ACTIVE | DISPLAY_BG2_ACTIVE | DISPLAY_BG3_ACTIVE;
	REG_BG0CNT_SUB = BG_32x32 | BG_COLOR_256 | BG_MAP_BASE(0) | BG_TILE_BASE(1) | BG_PRIORITY(0);
	REG_BG1CNT_SUB = BG_32x32 | BG_COLOR_256 | BG_MAP_BASE(1) | BG_TILE_BASE(2) | BG_PRIORITY(1);
	REG_BG2CNT_SUB = BG_32x32 | BG_COLOR_256 | BG_MAP_BASE(2) | BG_TILE_BASE(3) | BG_PRIORITY(2);
	REG_BG3CNT_SUB = BG_32x32 | BG_COLOR_256 | BG_MAP_BASE(3) | BG_TILE_BASE(4) | BG_PRIORITY(3);

Ponerlo con sub, lo hago enseguida, aunque no se que te refieres, porque yo creo que al ponerle el comando sub ya esta en el, pero lo de la spaletas extendidas, lo puse y el homebrew se queda en negro y no se porque solo añadi lo de activar paletas extendidas(no me acuerdo ahora mismo) al, apartado de iniciar y nada. No se porque, te paso de nuevo el source con las correcciones que he hecho y me dices, proque no entiendo el porqué de esto.

/*---------------------------------------------------------------------------------
---------------------------------------------------------------------------------*/
#include <nds.h>
#include <stdio.h>
#include <string.h>
#include "woodTiles_bin.h"
#include "woodMap_bin.h"
#include "woodPal_bin.h"
#include "fondo2Tiles_bin.h"
#include "fondo2Map_bin.h"
#include "fondo2Pal_bin.h"
#include "fondo1Tiles_bin.h"
#include "fondo1Map_bin.h"
#include "fondo1Pal_bin.h"
#include "fondo0Tiles_bin.h"
#include "fondo0Map_bin.h"
#include "fondo0Pal_bin.h"
//---------------------------------------------------------------------------------
int main(void) {
//---------------------------------------------------------------------------------
	irqInit();
	irqEnable(IRQ_VBLANK);
	//Modo de Video
	REG_DISPCNT = MODE_0_2D | DISPLAY_BG0_ACTIVE | DISPLAY_BG1_ACTIVE | DISPLAY_BG2_ACTIVE | DISPLAY_BG3_ACTIVE;
	REG_DISPCNT |= (DISPLAY_BG_EXT_PALETTE);
	REG_BG0CNT = BG_32x32 | BG_COLOR_256 | BG_MAP_BASE(0) | BG_TILE_BASE(1) | BG_PRIORITY(0);
	REG_BG1CNT = BG_32x32 | BG_COLOR_256 | BG_MAP_BASE(1) | BG_TILE_BASE(2) | BG_PRIORITY(1);
	REG_BG2CNT = BG_32x32 | BG_COLOR_256 | BG_MAP_BASE(2) | BG_TILE_BASE(3) | BG_PRIORITY(2);
	REG_BG3CNT = BG_32x32 | BG_COLOR_256 | BG_MAP_BASE(3) | BG_TILE_BASE(4) | BG_PRIORITY(3);
 
	REG_DISPCNT_SUB = MODE_0_2D | DISPLAY_BG0_ACTIVE | DISPLAY_BG1_ACTIVE | DISPLAY_BG2_ACTIVE | DISPLAY_BG3_ACTIVE;
	REG_DISPCNT_SUB |= (DISPLAY_BG_EXT_PALETTE);
	REG_BG0CNT_SUB = BG_32x32 | BG_COLOR_256 | BG_MAP_BASE(0) | BG_TILE_BASE(1) | BG_PRIORITY(0);
	REG_BG1CNT_SUB = BG_32x32 | BG_COLOR_256 | BG_MAP_BASE(1) | BG_TILE_BASE(2) | BG_PRIORITY(1);
	REG_BG2CNT_SUB = BG_32x32 | BG_COLOR_256 | BG_MAP_BASE(2) | BG_TILE_BASE(3) | BG_PRIORITY(2);
	REG_BG3CNT_SUB = BG_32x32 | BG_COLOR_256 | BG_MAP_BASE(3) | BG_TILE_BASE(4) | BG_PRIORITY(3);
 
	//Memoria Vram
	vramSetBankA(VRAM_A_MAIN_BG);
	vramSetBankE(VRAM_E_LCD);
	vramSetBankC(VRAM_C_SUB_BG);
	vramSetBankH(VRAM_H_LCD);
 
	//Cargar fondos pantalla arriba
	memcpy((void*)BG_TILE_RAM(1), woodTiles_bin, woodTiles_bin_size);
	memcpy((void*)BG_MAP_RAM(0), woodMap_bin, woodMap_bin_size);
	memcpy((void*)BG_PALETTE, woodPal_bin, woodPal_bin_size);
 
	memcpy((void*)BG_TILE_RAM(2), fondo2Tiles_bin, fondo2Tiles_bin_size);
	memcpy((void*)BG_MAP_RAM(1), fondo2Map_bin, fondo2Map_bin_size);
	memcpy((void*)BG_PALETTE, fondo2Pal_bin, fondo2Pal_bin_size);
 
	//Cargar fondos pantalla abajo
	memcpy((void*)BG_TILE_RAM_SUB(1), woodTiles_bin, woodTiles_bin_size);
	memcpy((void*)BG_MAP_RAM_SUB(0), woodMap_bin, woodMap_bin_size);
	memcpy((void*)BG_PALETTE_SUB, woodPal_bin, woodPal_bin_size);
 
	while(1) {
		swiWaitForVBlank();
	}
 
}

se me queda la pantalla en negro, asi que tu diras


Be Libre my Friend.

Imagen de kNightFox

Para empezar, de momento,

Para empezar, de momento, olvidate de las paletas extendidas, libnds no tiene soporte nativo para ella, (no hay comandos para hacerlo directamente, se tiene que hacer a mano)
Despues indexa todos los fondos de cada pantalla con la misma paleta, o intentalo con un solo fondo.

Las linas con
REG_BG0CNT = BG_32x32 | BG_COLOR_256 | BG_MAP_BASE(0) | BG_TILE_BASE(1) | BG_PRIORITY(0);

Cambialo por
REG_BG0CNT = BgType_Text8bpp | BG_32x32 | BG_COLOR_256 | BG_MAP_BASE(0) | BG_TILE_BASE(1) | BG_PRIORITY(0);

Mas que nada para asegurarte que entiende que vas a usar fondos tileados.

Cuando esto de funciona, continuaremos. Mas que nada por que yo no uso los macros de libnds para la VRAM y voy directo a los registros, pero el codigo parece correcto, quita solo todo lo de paletas extendidas (usa solo los bancos A y C) y lo de la copia de datos a la VRAM parece correcto. Creo que todo el lio que tienes es con la paleta.


Nuestra web oficial:
http://www.nightfoxandco.com/
 
Siguenos en facebook:
http://www.facebook.com/pages/NightFox-Co/284338634917917
 
Por favor, no useis los MP para preguntas, usar el FORO:
http://www.nightfoxandco.com/forum/
Asi nos ahorramos de contestar lo mismo 20 veces.

 

Imagen de OdnetninI

ya va casi del todo, lo que

ya va casi del todo, lo que no se es como usar las paletas extendidas, si me lo puedieras explicar, te lo agradeceria.

todo genial menos eso, ya queda menos


Be Libre my Friend.

Imagen de kNightFox

 Basicamente seria:  //

 Basicamente seria:
 

		// Tranfiere la Paleta a VRAM
		if (screen == 0) {
 
			vramSetBankE(VRAM_E_LCD);
			address = (0x06880000) + (layer << 13);
			NF_DmaMemCopy((void*)address, NF_BUFFER_BGPAL[slot], NF_TILEDBG[slot].palsize);
			vramSetBankE(VRAM_E_BG_EXT_PALETTE);
 
		} else {	// Paletas de la pantalla 1 (VRAM_H)
 
			vramSetBankH(VRAM_H_LCD);
			address = (0x06898000) + (layer << 13);
			NF_DmaMemCopy((void*)address, NF_BUFFER_BGPAL[slot], NF_TILEDBG[slot].palsize);
			vramSetBankH(VRAM_H_SUB_BG_EXT_PALETTE);
 
		}

Adaptalo a tu gusto.


Nuestra web oficial:
http://www.nightfoxandco.com/
 
Siguenos en facebook:
http://www.facebook.com/pages/NightFox-Co/284338634917917
 
Por favor, no useis los MP para preguntas, usar el FORO:
http://www.nightfoxandco.com/forum/
Asi nos ahorramos de contestar lo mismo 20 veces.

 

Imagen de OdnetninI

gracias, ya he cosneguido

gracias, ya he cosneguido cargar 4 fondos en cada pantalla, y he aprovechado para pasar las direcciones sin el macro, pero va genial. Mañana me pondre con sprites. gracias knightfox.

EDIT:

ya he hecho lo de los sprites, me ha salido a la segunda y encima los puedo duplicar y mover, pero no se como modificar el codigo para poder crear barios sprites, te paso aunque he probado de todo lo que se me ocurria.

/*---------------------------------------------------------------------------------
---------------------------------------------------------------------------------*/
#include <nds.h>
#include <stdio.h>
#include "bolaSprite_bin.h"
#include "bolaPal_bin.h"
//---------------------------------------------------------------------------------
int main(void) {
//---------------------------------------------------------------------------------
	videoSetMode(MODE_0_2D);
	videoSetModeSub(MODE_0_2D);
	REG_DISPCNT |= (DISPLAY_SPR_ACTIVE);
	REG_DISPCNT_SUB |= (DISPLAY_SPR_ACTIVE);
	vramSetBankB(VRAM_B_MAIN_SPRITE_0x06400000);
	vramSetBankD(VRAM_D_SUB_SPRITE);
	vramSetBankF(VRAM_F_LCD);
	vramSetBankI(VRAM_I_LCD);
	oamInit(&oamMain, SpriteMapping_1D_64, true);
	oamInit(&oamSub, SpriteMapping_1D_64, true);
 
	memcpy((void*)0x6400000,bolaSprite_bin, bolaSprite_bin_size);
	memcpy((void*)((0x06890000) + (0 << 9)),bolaPal_bin, bolaPal_bin_size);
 
	memcpy((void*)0x06600000,bolaSprite_bin, bolaSprite_bin_size);
	memcpy((void*)((0x068A0000) + (0 << 9)),bolaPal_bin, bolaPal_bin_size);
 
	vramSetBankF(VRAM_F_SPRITE_EXT_PALETTE);
	vramSetBankI(VRAM_I_SUB_SPRITE_EXT_PALETTE);
 
	oamSet(&oamMain,							// OAM pantalla superior (Main, 0)
					0,			// Numero de Sprite
					5,				// Coordenada X del Sprite
					5,				// Coordenada Y del Sprite
					0,			// Prioridad en las capas
					0,			// Paleta que usaras
					SpriteSize_32x32,			// Tamaño del Sprite (macro)
					SpriteColorFormat_256Color,			// Modo de color (macro)
					0,			// Puntero al grafico usado
					false,			// Valor de la rotacion
					false,		// Usar el "double size" al rotar ?
					false,			// Ocultar el Sprite
					false,			// Volteado Horizontal
					false,			// Volteado Vertical
					false);		// Mosaico
	oamSet(&oamMain,							// OAM pantalla superior (Main, 0)
					1,			// Numero de Sprite
					37,				// Coordenada X del Sprite
					5,				// Coordenada Y del Sprite
					0,			// Prioridad en las capas
					0,			// Paleta que usaras
					SpriteSize_32x32,			// Tamaño del Sprite (macro)
					SpriteColorFormat_256Color,			// Modo de color (macro)
					0,			// Puntero al grafico usado
					false,			// Valor de la rotacion
					false,		// Usar el "double size" al rotar ?
					false,			// Ocultar el Sprite
					false,			// Volteado Horizontal
					false,			// Volteado Vertical
					false);		// Mosaico
	oamSet(&oamSub,							// OAM pantalla superior (Main, 0)
					0,			// Numero de Sprite
					5,				// Coordenada X del Sprite
					5,				// Coordenada Y del Sprite
					0,			// Prioridad en las capas
					0,			// Paleta que usaras
					SpriteSize_32x32,			// Tamaño del Sprite (macro)
					SpriteColorFormat_256Color,			// Modo de color (macro)
					0,			// Puntero al grafico usado
					false,			// Valor de la rotacion
					false,		// Usar el "double size" al rotar ?
					false,			// Ocultar el Sprite
					false,			// Volteado Horizontal
					false,			// Volteado Vertical
					false);		// Mosaico
	oamSet(&oamSub,							// OAM pantalla superior (Main, 0)
					1,			// Numero de Sprite
					37,				// Coordenada X del Sprite
					5,				// Coordenada Y del Sprite
					0,			// Prioridad en las capas
					0,			// Paleta que usaras
					SpriteSize_32x32,			// Tamaño del Sprite (macro)
					SpriteColorFormat_256Color,			// Modo de color (macro)
					0,			// Puntero al grafico usado
					false,			// Valor de la rotacion
					false,		// Usar el "double size" al rotar ?
					false,			// Ocultar el Sprite
					false,			// Volteado Horizontal
					false,			// Volteado Vertical
					false);		// Mosaico
 
	while(1) {
		swiWaitForVBlank();
		oamUpdate(&oamMain);
		oamUpdate(&oamSub);
	}
 
}

gracias por tu esfuerzo

 


Be Libre my Friend.

Imagen de kNightFox

El puntero al grafico usado

El puntero al grafico usado no puede ser 0. Tiene que ser la direccion en VRAM donde has almacenado el grafico para ese sprite.

Imagen de OdnetninI

te refieres a

te refieres a esto?

	oamSet(&oamMain,							// OAM pantalla superior (Main, 0)
					0,			// Numero de Sprite
					5,				// Coordenada X del Sprite
					5,				// Coordenada Y del Sprite
					0,			// Prioridad en las capas
					0,			// Paleta que usaras
					SpriteSize_32x32,			// Tamaño del Sprite (macro)
					SpriteColorFormat_256Color,			// Modo de color (macro)
					(void*)0x6400000,			// Puntero al grafico usado
					false,			// Valor de la rotacion
					false,		// Usar el "double size" al rotar ?
					false,			// Ocultar el Sprite
					false,			// Volteado Horizontal
					false,			// Volteado Vertical
					false);


Be Libre my Friend.

Imagen de kNightFox

exacto, le tienes que indicar

exacto, le tienes que indicar al oam donde esta el grafico de cada sprite en la vram

Imagen de OdnetninI

ok, pero la vram de sprites

ok, pero la vram de sprites tiene 128kbs y no se utilizarla entera, antes los fondos tenian macros determinados, pero para almacenar 128 sprites no se que usar.

EDIT

Ya he conseguid aprender a mover fondos y sprites, pero no como crear sprites diferentes.

ya lo consegui he utilizado el oamAllocateGfx


Be Libre my Friend.

Imagen de kNightFox

Puedes usar el allocate que

Puedes usar el allocate que lleva libnds o gestionarlo tu mismo. Como has dicho tienes 128kb para sprites, donde copies el gfx le da igual, solo se lo tienes que indicar al OAM. En otras palabras, tienes que gestionar tu a mano la VRAM de sprites.


Nuestra web oficial:
http://www.nightfoxandco.com/
 
Siguenos en facebook:
http://www.facebook.com/pages/NightFox-Co/284338634917917
 
Por favor, no useis los MP para preguntas, usar el FORO:
http://www.nightfoxandco.com/forum/
Asi nos ahorramos de contestar lo mismo 20 veces.

 

Imagen de OdnetninI

voy avanzando, he consegudi

voy avanzando, he consegudi hacer scroll a los fondos y mover sprites y animarlos, estoy intentando cargarlos desde nitrofs, ya voy avanzando, aunque una vez que le pillas el trucos libnds es sencillo

garcias por tu ayuda


Be Libre my Friend.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.