PSX Dev ! Nel 2011 !!

Aperto da Avanaboy, Giugno 05, 2011, 01:49:50

Discussione precedente - Discussione successiva

Avanaboy

Scusa , forse questa domanda è molto stupida : ma è possibile che non si possono dichiarare varibili interne al main ? Ho deciso di iniziare scrivendo un semplicissimo programma ke alla pressione dei tasti del joypad cambia il colore dello schermo , ma se dichiaro varibili interne al main ( tipo int r,g,b; ) vengono ignorate ... è possibile ? ???


PS: per la cronaca cmq sono riuscito a fare questo semplice programmino ;) ( se pensi possa servire a qualcun altro posto il source )

EDIT: sapresti per caso dirmi dopo vengono indicate le keyword del pad scritte in libetc.h ? ad esempio PADLup equivale a freccia su , ma per i tasti X O [] e /\ ? ci sono i,j,k,l,m,n,o,h xo' sono per i tasti L1 L2 ecc... grazie ;)

Gemini

Citazione di: Avanaboy il Giugno 07, 2011, 17:14:14Scusa , forse questa domanda è molto stupida : ma è possibile che non si possono dichiarare varibili interne al main ? Ho deciso di iniziare scrivendo un semplicissimo programma ke alla pressione dei tasti del joypad cambia il colore dello schermo , ma se dichiaro varibili interne al main ( tipo int r,g,b; ) vengono ignorate ... è possibile ? ???
Mi sembra strano. Io ho sempre avuto variabili interne al mio main e non è mai successo nulla. Esempio:
int main()
{
int i;
u8 *seq, *bnk, *tim;
char string[2048];
extern SSEQ_STATUS seq_env;
char voice_status[NUM_SFX_VOICES];

DEBUGPRINT(("--------------------\n"));
//DEBUGPRINT(("Heap position %x, size %d KB\n",(u32)heap_base,(STACK-(long)heap_base)/1024));
DEBUGPRINT(("Heap position %x, size %d KB\n",(u32)heap_base,(STACK-(u32)heap_base)/1024));
InitHeap3((u32*)heap_base,STACK-(u32)heap_base);
InitGfxAlloc(128*1024);

InitSys();

// kernel
FS_Load("SEQ.BIN",ARCHIVE_SYSTEM,SSeqAddress);
tim=(u8*)FS_Load("FONT.TIM",ARCHIVE_DATA,NULL);
LoadTim((long*)tim);
free3(tim);
// sound
menu_vab=SsRmsLoad("07.RMS");
seq=(u8*)FS_Load("07.SEQ",ARCHIVE_DATA,NULL);
bnk=(u8*)FS_Load("07.BNK",ARCHIVE_DATA,NULL);

SSeqOpen(seq,bnk);

while(1)
{
BeginDraw();
//
sprintf(string,"Tempo %d (%d/240)",seq_env.tempo,seq_env.timer);
Print8String((u8*)string,20,20);

SpuGetAllKeysStatus(voice_status);
for(i=0; i<SSEQ_MAX_TRACK; i++)
{
sprintf(string,"Track %02d: %d %x",i,voice_status[i]==SPU_ON ? 1 : 0,seq_env.track[i].voice.sample_note);
Print8String((u8*)string,24,32+i*12);
}
// callback
SSeqPlaying();
//
EndDraw(0,128,128);
}
}


CitazionePS: per la cronaca cmq sono riuscito a fare questo semplice programmino ;) ( se pensi possa servire a qualcun altro posto il source )
Posta posta, male non farà sicuramente.

Citazionesapresti per caso dirmi dopo vengono indicate le keyword del pad scritte in libetc.h ? ad esempio PADLup equivale a freccia su , ma per i tasti X O [] e /\ ? ci sono i,j,k,l,m,n,o,h xo' sono per i tasti L1 L2 ecc... grazie ;)
Libetc ha delle macro che effettivamente fanno schifo. Usa queste definizioni per semplificarti la vita:
#define R2_KEY PAD_FRB
#define L2_KEY PAD_FLB
#define R1_KEY PAD_FRT
#define L1_KEY PAD_FLT
#define TRIANGLE_KEY PAD_RU
#define X_KEY PAD_RD
#define SQUARE_KEY   PAD_RL
#define CIRCLE_KEY   PAD_RR
#define UP_KEY PAD_LU
#define DOWN_KEY PAD_LD
#define LEFT_KEY PAD_LL
#define RIGHT_KEY    PAD_LR
#define SELECT_KEY   PAD_SEL
#define START_KEY PAD_START

Avanaboy

Allora , ecco a voi il codice che cambia il colore dello schermo premendo il tasto X . Magari il codice non è molto buono e ordinato , ma sto imparando ora ad usare queste funzioni , quindi abbiate pietà XD
Non so se postarlo qui o creare un topic apposito a questo e ai sorgenti futuri ... dimmi tu gemini ;)

/* Cambia colore dello schermo premendo il tasto X */
/* Avanaboy 08/06/2011 */

#include <sys/types.h>
#include <libetc.h>
#include <libgte.h>
#include <libgpu.h>


DRAWENV draw;
DISPENV disp;
        int r=0,g=0,b=0;
RECT rect;
u_long padd;

main(){
ResetCallback();
SetVideoMode(MODE_PAL);
ResetGraph(0);
SetGraphDebug(0);
PadInit(0);
SetDispMask(1);
setRECT(&rect, 0, 0, 640, 480 );
ClearImage(&rect, 0, 0, 0);
SetDefDrawEnv(&draw,0,0,640,480);
SetDefDispEnv(&disp,0,0,640,480);
KanjiFntOpen(16,16,640,400,704,0,768,256,0,512);
while(1){
padd = PadRead(1);
if(padd & PADRdown){

r=rand();
g=rand();
b=rand();
ClearImage(&rect, r, g, b);
}

       
        KanjiFntPrint("Premi il tasto X per cambiare colore !\nBy Avanaboy");
        KanjiFntFlush(-1);
        PutDispEnv(&disp);
        PutDrawEnv(&draw);
}
}


Come puoi vedere ho dovuto dichiarare le var fuori , altrimenti psymake mi diceva ad esempio "draw undeclared , first use in this function" , e non riesco a capire il perchè , sicuramente sbaglio qualcosa , ma cosa ?

Ad ogni modo ho provato questo codice su ePSXe e sembra funzionare molto bene ;)

CitazioneLibetc ha delle macro che effettivamente fanno schifo

Eh si , ho capito solo dopo alcune ore che il tasto X era in realtà PADRdown XD :)






Gemini

Sicuro di aver dichiarato le variabili in maniera corretta? Il vecchio standard prevede una dichiarazione formale senza alcun passaggio di valori, che va fatto solo dopo. In pratica il tuo codice sarebbe dovuto essere così:
main()
{
DRAWENV draw;
DISPENV disp;
RECT rect;
u_long padd;
int r=0, g=0, b=0;
...
}

Se non direttamente in quest'altra maniera:
main()
{
DRAWENV draw;
DISPENV disp;
RECT rect;
u_long padd;
int r, g, b;

r=g=b=0;
...
}


Altra cosa: sarebbe meglio evitare funzioni com PadInit e PadRead, come sconsigliato anche nella reference. Non permettono il supporto di svariati tipi di controller, Dual Shock compreso. Se proprio vuoi delle funzioni serie prova control.c, control.h e ctrller.h.

Avanaboy

CitazioneSicuro di aver dichiarato le variabili in maniera corretta?

Ho provato a fare come dici tu , pero' stesso identico errore : "parse error before 'rect' ... rect undeclared first use in this function" :(

Citazionesarebbe meglio evitare funzioni com PadInit e PadRead

Eh si lo avevo letto anche io , pero' ho usato queste perchè le ho capite meglio dato che erano presenti negli esempi ufficiali ... quindi al posto di PadInit , mi consigli InitPad ? fammi sapere , cosi mi studio quelle giuste ;)




Gemini

Sostituisci InitControllers a PadInit e GetPadValue a PadRead;

Avanaboy

CitazioneSostituisci InitControllers a PadInit e GetPadValue a PadRead;

Ma dove si trovano ste funzioni ?  ??? non sono tarttate nella reference  :-\

Gemini

Guarda nel post con gli esempi della main, ho messo i link in fondo.

Avanaboy

Aggiunti ;)

Gemini cmq è molto strano quel fatto delle variabili ...

EDIT : maledizione avevo letto male il tuo messaggio di prima e stavo uscendo pazzo con sto fatto delle varibili !!  :-[ , avevi ragione , l'inizializzazione viene fatta alla fine , in questo modo funziona tutto dichiarato anche dentro il main ;)

PS: vediamo se nel tardo pomeriggio riesco a studiarmi le funzioni necessarie per mettere un'immagine di background ;)

Gemini

La gestione delle immagini è abbastanza rognosa, soprattutto tra caricamenti in VRAM e mappaggio via pagine, sprite e poligoni. Ti aspetta un bel percorso ad ostacoli fatto di smadonnamenti e tanti, tanti tentativi. Attento soprattutto a imparare bene come usare le direttive SPRT e POLY, e quando evitare di usare queste ultime.

Avanaboy

Allora sto gia uscendo un po pazzo con questa parte grafica  ::)
Visto che il caricamento delle immagini  .TIM a quanto ho capito si puo' fare solo da CD ( con le funzioni che mi hai illustrato nella prima pagina ... ) è possibile in qualche modo caricare immagini senza usare la lettura del disco per identificarle ?
ad esempio convertirle in file .h  ... come si potrebbe fare quindi ? ( ne avevamo parlato molto sommariamente prima  )

PS: quando tu mi hai detto che avrei dovuto caricare il file .tim ad un indirizzo della ram , intendevi un indirizzo preciso o uno casuale ( che poi devo specificare nel source ) ?


Gemini

Ti faccio un esempio preso dal mio motore. Questa funzione serve per caricare una TIM da RAM in VRAM:
void LoadTim(long *tim)
{
GsIMAGE image;

GsGetTimInfo((u_long *)tim+1, &image);
LoadImage((RECT*)&image.px, image.pixel);
if(image.pmode&8) LoadImage((RECT*)&image.cx, image.clut);

DrawSync(0);
}

Tu devi passargli solo il puntatore dei dati in RAM, poi il resto lo fa lui.

Ora, quest'altro è un esempio di caricamento da CD di un file TIM:
tim=(u8*)FS_Load("FONT.TIM",ARCHIVE_DATA,NULL);
LoadTim((long*)tim);
free3(tim);

La mia funzione FS_Load carica il file FONT.TIM da un archivio e restituisce un puntatore, quel puntatore lo passi a LoadTim e poi lo liberi con free3 (in FS_Load viene richiamato internamente malloc3, ecco perché serve liberare il puntatore). Dopo questo passaggio la TIM è bella che caricata in VRAM alle coordinate specificate dall'header del file. Se tali coordinate non ti vanno bene, gioca un po' con i parametri di LoadImage.

Se vuoi replicare la stessa cosa con un file .h, lo includi regolarmente e poi passi l'array lì contenuto come parametro per LoadTim.

Avanaboy

mmm , ho bisogno di diverse ore per capire al meglio i tuoi esempi stavolta ;) diciamo che sto iniziando gia da ora a fare tentativi per capirne il funzionamento ;)
ma avendo una immagine .TIM , con che programma la converto in un file .h ? ( ho provato dei programmi tipo bin2h , ma danno risultati sballati !  :o )

PS: cmq gemini ti ringrazio davvero infinitamente ... mi sembra un sogno che inizia a realizzarsi ( dopo innumerevoli tentativi falliti )  ::) :P (ovviamente sono ancora all'inzio inizio eh ..)

Gemini

Io ne uso uno che si chiama WinBin2Src che funziona benissimo, anche se non lo uso granché. Se devo includere risorse binarie di norma vado via script assembly.

Avanaboy

quel programma che mi hai dato tu , restituisce output unsigned char del tipo : "0x2C" , invece nei sorgenti di esempio vedo immagini ( sempre sotto forma di file .h ) con static u_long del tipo "0x54321000" , infatti se compilo i risultati sono errati  :(

Puoi chiarirmi le idee ?  ;)

EDIT: a cosa servono i files descriptors ?