DS [Guida]Creare homebrew per nds

Stato
Discussione chiusa ad ulteriori risposte.

CladTapestry

Utente Emerald
11 Settembre 2009
1,614
66
120
453
Ultima modifica da un moderatore:
Ciao a tutti, ho trovato una guida su internet su come creare homebrew per nds e adesso la posto...
Crediti:Aurelio

Prima di poter programmare abbiamo bisogno dell' ambiente di sviluppo. Per prima cosa scarichiamo il devkitPro updater aggiornato all' ultima versione (da Browse devkitPro Files on SourceForge.net ) e installiamo tutto.Il programma vi chiederà quali pacchetti installare, a noi devkitPPC(gamecube e wii) e devkitPSP(psp) non ci serviranno ma, in caso vi venga da programmarci sopra in futuro, installateli senza problemi.Una volta che avrete scelto i pacchetti da scaricare, andate sempre avanti e aspettate che il programma termini di scaricare ed installare i pacchetti. A processo terminato potrete iniziare a programmare
Per compilare i vostri codici create un file chiamato build.bat, da inserire nella cartella del progetto, con all'interno questo codice:
Codice:
make clean
make
pause
A questo punto vi basterà fare doppio click su questo file e si avvierà la compilazione. A fine compilazione, se non si presenteranno errori, avrete il vostro bel .nds da inserire direttamente nella vostra card.
adesso impareremo a creare il famosissimo, quanto inutile, hello world.
Per prima cosa copiamo la cartella arm9 situata in C:/devkitPro/examples/nds/templates/ e copiamola dove vogliamo dandole il nome del nostro programma. Importante, tutti i progetti dovranno trovarsi in directory che non contengono spazi, per esempio: C:/Documents and settings/aurelio/desktop non va bene, invece C:/devkitPro/progetti va bene. Per mantenere un ordine vi consiglio di crearvi una cartella chiamata progetti e collocarci dentro tutti i vostri progetti.
Bene, detto questo, entrate nella cartella da voi copiata e troveremo una cartella chiamata source, un file chiamato Makefile, e altri due file che sono template.prj e template.pnproj. La prima cartella contiene un file chiamato main.c in cui noi inseriremo il nostro codice, il Makefile contiene tutti i parametri di compilazione(per ora non preoccupiamoci di questo), mentre gli altri sono file di progetto per il Programmer' s notepad. Apriamo il file template.pnproj e, probabilmente, windows vi chiederà di selezionare con che programma aprire il file, quindi noi selezioniamo il Programmer' s notepad che si trova in C:/devkitPro/Programmers notepad/ sotto il nome di pn.exe.
Una volta aperto il file ci ritroveremo di fronte a vari riquadri: a sinistra ci sarà un riquadro con i file di progetto e al centro un riquadro in cui appariranno i file di codice una volta aperti. Dal riquadro a sinistra selezioniamo il menù source e poi apriamo il file main.c. Adesso cancellate tutto il codice presente nel file e sostituitelo col seguente codice seguente.
Codice:
#include <nds.h> //Include la libnds, importante, da inserire sempre
#include <stdio.h> //Include le funzioni standard di input/output
 
int main() //Blocco principale di codice, qui inizia il programma
{ //Inizio main
    videoSetMode(MODE_0_2D); //Imposta il video alla modalità 0 in 2D, ma su questo ci fermeremo dopo
 
    vramSetBankA(VRAM_A_MAIN_BG); //Setta la VRAM_A per lo schermo superiore
    PrintConsole topScreen = *consoleInit(0, 3,BgType_Text4bpp, BgSize_T_256x256, 31, 0, true, true); //Imposta la stampa sullo schermo superiore
    consoleSelect(&topScreen); //Seleziona lo schermo superiore per la stampa
    printf("Hello World!\n"); //Stampa Hello World! e va a capo(\n)
    while(1) //Loop infinito
    { //Inizio while
        swiWaitForVBlank(); //Aspetta l'aggiornamento dello schermo (1/60 di secondo)
    } //Fine while
    return 0; // Ferma il programma
} //Fine main
.

Per impostare la posizione del cursore dobbiamo usare il comando
Codice:
[y;xH
che va inserito in una stringa da stampare col printf anticipata da \x1b, esempio:
Codice:
printf("\x1b[12;5HX=5, Y=12");
che stamperà "X=5, Y=12" nella posizione dello schermo corrispondente. Attenzione, le posizioni non sono rispettive ai pixel dello schermo, ma sono in relazione ad una tabella di 32 colonne e 24 righe con blocchi di 8*8 pixel. La posizione X=0, Y=0 corrisponde all'angolo in alto a sinistra, mentre la posizione x=31,Y=23 corrisponde all'angolo in basso a destra.
Fatta questa premessa, passiamo ad un codice d'esempio:
Codice:
int main() //Blocco principale di codice, qui inizia il programma
{ //Inizio main
   videoSetMode(MODE_0_2D); //Imposta il video alla modalità 0 in 2D, ma su questo ci fermeremo dopo
 
   vramSetBankA(VRAM_A_MAIN_BG); //Setta la VRAM_A per lo schermo superiore
   PrintConsole topScreen = *consoleInit(0, 3,BgType_Text4bpp, BgSize_T_256x256, 31, 0, true, true); //Imposta la stampa sullo schermo superiore
   consoleSelect(&topScreen); //Seleziona lo schermo superiore per la stampa
   printf("\x1b[12;5HX=5,Y=12\n"); //Stampa X=5,Y=12 alla posizione X=5,Y=12 e va a capo(\n)
   while(1) //Loop infinito
   { //Inizio while
      swiWaitForVBlank(); //Aspetta l'aggiornamento dello schermo (1/60 di secondo)
   } //Fine while
   return 0; // Ferma il programma
} //Fine main
Bene, passiamo ora alla stampa su più schermi. Per stampare anche sullo schermo inferiore dovremmo aggiungere
Codice:
videoSetModeSub(MODE_0_2D);
Ultima cosa, quando necessiterete di cancellare tutto il testo da uno schermo(precedentemente selezionato con consoleSelect) vi basterà scrivere
Codice:
consoleClear();
In questa mini-lezione Aurelio vi insegnerà come gestire l'input dal pad e dal touch screen. Ogni frame possiamo ricevere tre informazioni dal pad e dal tocco del touch screen: down, held e up che ci dicono, in ordine, il momento in cui un tasto viene premuto, quando un tasto è tenuto premuto e quando un tasto viene rilasciato.
Gestire gli input è molto facile, all'inizio del ciclo while principale dobbiamo scrivere:
Codice:
scanKeys();
int down = keysDown();
int held = keysHeld();
int up = keysHeld();
in modo da abilitare la lettura dei dati e leggerli.
Per controllare la pressione di un tasto basterà usare un semplice controllo if in questo modo
Codice:
if(down & tasto){
//controlla se il tasto viene premuto in questo frame
}
if(held & help){
//controlla se il tasto è premuto, indipendentemente da quando è stato premuto
}
if(up & tasto){
//controlla se il tasto viene rilasciato in questo frame
}
Al posto di "tasto" dobbiamo scrivere il nome della variabile contenente il valore del tasto. Le variabili disponibili sono le seguenti:
Codice:
KEY_A
KEY_B
KEY_SELECT
KEY_START
KEY_RIGHT
KEY_LEFT
KEY_UP
KEY_DOWN
KEY_R
KEY_L
KEY_X
KEY_Y
KEY_TOUCH
KEY_LID
Ognuno corrisponde al corrispettivo tasto, KEY_TOUCH corrisponde alla pressione dello stilo sul touch screen, KEY_LID, invece, corrisponde alla chiusura della scocca del DS.


Passiamo ora al touch screen.
Anche questa è una cosa molto semplice, basterà dichiarare una variabile di tipo:
Codice:
touchPosition[CODE]
in questo modo:
[CODE]touchPosition touch;
Per leggere i valori dal touchscreen richiameremo la funzione:
Codice:
touchRead(&touch);
all'inizio del ciclo while(1).
La coordinata X la leggeremo semplicemente tramite la variabile:
Codice:
touch.px
La coordinata Y invece:
Codice:
touch.py
Codice di esempio:
Codice:
#include <nds.h> //Include la libnds, importante, da inserire sempre
#include <stdio.h> //Include le funzioni standard di input/output
 
int main() //Blocco principale di codice, qui inizia il programma
{ //Inizio main
   videoSetMode(MODE_0_2D); //Imposta il video alla modalità 0 in 2D, ma su questo ci fermeremo dopo
 
   vramSetBankA(VRAM_A_MAIN_BG); //Setta la VRAM_A per lo schermo superiore
   PrintConsole topScreen = *consoleInit(0, 3,BgType_Text4bpp, BgSize_T_256x256, 31, 0, true, true); //Imposta la stampa sullo schermo superiore
   consoleSelect(&topScreen); //Seleziona lo schermo superiore per la stampa
   printf("Hello World!\n"); //Stampa Hello World! e va a capo(\n)
   touchPosition touch;
   while(1) //Loop infinito
   { //Inizio while
      scanKeys();
      int down = keysDown();
      int held = keysHeld();
      int up = keysHeld();
      touchRead(&touch);
      printf("\x1b[1;0HX=%03d\tY=%03d", touch.px, touch.py); // Stampa le coordinate del touch screen
      swiWaitForVBlank(); //Aspetta l'aggiornamento dello schermo (1/60 di secondo)
   } //Fine while
   return 0; // Ferma il programma
} //Fine main
Ultima cosa(aggiunta da me):
Per favore non copiate come pappagalli questi codici, capiteli e poi copiateli, aiutano molto...
Spero la guida sia utile, commentate:lol:.
 
Penso che si trovi in DevKitProUpdater... però non mi va di scaricarlo xD.... volevo quella libreria solo per studiarmela un po'..
 
Stato
Discussione chiusa ad ulteriori risposte.