libXM7 Forum Index libXM7
Nintendo DS XM replay library
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

alcuni problemi con la guida

 
Post new topic   Reply to topic    libXM7 Forum Index -> [TUTORIAL] La grafica 2D del Nintendo DS
View previous topic :: View next topic  
Author Message
drums



Joined: 07 Jun 2010
Posts: 2

PostPosted: Mon Jun 07, 2010 8:06 pm    Post subject: alcuni problemi con la guida Reply with quote

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
View user's profile Send private message
sverx
Site Admin


Joined: 04 Jun 2009
Posts: 108

PostPosted: Wed Jun 09, 2010 3:42 pm    Post subject: Reply with quote

Ciao, benvenuto! Very Happy

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 Wink )

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? Smile

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
View user's profile Send private message Send e-mail
drums



Joined: 07 Jun 2010
Posts: 2

PostPosted: Wed Jun 09, 2010 9:16 pm    Post subject: Reply with quote

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
Very Happy
Back to top
View user's profile Send private message
sverx
Site Admin


Joined: 04 Jun 2009
Posts: 108

PostPosted: Fri Jun 11, 2010 5:35 pm    Post subject: Reply with quote

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
View user's profile Send private message Send e-mail
Display posts from previous:   
Post new topic   Reply to topic    libXM7 Forum Index -> [TUTORIAL] La grafica 2D del Nintendo DS All times are GMT + 1 Hour
Page 1 of 1

 
Jump to:  
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


Powered by phpBB © phpBB Group. Hosted by phpBB.BizHat.com

Free Web Hosting | File Hosting | Photo Gallery | Matrimonial


Powered by PhpBB.BizHat.com, setup your forum now!
For Support, visit Forums.BizHat.com