 |
libXM7 Nintendo DS XM replay library
|
View previous topic :: View next topic |
Author |
Message |
drums
Joined: 07 Jun 2010 Posts: 2
|
Posted: Mon Jun 07, 2010 8:06 pm Post subject: alcuni problemi con la guida |
|
|
ciao! complimenti per l' ottima guida!
il problema è che molte cose non le capisco e per me è molto difficile andare avanti...
mi sono fermato a questo listato
Code: | #include <nds.h>
int main(void) {
// impostiamo la memoria video (banco A)
vramSetBankA (VRAM_A_MAIN_BG);
// impostiamo il modo 0 sul MAIN engine e attiviamo il BG 1
videoSetMode (MODE_0_2D | DISPLAY_BG1_ACTIVE);
// creiamo una tessera vuota (32 byte)
u32 TesseraVuota[8] =
{
0x00000000,
0x00000000,
0x00000000,
0x00000000,
0x00000000,
0x00000000,
0x00000000,
0x00000000
};
// creiamo una tessera con un quadratino (32 byte)
u32 TesseraQuadratino[8] =
{
0x11111111,
0x10000001,
0x10000001,
0x10000001,
0x10000001,
0x10000001,
0x10000001,
0x11111111
};
// copiamo le tessera in memoria video (32 byte ognuna)
swiCopy(TesseraVuota, BG_TILE_RAM(1), 32);
swiCopy(TesseraQuadratino, (u8*)BG_TILE_RAM(1) + 32, 32);
// impostiamo la palette ai colori 0=nero, 1=blu intenso
BG_PALETTE [0] = RGB5(0,0,0);
BG_PALETTE [1] = RGB5(0,0,31);
// riempiamo la mappa usando la tessera vuota (è la tessera #0)
int i;
for (i=0;i<32*32;i++)
((u16*)BG_MAP_RAM(0)) [i] = 0;
// mettiamo la tessera con il quadratino (la #1) circa in centro
// allo schermo (15,11)
((u16*)BG_MAP_RAM(0)) [11*32+15] = 1;
// impostiamo il BG 1 al modo tiled 32x32 a 4 bpp
// e indichiamo dove iniziano nella memoria video la mappa e le tessere
REG_BG1CNT = BG_32x32 | BG_COLOR_16 | BG_MAP_BASE(0) | BG_TILE_BASE(1);
// associamo il MAIN engine allo schermo inferiore, il touchscreen
lcdMainOnBottom ();
int down_X=0, down_Y=0;
while(1) {
// leggiamo lo stato dei tasti e del touch screen
scanKeys();
// abbiamo appena toccato il touch screen?
if (keysDown() & KEY_TOUCH) {
// leggi la posizione del pennino
touchPosition touch; touchRead(&touch);
// memorizziamola per vedere dove va a finire
down_X=touch.px;
down_Y=touch.py;
}
// oppure siamo ancora appoggiati sul touch screen?
else if (keysHeld() & KEY_TOUCH) {
// leggi la posizione del pennino
touchPosition touch; touchRead(&touch);
// sposta il BG 1 seguendo il trascinamento
REG_BG1HOFS = down_X - touch.px;
REG_BG1VOFS = down_Y - touch.py;
}
// altrimenti riallinea al centro il quadratino
else {
// sposta il BG 1 "a zero"
REG_BG1HOFS = 0;
REG_BG1VOFS = 0;
}
// aspettiamo il prossimo refresh
swiWaitForVBlank();
}
} |
avevo delle domande...
1 "U32 tessera vuota..." cosa indica U32?
2 perchè i 2 swicopy sono diversi?
3 quando si riempe la mappa della tessere vuota si usa un procedimento che non ho capito bene...
4 alla riga "((u16*)BG_MAP_RAM(0)) [11*32+15] = 1;"
perchè si usa "=1"e perchè si mette (u16).
se mi rispondi ti sono grato a vita ^^ |
|
Back to top |
|
 |
sverx Site Admin

Joined: 04 Jun 2009 Posts: 108
|
Posted: Wed Jun 09, 2010 3:42 pm Post subject: |
|
|
Ciao, benvenuto!
Sì, mi rendo conto che ho dato tante cose per scontate... in particolare presumo che chi legge la guida abbia già una conoscenza di base del C (almeno quella che ho io, che non è un granché, a dire il vero )
Per rispondere alle tue domande: u32 è il tipo unsigned int, però scritto così mi piace di più perché così è chiaro che è un intero senza segno su 32 bit, mentre un unsigned int è in generale un intero senza segno ma la lunghezza dipende dalla word del processore. Che è 32 bit in questo caso ma è diversa in altri casi.
Le due swiCopy sono diverse perchè nella prima copiamo la tessera vuota (grande 32 bytes) all'inizio dello spazio di memoria puntato da BG_TILE_RAM(1) mentre nella seconda copiamo la tessera con il quadratino non più all'inizio dello spazio di memoria puntato da BG_TILE_RAM(1) ma 32 bytes più avanti. Per fare questo dico che BG_TILE_RAM(1) è un puntatore a byte (u8 è un byte senza segno) e gli aggiungo 32 così da puntare al 33° byte. Ti torna?
Per riempire la mappa invece uso BG_MAP_RAM(0) come puntatore ad un array di u16 (halfword) così da poter scrivere una halfword per volta. (Metto 0 in tutti i punti della mappa quindi avrei potuto usare anche un memset() e faceva lo stesso, in questo caso...)
Per l'ultima cosa: metto a 1 perchè scrivo nella mappa che in quel punto (11a riga, 15a colonna) voglio la tessera 1 (invece della tessera 0). E ogni elemento della mappa, come dicevamo, è una halfword senza segno, quindi u16.
spero che sia chiaro abbastanza... |
|
Back to top |
|
 |
drums
Joined: 07 Jun 2010 Posts: 2
|
Posted: Wed Jun 09, 2010 9:16 pm Post subject: |
|
|
ok grazie domani mi metto all' opera.
io conosco abbastanza bene il c++
(ho studiato le basi tramite 2 libri)
però con tutti questi byte e le questioni di memoria non sono molto pratico
 |
|
Back to top |
|
 |
sverx Site Admin

Joined: 04 Jun 2009 Posts: 108
|
Posted: Fri Jun 11, 2010 5:35 pm Post subject: |
|
|
Eh, il C++ è buona cosa, però libnds è in C quindi occhio. In più non è orientato agli oggetti, ovviamente. Infine dato che si lavora molto 'a contatto' con l'hardware devi prendere un po' la mano con i tipi di dati diversi (u8, u16, u32 i principali) le operazioni sui bit e un po' di altre cosette.
Ma poi è una bella soddisfazione veder girare i propri programmi. Molto più che sul PC, personalmente. |
|
Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|