Diamaxus Inviato 23 marzo Autore Condividi Inviato 23 marzo Ho risolto quel problemino che avevo, quindi tra domani e dopodomani (il tempo di scrivere il prossimo paragrafo) si riprende. Stay tuned! tag: @evilespeon @ZedeFire @VincyDarkHeart @Macca E' stata aggiunta una reazione da Pitima 1 "A ogni nuovo incontro segue sempre un addio. Tuttavia non è detto che debba essere per sempre... Starà a te deciderne la durata..." ~L'allegro venditore di maschere (TLOZ: Majora's Mask) Art Gallery | Instagram | Twitter Link al commento Condividi su altre piattaforme Più opzioni di condivisione...
evilespeon Inviato 23 marzo Condividi Inviato 23 marzo 13 minuti fa, Diamaxus ha scritto: Ho risolto quel problemino che avevo, quindi tra domani e dopodomani (il tempo di scrivere il prossimo paragrafo) si riprende. Stay tuned! tag: @evilespeon @ZedeFire @VincyDarkHeart @Macca Yeeeeee felicissima che hai risolto kohai ottimo dai allora aspetti domani o dopodomani,fa con calma TEAM 0 RULES...J0IN THE P0KECLUB TEAM 0 UNIC0 PREMIO VINTO IN UN GDR FIN ORA...DOVEVO RIMETTERLO XD espon gif by @SlowHandBoy0...ditemi perche si chiama cosi please XD @Alemat è mio rivale e mi frega i pikachu ma ora è contento che è stato citato XD ragalino by @Porygatto (visitate la sua gallery) quanto carino pikachu che imita lotad Sprite by @Vale (visitate la sua gallery) Doll fantastiche fatte da my rival giallo @Alemat espeon compleanno espeon compleanno animata espeon di natale Espeon di natale is finally real XD elfilin super cute from kirby and the forgotten land by @Alemat doll ufficiale (anche se il rival dice di no XD) del mio disegno riolu kart by @Alemat eevee che evolve in espi by my rival @Alemat Evilespeon bossa team0 version gdr (versione icon) by @Silvercenturion Evilespeon bossa team 0 version gdr (versione sprite) by @Silvercenturion il trio politico (io, @Alemat e @Quasar) è qui Sprite by @Alemat tatsugiri di zeria by @Macca zeria e repubblica gialla sushide version,ci vogliamo bene in realtà siamo aleati u.u Lo sguardo sospetto succede solo alcune volte XD quello di repubblica guarda con sospetto lo zeriano per capire che combina coi pikachu e quello zeriano guarda con sospetto quello di repubblica gialla per capire se gli ha fregato dei pikachu per liberarli XD E comunque quello è uno sguardo d'affetto u.u sprite sempre by @Macca Link al commento Condividi su altre piattaforme Più opzioni di condivisione...
Diamaxus Inviato 23 marzo Autore Condividi Inviato 23 marzo 3 minuti fa, evilespeon ha scritto: Yeeeeee felicissima che hai risolto kohai ottimo dai allora aspetti domani o dopodomani,fa con calma Grazie senpai "A ogni nuovo incontro segue sempre un addio. Tuttavia non è detto che debba essere per sempre... Starà a te deciderne la durata..." ~L'allegro venditore di maschere (TLOZ: Majora's Mask) Art Gallery | Instagram | Twitter Link al commento Condividi su altre piattaforme Più opzioni di condivisione...
evilespeon Inviato 23 marzo Condividi Inviato 23 marzo 2 minuti fa, Diamaxus ha scritto: Grazie senpai Di nullaaaa kohai E' stata aggiunta una reazione da Diamaxus 1 TEAM 0 RULES...J0IN THE P0KECLUB TEAM 0 UNIC0 PREMIO VINTO IN UN GDR FIN ORA...DOVEVO RIMETTERLO XD espon gif by @SlowHandBoy0...ditemi perche si chiama cosi please XD @Alemat è mio rivale e mi frega i pikachu ma ora è contento che è stato citato XD ragalino by @Porygatto (visitate la sua gallery) quanto carino pikachu che imita lotad Sprite by @Vale (visitate la sua gallery) Doll fantastiche fatte da my rival giallo @Alemat espeon compleanno espeon compleanno animata espeon di natale Espeon di natale is finally real XD elfilin super cute from kirby and the forgotten land by @Alemat doll ufficiale (anche se il rival dice di no XD) del mio disegno riolu kart by @Alemat eevee che evolve in espi by my rival @Alemat Evilespeon bossa team0 version gdr (versione icon) by @Silvercenturion Evilespeon bossa team 0 version gdr (versione sprite) by @Silvercenturion il trio politico (io, @Alemat e @Quasar) è qui Sprite by @Alemat tatsugiri di zeria by @Macca zeria e repubblica gialla sushide version,ci vogliamo bene in realtà siamo aleati u.u Lo sguardo sospetto succede solo alcune volte XD quello di repubblica guarda con sospetto lo zeriano per capire che combina coi pikachu e quello zeriano guarda con sospetto quello di repubblica gialla per capire se gli ha fregato dei pikachu per liberarli XD E comunque quello è uno sguardo d'affetto u.u sprite sempre by @Macca Link al commento Condividi su altre piattaforme Più opzioni di condivisione...
Diamaxus Inviato 23 marzo Autore Condividi Inviato 23 marzo (modificato) I Tasti Iniziamo a vedere qualcosa di più pratico. Come immagino sapete il GBA ha 10 tasti (A,B, sinistra, destra, su, giù, L, R, Start, Select). Lo stato (premuto, rilasciato) è salvato nei primi 10 bit (da destra) del registro di input REG_KEYINPUT che si trova all’indirizzo 0400:0130h. Controllare se un tasto è stato premuto o meno, sarebbe ovvio se non fosse per un piccolo dettaglio: i bit sono impostati a 0 quando il tasto è premuto e ad 1 quando non è premuto. Quindi il valore di default del registro è 03FF e non 0. Oltre al registro di input dei tasti, ne esiste un’altro praticamente identico al primo detto registro di controllo dei tasti (REG_KEYCNT) che serve a controllare le interrupt hardware (che vedremo più avanti). L’unica differenza rispetto al primo registro è che gli ultimi 2 bit (F ed E) servono a controllare le interrupt. ‘F’ rappresenta un operatore booleano: se è impostato a 0 usa un OR (fa partire l’interrupt se un tasto qualsiasi è stato premuto) altrimenti se impostato a 1 è un AND (fa partire l’interrupt solo se sono premuti tutti i tasti). ‘E’ abilita l’interrupt. Vediamo nella pratica come controllare lo stato dei tasti. Quello che andiamo a fare è leggere lo stato del registro ad esempio all’inizio del frame ed usarlo come riferimento per tutto il frame. Quindi avremo due variabili: una per controllare lo stato attuale, una per salvare lo stato precedente. Ed infine una funzione che le aggiorna. extern u16 __key_curr, __key_prev; #define KEY_MASK 0x03FF inline void key_poll() { __key_prev= __key_curr; __key_curr= ~REG_KEYINPUT & KEY_MASK; } La funzione key_poll inverte i bit del registro in modo che noi consideriamo i tasti premuti quando i bit valgono 1, in questo modo è più intuitivo. Se volete andare più nel dettaglio, vi spiego qui l’operazione che va a fare: Spoiler il registro ha come valore di default 03FF (in esadecimale) ossia 0000001111111111 in binario. L’operatore ~ (NOT) dove trova 1 mette 0 e viceversa quindi ~REG_KEYINPUT diventa 1111110000000000. L’operatore &(AND) dà come risultato 1 quando i due bit sono uguali, 0 altrimenti. Quindi ~REG_KEYINPUT & KEY_MASK dà come risultato: 0000001111111111 & 1111110000000000 = --------------------------- 0000000000000000 in questo modo quando premiamo il tasto, il bit corrispondente diventa 1. Quindi alla fine ci basterà solo controllare lo stato di __key_curr e __key_prev con il tasto che abbiamo premuto. Ad esempio se vogliamo verificare se un tasto viene tenuto premuto per più tempo basta fare: (__key_curr & __key_prev) & key; (verifica che lo stato attuale del tasto è uguale al precedente ed è relativo al tasto che sto premendo). Se vogliamo verificare che il tasto è stato rilasciato: ( __key_prev & ~__key_curr ) & key; (verifica che lo stato precedente del tasto è diverso da quello attuale ed è relativo al tasto che sto rilasciando). E così via, possiamo controllare tutti i casi che vogliamo in questo modo. Per concludere, (per chi vuole vedere il codice) vi faccio vedere il programma che ho fatto, che cambia colore allo schermo finché tengo premuto A. Spoiler il file tasti.h è uguale a quello della volta scorsa, l'unica cosa che ho aggiunto è: #define REG_KEYINPUT *(volatile u16*)0x04000130 #define KEY_A 0x0001 #define KEY_B 0x0002 #define KEY_SELECT 0x0004 #define KEY_START 0x0008 #define KEY_RIGHT 0x0010 #define KEY_LEFT 0x0020 #define KEY_UP 0x0040 #define KEY_DOWN 0x0080 #define KEY_R 0x0100 #define KEY_L 0x0200 #define KEY_MASK 0x03FF #define MAX_KEY 10 // variabili globali. extern u16 __key_curr, __key_prev; // Funzione di controllo dei tasti. // Salva il tasto attualmente premuto nella variabile "tasto prececedente" // il tasto corrente diventa quello letto dal registro. inline void key_poll(void) { __key_prev= __key_curr; __key_curr= ~REG_KEYINPUT & KEY_MASK; } // verifica se un certo tasto è stato tenuto premuto per più tempo. inline u32 key_held(u32 key) { return (__key_curr & __key_prev) & key; } // funzione che inizializza la palette di colori con un solo colore. inline void palette_init(color colore) { for (int i = 0; i < 255; i++) { COLOR_PAL[i] = colore; } } Il file tasti.c invece è questo: #include "tasti.h" // definizione delle variabili globali. u16 __key_curr=0, __key_prev=0; int main(void) { // inizializzo la palette sul nero. color nero = RGB15(0, 0, 0); color verde = RGB15(0, 31, 0); palette_init(nero); u32 btn = KEY_A; // ho deciso di verificare ad es. se sto premendo 'A' int frame = 0; // contatore dei frame. REG_DISPCNT = DCNT_MODE4 | DCNT_BG2; // imposto la modalità 4. while(1) { vsync(); // attendo il vertical sync // attendo 7 frame prima di fargli controllare i tasti, // altrimenti non riusciremmo a vedere che lo schermo cambia colore. if((frame & 7) == 0){ key_poll(); } if (key_held(btn)) { // se tengo premuto 'A' palette_init(verde); // colora lo schermo di verde } else { // altrimenti colora lo schermo di nero palette_init(nero); } frame++; // incrementa di 1 il frame } return 0; } Ho fatto anche una gif per farvi vedere cosa succede: Questo è tutto per oggi. Come sempre se avete dubbi o domande sono a vostra disposizione. La prossima volta iniziamo a vedere le modalità grafiche utili per i giochi. fonte: https://gbadev.net/tonc/keys.html Tag: @evilespeon @ZedeFire @VincyDarkHeart @Macca Modificato 7 aprile da Diamaxus corretto una svista nel codice E' stata aggiunta una reazione da VincyDarkHeart 1 "A ogni nuovo incontro segue sempre un addio. Tuttavia non è detto che debba essere per sempre... Starà a te deciderne la durata..." ~L'allegro venditore di maschere (TLOZ: Majora's Mask) Art Gallery | Instagram | Twitter Link al commento Condividi su altre piattaforme Più opzioni di condivisione...
evilespeon Inviato 23 marzo Condividi Inviato 23 marzo 2 ore fa, Diamaxus ha scritto: I Tasti Iniziamo a vedere qualcosa di più pratico. Come immagino sapete il GBA ha 10 tasti (A,B, sinistra, destra, su, giù, L, R, Start, Select). Lo stato (premuto, rilasciato) è salvato nei primi 10 bit (da destra) del registro di input REG_KEYINPUT che si trova all’indirizzo 0400:0130h. Controllare se un tasto è stato premuto o meno, sarebbe ovvio se non fosse per un piccolo dettaglio: i bit sono impostati a 0 quando il tasto è premuto e ad 1 quando non è premuto. Quindi il valore di default del registro è 03FF e non 0. Oltre al registro di input dei tasti, ne esiste un’altro praticamente identico al primo detto registro di controllo dei tasti (REG_KEYCNT) che serve a controllare le interrupt hardware (che vedremo più avanti). L’unica differenza rispetto al primo registro è che gli ultimi 2 bit (F ed E) servono a controllare le interrupt. ‘F’ rappresenta un operatore booleano: se è impostato a 0 usa un OR (fa partire l’interrupt se un tasto qualsiasi è stato premuto) altrimenti se impostato a 1 è un AND (fa partire l’interrupt solo se sono premuti tutti i tasti). ‘E’ abilita l’interrupt. Vediamo nella pratica come controllare lo stato dei tasti. Quello che andiamo a fare è leggere lo stato del registro ad esempio all’inizio del frame ed usarlo come riferimento per tutto il frame. Quindi avremo due variabili: una per controllare lo stato attuale, una per salvare lo stato precedente. Ed infine una funzione che le aggiorna. extern u16 __key_curr, __key_prev; #define KEY_MASK 0x03FF inline void key_poll() { __key_prev= __key_curr; __key_curr= ~REG_KEYINPUT & KEY_MASK; } La funzione key_poll inverte i bit del registro in modo che noi consideriamo i tasti premuti quando i bit valgono 1, in questo modo è più intuitivo. Se volete andare più nel dettaglio, vi spiego qui l’operazione che va a fare: Apri contenuto nascosto il registro ha come valore di default 03FF (in esadecimale) ossia 0000001111111111 in binario. L’operatore ~ (NOT) dove trova 1 mette 0 e viceversa quindi ~REG_KEYINPUT diventa 1111110000000000. L’operatore &(AND) dà come risultato 1 quando i due bit sono uguali, 0 altrimenti. Quindi ~REG_KEYINPUT & KEY_MASK dà come risultato: 0000001111111111 & 1111110000000000 = --------------------------- 0000000000000000 in questo modo quando premiamo il tasto, il bit corrispondente diventa 1. Quindi alla fine ci basterà solo controllare lo stato di __key_curr e __key_prev con il tasto che abbiamo premuto. Ad esempio se vogliamo verificare se un tasto viene tenuto premuto per più tempo basta fare: (__key_curr & __key_prev) & key; (verifica che lo stato attuale del tasto è uguale al precedente ed è relativo al tasto che sto premendo). Se vogliamo verificare che il tasto è stato rilasciato: ( __key_prev & ~__key_curr ) & key; (verifica che lo stato precedente del tasto è diverso da quello attuale ed è relativo al tasto che sto rilasciando). E così via, possiamo controllare tutti i casi che vogliamo in questo modo. Per concludere, (per chi vuole vedere il codice) vi faccio vedere il programma che ho fatto, che cambia colore allo schermo finché tengo premuto A. Apri contenuto nascosto il file tasti.h è uguale a quello della volta scorsa, l'unica cosa che ho aggiunto è: #define REG_KEYINPUT *(volatile u16*)0x04000130 #define KEY_A 0x0001 #define KEY_B 0x0002 #define KEY_SELECT 0x0004 #define KEY_START 0x0008 #define KEY_RIGHT 0x0010 #define KEY_LEFT 0x0020 #define KEY_UP 0x0040 #define KEY_DOWN 0x0080 #define KEY_R 0x0100 #define KEY_L 0x0200 #define KEY_MASK 0x03FF #define MAX_KEY 10 // variabili globali. extern u16 __key_curr, __key_prev; // Funzione di controllo dei tasti. // Salva il tasto attualmente premuto nella variabile "tasto prececedente" // il tasto corrente diventa quello letto dal registro. inline void key_poll(void) { __key_prev= __key_curr; __key_curr= ~REG_KEYINPUT & KEY_MASK; } // verifica se un certo tasto è stato tenuto premuto per più tempo. inline u32 key_held(u32 key) { return (__key_curr & __key_prev) & key; } // funzione che inizializza la palette di colori con un solo colore. inline void palette_init(color colore) { for (int i = 0; i < 255; i++) { COLOR_PAL[i] = colore; } } Il file tasti.c invece è questo: #include "tasti.h" // definizione delle variabili globali. u16 __key_curr=0, __key_prev=0; int main(void) { // inizializzo la palette sul nero. color nero = RGB15(0, 0, 0); color verde = RGB15(0, 255, 0); palette_init(nero); u32 btn = KEY_A; // ho deciso di verificare ad es. se sto premendo 'A' int frame = 0; // contatore dei frame. REG_DISPCNT = DCNT_MODE4 | DCNT_BG2; // imposto la modalità 4. while(1) { vsync(); // attendo il vertical sync // attendo 7 frame prima di fargli controllare i tasti, // altrimenti non riusciremmo a vedere che lo schermo cambia colore. if((frame & 7) == 0){ key_poll(); } if (key_held(btn)) { // se tengo premuto 'A' palette_init(verde); // colora lo schermo di verde } else { // altrimenti colora lo schermo di nero palette_init(nero); } frame++; // incrementa di 1 il frame } return 0; } Ho fatto anche una gif per farvi vedere cosa succede: Questo è tutto per oggi. Come sempre se avete dubbi o domande sono a vostra disposizione. La prossima volta iniziamo a vedere le modalità grafiche utili per i giochi. fonte: https://www.coranac.com/tonc/text/keys.htm Tag: @evilespeon @ZedeFire @VincyDarkHeart @Macca Ah ah io sapevo tutto fino a qui : Come immagino sapete il GBA ha 10 tasti (A,B, sinistra, destra, su, giù, L, R, Start, Select). XD comunque davvero interessante kohai TEAM 0 RULES...J0IN THE P0KECLUB TEAM 0 UNIC0 PREMIO VINTO IN UN GDR FIN ORA...DOVEVO RIMETTERLO XD espon gif by @SlowHandBoy0...ditemi perche si chiama cosi please XD @Alemat è mio rivale e mi frega i pikachu ma ora è contento che è stato citato XD ragalino by @Porygatto (visitate la sua gallery) quanto carino pikachu che imita lotad Sprite by @Vale (visitate la sua gallery) Doll fantastiche fatte da my rival giallo @Alemat espeon compleanno espeon compleanno animata espeon di natale Espeon di natale is finally real XD elfilin super cute from kirby and the forgotten land by @Alemat doll ufficiale (anche se il rival dice di no XD) del mio disegno riolu kart by @Alemat eevee che evolve in espi by my rival @Alemat Evilespeon bossa team0 version gdr (versione icon) by @Silvercenturion Evilespeon bossa team 0 version gdr (versione sprite) by @Silvercenturion il trio politico (io, @Alemat e @Quasar) è qui Sprite by @Alemat tatsugiri di zeria by @Macca zeria e repubblica gialla sushide version,ci vogliamo bene in realtà siamo aleati u.u Lo sguardo sospetto succede solo alcune volte XD quello di repubblica guarda con sospetto lo zeriano per capire che combina coi pikachu e quello zeriano guarda con sospetto quello di repubblica gialla per capire se gli ha fregato dei pikachu per liberarli XD E comunque quello è uno sguardo d'affetto u.u sprite sempre by @Macca Link al commento Condividi su altre piattaforme Più opzioni di condivisione...
Diamaxus Inviato 23 marzo Autore Condividi Inviato 23 marzo 6 minuti fa, evilespeon ha scritto: Ah ah io sapevo tutto fino a qui : Come immagino sapete il GBA ha 10 tasti (A,B, sinistra, destra, su, giù, L, R, Start, Select). XD comunque davvero interessante kohai Penso un po' tutti senpai XD Grazie "A ogni nuovo incontro segue sempre un addio. Tuttavia non è detto che debba essere per sempre... Starà a te deciderne la durata..." ~L'allegro venditore di maschere (TLOZ: Majora's Mask) Art Gallery | Instagram | Twitter Link al commento Condividi su altre piattaforme Più opzioni di condivisione...
evilespeon Inviato 23 marzo Condividi Inviato 23 marzo 8 minuti fa, Diamaxus ha scritto: Penso un po' tutti senpai XD Grazie Spero di no er tutti XD Di nullaaaaa E' stata aggiunta una reazione da Diamaxus 1 TEAM 0 RULES...J0IN THE P0KECLUB TEAM 0 UNIC0 PREMIO VINTO IN UN GDR FIN ORA...DOVEVO RIMETTERLO XD espon gif by @SlowHandBoy0...ditemi perche si chiama cosi please XD @Alemat è mio rivale e mi frega i pikachu ma ora è contento che è stato citato XD ragalino by @Porygatto (visitate la sua gallery) quanto carino pikachu che imita lotad Sprite by @Vale (visitate la sua gallery) Doll fantastiche fatte da my rival giallo @Alemat espeon compleanno espeon compleanno animata espeon di natale Espeon di natale is finally real XD elfilin super cute from kirby and the forgotten land by @Alemat doll ufficiale (anche se il rival dice di no XD) del mio disegno riolu kart by @Alemat eevee che evolve in espi by my rival @Alemat Evilespeon bossa team0 version gdr (versione icon) by @Silvercenturion Evilespeon bossa team 0 version gdr (versione sprite) by @Silvercenturion il trio politico (io, @Alemat e @Quasar) è qui Sprite by @Alemat tatsugiri di zeria by @Macca zeria e repubblica gialla sushide version,ci vogliamo bene in realtà siamo aleati u.u Lo sguardo sospetto succede solo alcune volte XD quello di repubblica guarda con sospetto lo zeriano per capire che combina coi pikachu e quello zeriano guarda con sospetto quello di repubblica gialla per capire se gli ha fregato dei pikachu per liberarli XD E comunque quello è uno sguardo d'affetto u.u sprite sempre by @Macca Link al commento Condividi su altre piattaforme Più opzioni di condivisione...
Post raccomandati
Crea un account o accedi per commentare
E' necessario essere iscritto a Pokémon Millennium per poter commentare
Crea adesso un account
Registra un nuovo account nella nostro forum. E' semplice!
Crea un nuovo accountAccedi
Hai già un account? Accedi qui!
Accedi adesso