:: PlayerAdvance.org ::  

Précédent   :: PlayerAdvance.org :: > :: Développement Amateur :: > Aide au développement

Publicité

Réponse
 
Outils de la discussion Modes d'affichage
Vieux 23/03/2009, 17h16   #1
le_matou
Newbie
 
Date d'inscription: 02/03/2009
Localisation: thiers
Messages: 4
Par défaut Utilisation du background secondaire en 16bits

Salut a tous,
je cherche depuis un moment a accéder au background de l'écran secondaire en mode 16bit pour pouvoir écrire directement dessus mais je doit mal initialiser le mode ou la console car l'écran reste désespérément noir (que ce soit sur l'emulateur ou la cartouche).
Quelqu'un sait comment accéder a ce fichu background ? J'ai testé pas mal de modif mais rien a faire, rien ne se passe... Ah si en remplaçant ptr_bg_second[i]=(uint16)ARGB16(1,6,12,18) par ptr_bg_second[i]=i%1024 dans la deuxième boucle for de la boucle principale, l'écran affiche quelques points clairsemés et réguliers .
Merci d'avance pour l'aide.
le_matou

PS:je vous ai mis le code a la suite pour repérer ce qui déconne.

Code:
include <nds.h>

int main(int argc, char** argv) {
	
   // Definit les modes
   videoSetMode(MODE_5_2D);
   videoSetModeSub(MODE_5_2D | DISPLAY_BG0_ACTIVE);

   // Initialise la console
   consoleDemoInit();
 
   // Definit l'utilisation des banques
   vramSetBankA(VRAM_A_MAIN_SPRITE);
   vramSetBankB(VRAM_B_MAIN_BG_0x06000000);
   vramSetBankC(VRAM_C_SUB_BG_0x06200000);
   vramSetBankD(VRAM_D_SUB_SPRITE);
   
   // --- ECRAN PRINCIPAL --- //
   oamInit(&oamMain, SpriteMapping_Bmp_2D_256, false);
   int bg_princ = bgInit(3, BgType_Bmp16, BgSize_B16_256x256, 0,0);

   // --- ECRAN SECONDAIRE --- //
   oamInit(&oamSub, SpriteMapping_Bmp_2D_256, false);
   int bg_second = bgInitSub(3, BgType_Bmp16, BgSize_B16_256x256, 0,0);
  
   while(1)
   {
	uint16* ptr_bg_princ = (u16*)bgGetGfxPtr(bg_princ);
	for(int i=0; i<256*196;i++)
		ptr_bg_princ[i]=(uint16)ARGB16(1,6,12,18);
		
       uint16* ptr_bg_second = (u16*)bgGetGfxPtr(bg_second);
       for(int i=0; i<256*196;i++)
		ptr_bg_second[i]=(uint16)ARGB16(1,6,12,18);

	//Attente de rafraichissement vertical
	swiWaitForVBlank();
	
        //Affichage
	bgShow(bg_princ);
	bgShow(bg_second);
	
        //updateOAM();
	oamUpdate(&oamMain);
	oamUpdate(&oamSub);
   }
   return 0;
}

Dernière modification par le_matou ; 23/03/2009 à 17h26.
le_matou est déconnecté   Réponse avec citation

Publicité

Vieux 25/03/2009, 00h43   #2
le_matou
Newbie
 
Date d'inscription: 02/03/2009
Localisation: thiers
Messages: 4
Par défaut

Bon alors ça marche pas !
Mais en fouillant on doit sortir de ce merdier...

Etape 1 : Je regarde ce qui fait un peu quelque chose.
ptr_bg_second[i]=(uint16)ARGB16(1,6,12,18) devient ptr_bg_second[i]=i%1024
C'est assez moche a voir mais ça change de l'écran noir.

Etape 2 : Petit a petit je vire tout ce qui sert a rien à l'aide des commentaires.
PS:A chaque fois que je vire un truc, je vérifie qu'il n'y a pas d'écran noir !
Après quelques manips j'arrive au code suivant :
Code:
#include <nds.h>
int main(int argc, char** argv) 
{
   // Definit les modes videos
   videoSetModeSub(MODE_5_2D);
   // Initialise la console
   consoleDemoInit();
   // Definit l'utilisation des banques
   vramSetBankC(VRAM_C_SUB_BG);
   // --- ECRAN SECONDAIRE --- //
   int bg_second = bgInitSub(3, BgType_Bmp16, BgSize_B16_256x256, 0,0);

   while(1)
   {
    	uint16* ptr_bg_second = (u16*)bgGetGfxPtr(bg_second);
    	for(int i=0; i<256*196;i++)
		ptr_bg_second[i]=31;
	swiWaitForVBlank();
	oamUpdate(&oamSub);
	}
}
Bon maintenant c'est pas tout ça mais faut comprendre !
Quelques petits test pour voir...
-si je réduit l'affectation par 2 ça fait un carré plus petit normalement.
Je teste :
for(int i=0; i<256*196;i++) devient for(int i=0; i<256*196/2;i++)
... ça fais quelque chose... pas du tout ce a quoi je m'attend !
En fait le rouge devient gris. C'est toujours ça de pris!
Après test, si on remplace le 2 (de la division) par 96 ou 97 ça change de motif. En dessous c'est le motif de départ, au dessus c'est l'écran noir (souvenir, souvenir...).
En bref c'est le noir complet !
Je doit initialiser la console n'importe comment a mon avis !
Personne sait comment faire ?
C'est peut être pas possible ?
Merci pour vos réponses
le_matou

Dernière modification par le_matou ; 27/03/2009 à 19h24.
le_matou est déconnecté   Réponse avec citation
Vieux 25/03/2009, 04h01   #3
Nesgba
Membre confirmé
 
Date d'inscription: 10/11/2005
Messages: 830
Par défaut

n'oublies pas d'activer le bit 15 quand tu écrit un pixel, sinon la ds ne l'affiche pas

Code PHP:
unsigned short *buff0 ;

//##################################################################################################
//## 
//##################################################################################################
void nds_init(){

irqInit() ;
irqEnable(IRQ_VBLANK) ;

// double buff
videoSetMode(MODE_FB0) ;
vramSetBankA(VRAM_A_LCD) ;
vramSetBankB(VRAM_B_LCD) ;
buff0 VRAM_A ;
}



//##################################################################################################
//## principal
//##################################################################################################
int main(void){
long i,;

nds_init() ;

while(
1) {

// bzzzz
for(i=0i<256*192;i++) {
rand_fast(0,31) ;
buff0[i] = RGB15(j,j,j) | (1<<15) ;
}


// vblank
swiWaitForVBlank() ;

// swap
if(buff0==VRAM_A){
videoSetMode(MODE_FB0) ;
buff0 VRAM_B 
}else{
videoSetMode(MODE_FB1) ;
buff0 VRAM_A 
}


}

return 
;

Nesgba est déconnecté   Réponse avec citation
Vieux 27/03/2009, 00h24   #4
le_matou
Newbie
 
Date d'inscription: 02/03/2009
Localisation: thiers
Messages: 4
Par défaut

Merci Nesgba pour la réponse mais j'ai du mal poser ma question car, si j'ai bien compris, le code que tu me propose c'est un acces en double buffering sur l'écran principal.
Concrètement, ce que je souhaite faire c'est un accès direct sur la mémoire du background de l'écran secondaire.
Je detaille :
VRAM_A (128Ko) : Sprite sur l'écran principal (ça fonctionne)
VRAM_B (128Ko) : Background sur l'écran principal (256*192*2=96Ko. ça fonctionne aussi)
VRAM_C (128Ko) : Background sur l'écran secondaire (idem VRAM_B mais ça marche pas ! )
VRAM_D (128Ko) : Sprite sur l'écran secondaire (ça fonctionne)

Dans mon exemple de test la valeur 31 c'est une valeur que j'ai trouvé un peu au hasard et qui m'évitai l'écran noir (le bit 15 ne doit pas être pris en compte avec mon initialisation... normalement si mais maintenant je doute).
Un acces direct sur le background de l'écran secondaire n'est pas possible a mon avis .
Par contre, peut tu me dire quel fichier tu inclus pour utiliser rand_fast() ?
Merci
le_matou
le_matou est déconnecté   Réponse avec citation
Vieux 17/04/2009, 16h37   #5
le_matou
Newbie
 
Date d'inscription: 02/03/2009
Localisation: thiers
Messages: 4
Par défaut

Salut tout le monde, je reviens peut-être avec une bonne nouvelle . En effet, en cherchant sur le net j'ai enfin trouvé un code qui me permet d'accéder aux 2 backgrounds en 16 bits (je n'y croyais plus). Un peu modifié pour qu'il compile avec ma version de libnds, voici le code en question
Code:
#include "nds.h"
#include "stdio.h"

int main()
{
	// definition des banques
	vramSetMainBanks( VRAM_A_MAIN_BG, VRAM_B_MAIN_SPRITE, VRAM_C_SUB_BG, VRAM_D_SUB_SPRITE );

	// set the mode for 2 text layers and two extended background layers
	videoSetMode(MODE_5_2D | DISPLAY_SPR_ACTIVE | DISPLAY_BG3_ACTIVE );
	videoSetModeSub(MODE_5_2D | DISPLAY_SPR_ACTIVE | DISPLAY_BG3_ACTIVE );

	// Init print consoles
	PrintConsole pcTop = *consoleInit( 0, 1, BgType_Text4bpp, BgSize_T_256x256, 0, 1, true, true );
	PrintConsole pcBtm = *consoleInit( 0, 1, BgType_Text4bpp, BgSize_T_256x256, 0, 1, false, true );

	// set up our top bitmap background
	int bgOffsetTop = 2;
	int bgTop = bgInit( 3, BgType_Bmp16, BgSize_B16_256x256, bgOffsetTop , 0 );
	bgSet( bgTop, 0, 1<<8, 1<<8, 0, 0, 0, 0 );
	bgSetPriority( bgTop, 3 );

	// set up our bottom bitmap background
	int bgOffsetBtm = 2;
	int bgBtm = bgInitSub( 3, BgType_Bmp16, BgSize_B16_256x256, bgOffsetBtm , 0 );
	bgSet( bgBtm, 0, 1<<8, 1<<8, 0, 0, 0, 0 );
	bgSetPriority( bgBtm, 3 );
	
	bgUpdate();

	// Load bitmap to top background
	u16* gfxTopBG = BG_GFX + ((bgOffsetTop * 16384) >> 1);
	for(int i=0; i<256*196;i++)
		gfxTopBG[i]=(uint16)ARGB16(1,6,12,18);

	// Load bitmap to bottom background
	u16* gfxBtmBG = BG_GFX_SUB + ((bgOffsetBtm * 16384) >> 1);
	for(int i=0; i<256*196;i++)
		gfxBtmBG[i]=(uint16)ARGB16(1,18,12,6);

	// Print some text @ top screen
	consoleSelect( &pcTop );
	iprintf( "Top Screen" );

	// Print some text @ bottomscreen
	consoleSelect( &pcBtm );
	iprintf( "Bottom Screen" );
}
Il me reste a verifier si les sprites fonctionne encore (on est jamais à l'abri d'une découverte ) et décortiquer le code mais je pense que je tiens le bon bout.
Je vous tiendrai au courant.
le_matou.
le_matou est déconnecté   Réponse avec citation
Réponse

Liens sociaux

Publicité



Utilisateurs regardant la discussion actuelle : 1 (0 membre(s) et 1 invité(s))
 
Outils de la discussion
Modes d'affichage

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Navigation rapide

Discussions similaires
Discussion Auteur Forum Réponses Dernier message
NDS Décharger un background avec PAlib? Melkior Aide au développement 5 07/07/2007 11h25
NDS Utilisation du G6 Lite 4G Gerad Articles et Tutos 71 26/05/2007 22h41
NDS Background de 512x512 qui dépasse de l'écran Nova Aide au développement 11 14/10/2006 20h38
NDS Problème de background scrollé sensei Aide au développement 11 09/09/2006 10h03
GBA palette 16bits de la GBA Japi Aide au développement 16 14/01/2006 19h11


Fuseau horaire GMT +2. Il est actuellement 21h24.


Édité par : vBulletin® version 3.7.2
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd. Tous droits réservés.
Version française #16 par l'association vBulletin francophone
Design par Ass-Itch, DJP et Dr.Vince