Jump to content
Rpg²S Forum

Keroro

Utenti
  • Posts

    646
  • Joined

  • Last visited

Everything posted by Keroro

  1. auguri jemmmmmmmmmmmmmmmm :**** (sono io il fan numero uno ._.")
  2. Keroro

    Le nostre foto

    Jem creo il fun club perché sei molto carina e ti vorrei come musa ispiratrice (e non solo :O) Ti mando un bacio che spero accetterai :* Costa, io non odio nessuno :), se vuoi aderire sei il benvenuto, niente accomuna di più che la....
  3. :rovatfl: ma che diavolo dici XD Ziel: con i programmi in lua non rischi il brick
  4. carichi una immagine come sprite, crei un oggetto al quale assegni lo sprite come sprite index e posizioni l'oggetto nella room
  5. lua è più facile di ruby ed è 10 volte più veloce ;) avevo fatto qualche prova tempo fa ed sono ancora indeciso se implementare ruby o lua nel mio engine :)
  6. se vuoi la mia opinione sincera: gli screen dicono davvero poco per chi conosce dark basic, finora non hai mostrato la tua abilità ma quella del tool :) sui consigli non saprei che dirti perché conosco/uso opengl mentre darkbasic usa directx e anche gli shader sono diversi :(
  7. psp legge lua, è una cagata scrivere in lua un engine simile all'rpgmaker, potresti programmare così un bel gioco amatoriale ;)
  8. milkshape e il formato ms3d rullano :D il problema dei 3ds è di molti engine, anch'io non saprei come trattare lo scheletro di 3ds
  9. il tempo lo rubo al sonno e allo studio, ma comunque è come se in questo periodo mi si fosse aperta la mente, mi sento John Travolta in Phenomenon... Perché usare ruby? perché non voglio fare un gioco solo ma tanti e diversi ed il modo migliore e più veloce di estendere qualcosa è di usare un linguaggio di scripting che sia accessibile a tutti, senza contare che ricompilare tutto per ogni modifica su windows richiederà un sacco di tempo perché ho intenzione di rendere static un po' di cose per non portarmi appresso 20000 dll.
  10. non c'entra una cippa con rpgmaker xp comunque lo scrivo lo stesso :D, sarei tentato di aprire un altro topic per due motivi: 1° non si possono mettere in rpgxp 2° quando rispondo ad un tutorial non mi danno mai rens anche se dico cose interessanti :__________; ma al diavolo lo scrivo qui perché me l'hai chiesto qui :D COMPENDIO: Creazione di libreria .so (per sistemi *nix) Le librerie .so, anche note come shared object, sono l'alternativa alle dll per le applicazioni linux (uso linux per semplicità e non dover stare a scrivere tutto). Al contrario delle dll però non hanno bisogno di un entry point, ovvero di una funzione come DllMain ma basta mettere le funzioni. Mi sento in vena di cavolate quindi presento la mia funzione h4x3d scritta al momento perché mi sento 1337 hax.c #include <stdio.h> #include <malloc.h> int printh4x(char * stringa){ //strlen int len = 0; char *s = stringa; while (*(s+len++)); //lunghezza incluso 'barra0' if (len<2) return 1; //h4x0r5 char * temp = (char *)malloc(sizeof(char)*len); int i; for (i=0; i< len;i++){ switch (stringa[i]){ case 'a':case 'A': temp[i] = '4'; break; case 's':case 'S': temp[i] = '5'; break; case 'o':case 'O': temp[i] = '0'; break; case 'l':case 'L': temp[i] = '1'; break; case 'e':case 'E': temp[i] = '3'; break; case 'b':case 'B': temp[i] = '8'; break; case 't':case 'T': temp[i] = '7'; break; case 'z':case 'Z': temp[i] = '2'; break; case 'c':case 'C': temp[i] = '{'; break; case 'i': temp[i] = 'I'; break; case 'r': temp[i] = 'R'; break; default: temp[i] = stringa[i]; break; } } temp[i] = '\'; //sarebbe '\ 0' attaccato ma il forum me lo toglie per protezione printf("%s\n",temp); free(temp); return 0; } se non capite questo codice state messi male perché ora richiameremo il .so in un altro programma C e saranno dolori :D Se però volessimo creare una funzione che viene eseguita prima che la dll venga messa a disposizione del programma e dopo essere stata sganciata dovremmo creare funzioni con prefissi questi attributi: void __attribute__ ((constructor)) inizio(void) { } void __attribute__ ((destructor)) fine(void){ } ma questa è un'altra storia... Torniamo IT Compilo il file in hax.so gcc -c -fpic hax.c gcc -shared -o hax.so hax.o spiegazione: -c lo dovreste sapere, si usa solo per compilare senza linkare, genera il . -fpic genera codice a posizione indipendente (richiesto perché la ,so può essere caricata in memoria anche più di una volta ;) -o definisce il nome del file di output, in questo caso hax.so -shared dice a gcc di creare una shared library :) Ora che ho il mio bel .so, come faccio a caricarlo? Per caricarlo in ruby ( non le chiamate di rgss, intendo il creare un'estensione, avete mai visto require 'libreria.so' in cima a qualche prorammino? ) bisogna creare una funzione ausiliaria in c chiamata Init_nomelibreria() e registrare all'interno eventuali classi e metodi, e dare tutto in pasto ad un file .rb creato ad hoc tramite la libreria mkmf che crea (come potete notare dalla sigla) un makefile per compilarci il .so :) fatto quello basta make. Per caricarlo in C ci sono diversi modi, il modo più comodo è quello tramite la libreria dlfcn (che nome del cazzo XD) che contiene all'interno diverse funzioni di interesse: dlopen() chiama l'eventuale costruttore allocando la dll dlsym() permette di estrarre una funzione di cui già conoscevamo (in teoria ;) ) il prototipo dlclose() chiude la dll che sarà deallocata dopo la chiamata all'eventuale distruttore dlerror() restituisce la stringa di errore ci vado leggero con l'error handling riportando solo se non trova la .so, non se non trova la funzione (che se non sbagliamo il prototipo o la versione della lib deve sempre trovare) L'unica difficoltà qui è che si tratta di puntatori a funzione, un argomento molto trascurato in università ma a cui dovrete fare il callo perché capita quasi sempre in applicazioni "importanti" #include <stdio.h> #include <dlfcn.h> int main(int argc,char * argv){ void * dll; int (*print)(char *); //puntatore a funzione che prende come input una stringa e restituisce int dll = dlopen("./hax.so", RTLD_LAZY); if (!dll){ fprintf(stderr,"Errore %s\n",dlerror()); return 1; } print = dlsym(dll,"printh4x"); print("ciao mondo by keroro/cristiano87"); dlclose(dll); return 0; } dllopen restituisce un puntatore che per semplicità ho chiamato dll, il secondo argomento dice di mappare la dll e tutte le sue reference solo su effettiva necessità, altrimenti si può usare RTLD_NOW (se la dll è molto grande e non puntiamo a prestazioni real time meglio essere pigri :) ) è importante la ./ prima del nome per dire di cercare nella stessa CARTELLA (la / da sola non funza), tramite le barre puoi specificare un percorso relativo o assoluto, altrimenti cerca dentro le cartelle standard o guarda in una determinata variabile dell'env dlsym prende due argomenti, l'handle/puntatore della dll caricata e una stringa contente il nome della funzione da caricare, restituisce l'indirizzo della funzione caricata in memoria e per accoglierlo dovremmo aver già creato un puntatore a funzione idoneo (va bene anche ad argomento variabile se non facciamo cappellate di chiamata, ma è più rigoroso e errorfree definire tutto :) ) una volta inizializzato il puntatore possiamo benissimo chiamare la funzione ponendoci due parentesi tonde vicino :) dlclose chiude l'handle Come compilare il tester? basta aggiungere dl alle lib gcc -o tester tester.c -ldlNota: sono due ELLE MINUSCOLE Eseguite ./tester Output (per chi non ha linux XD) {I40 m0nd0 8y k3R0R0/{RI57I4n087 Linuxiani ditemi che ne pensate :D
  11. da quel che mi ricordavo, la patch non è altro che l'applicazione delle differenze tra il programma originale e quello editato quindi se la versione finale ha un eseguibile diverso da quello trial, basta sia più grande o mappato in un modo diverso o packed o con qualche stringa rinominata avete perso la traduzione ;)
  12. il nome è tutto un programma, le aspettative sono tante, mischio tante cose, potrà venir fuori un abominio così come una stupenda creazione Cos'è: Babilonia è un motore 3d crossplatform (ma per ora lo testerò solo per LINUX! sono librerie crossplatform ma mi rompo a compilare su win, sistema che tra l'altro non ho al momento) scritto in C99, rendering in OpenGL, keyboard/mouse input in SDL, caricamento texture in DevIL Obiettivo del motore: realizzare giochi tattici isometrici a telecamera fissa senza la necessità di caricare molti modelli, con tante funzioni prefatte per pathfinding, sistema dei messaggi, menù e movimento via mouse. Tools Ci sarà, spero, un game scene editor, per fare da "mapper3d", solo che per questo avrò bisogno dell'aiuto di persone competenti e esperte nella creazione di GUI, altrimenti si crea con il solito metodo dei file di testo ma ci saranno diversi modelli base che aiuteranno. Sono tuttora indeciso se utilizzare l'xml come formato di memorizzazione delle mappe o usarlo come intermediario ovvero creare una applicazione xml2map per "binarizzare" il tutto. Linguaggio di scripting Per ora sto continuando a scrivere le funzioni di base in C ma ho appena implementato un'interprete (finalmente funziona, sono giorni che mi documento XD) per il linguaggio ruby, non mi resta che creare delle classi di base per permettere al ruby di eseguirle :) (così come fa rpgmaker xp/vx, da questo la pretesa di chiamarlo Tactical Maker VX XD) Status: Supporto keyboard/mouse COMPLETATO Supporto texture COMPLETATO Supporto rendering 5% Devo decidere quali funzioni automatizzare e quali no e come costruire i tiles (se fare un modello o se costruirlo da vertici) Supporto ruby 1% Devo decidere quali funzioni lasciare dentro C e quali mettere dentro ruby, per ora carica un file prima di entrare nel game loop, penso dovrei fare in modo che gli oggetti abbiano dei metodi che vengano eseguiti nel game loop Supporto funzioni di base 5% Devo decidere quanto grandi fare le mappe, se scartare gli rts e quindi non ottimizzare A* A quando i primi screen? Entro fine mese :) Ci saranno shader? Sì, cartoon shading (;Q__) Requisiti minimi Per ora una scheda grafica che supporti 640x480 fullscreen, quanta memoria grafica dipenderà dalle texture usate :) Cercasi Cercasi modellatore 3d per realizzare personaggino/i base low poly (<2000 vertex) per i test, rigorosamente in formato milkshape 3d (ms3d), questo perché così si evitano miriadi di problemi di compatibilità tra offset delle texture e scheletri disallineati Quindi... Come vedete sto ancora all'inizio, c'è tanto da decidere e vorrei le vostre opinioni su TUTTO per dissipare i dubbi, visto che gli utenti finali del prodotto potreste essere anche voi :)
  13. scusate, mi lascia perplesso che senso abbia tradurre una trial ^_^
  14. E così avete una conoscenza universitaria di C ma non sapete ancora bene cosa farvene oltre a stupide applicazioni da console e calcoli matematici. Ma il C nasconde una grande velocità di calcolo e l'accesso in modo semplice a funzioni di sistema, quindi perché non creare una dll da usare con rpgxp o con qualsidiavolo programma si voglia? tutto nasce perché oggi per aiutare un mio amico sono andato a rispolverare una cartella con un backup di dei miei sorgenti C e mi trovo di fronte del codice vecchissimo di una dll che avevo creato per qualcuno per rpgmaker xp! innanzitutto come è formata una dll in windows? è IN TUTTO e PER TUTTO uguale ad un programma normale se non che al posto del main (o del WinMain) c'è questa funzione (in genere viene anche presentato lo scheletro in questo modo :D) #include <windows.h> BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ , DWORD reason /* Reason this function is being called. */ , LPVOID reserved /* Not used. */ ) { switch (reason) { case DLL_PROCESS_ATTACH: break; case DLL_PROCESS_DETACH: break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; } /* Returns TRUE on success, FALSE on failure */ return TRUE; } Così semplice? Sì, così semplice! tutto quello che dovete fare è: mettere il codice che va eseguito nel momento che la dll viene caricata dentro case DLL_PROCESS_ATTACH tutto quello che va eseguito quando la dll viene disallocata con case DLL_PROCESS_DETACH: definire funzioni con un PICCOLO PREFISSO ed un PICCOLO ACCORGIMENTO (dei thread non ce ne occupiamo) il piccolo prefisso è quello di mettere __declspec(dllexport) __cdecl prima del nome della funzione (esistono due modi per esportare funzioni ma solo cdecl funziona :) ) considerando quanto sia error prone scrivere tutti quei __ ho fatto un bel define all'inizio: #define esporta __declspec(dllexport) __cdecl quindi per creare una dll con una funzione stupida con la somma di due numeri mi basta mettere tra il define ed il DllMain esporta int somma(int a,int b){ return a+b; } il piccolo accorgimento è per gli array, se restituisco una stringa ovvero un array di char non posso crearla come variabile automatica nella funzione (ovvero char stringa[dimensione]) perché verrebbe eliminata subito dopo il return (questo vale sia per le dll che per i programmi normali, avete mai provato a restituire una stringa e non funzionava :D?), quindi ci sono due modi: 1° uso una keyword static o una variabile globale 2° alloco dinamicamente l'array che eliminerò in Process DETACH riprendo il codice che avevo scritto con ultima modifica sab 02 dic 2006 01:31:00 CET #define _WIN32_WINNT 0x0501 #include <windows.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #define esporta __declspec(dllexport) __cdecl /*globali*/ HANDLE hFile; WIN32_FIND_DATA fData; esporta char * FindFirst(const char *path){ static char ris[300]; char *a=path; if (!strstr(a,"\\*")) strcat(a,"\\*"); hFile = FindFirstFile(a,&fData); if (hFile==INVALID_HANDLE_VALUE) { strcpy(ris,"*ERRORE*"); }else { if(hFile) strcpy(ris,fData.cFileName); else strcpy(ris,""); } return ris; } esporta char * FindNext(){ static char ris[300]; if (hFile==INVALID_HANDLE_VALUE){ strcpy(ris,""); }else if (!FindNextFile(hFile,&fData)){ FindClose(hFile); strcpy(ris,""); hFile = INVALID_HANDLE_VALUE; }else strcpy(ris,fData.cFileName); return ris; } BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ , DWORD reason /* Reason this function is being called. */ , LPVOID reserved /* Not used. */ ) { switch (reason) { case DLL_PROCESS_ATTACH: hFile = INVALID_HANDLE_VALUE; break; case DLL_PROCESS_DETACH: break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; } /* Returns TRUE on success, FALSE on failure */ return TRUE; } A cosa serve questa dll? A trovare la lista di file fornendo una path sia locale sia assoluta tipo "C:\\Programmi\\Cartella\\*" (ricordo che la \ va raddoppiata per non essere malamente interpretata) o "C:\\Programmi\\Cartella" (il \\* lo aggiungo io) tramite funzioni di sistema. Come vedete ho adottato la soluzione dello static inoltre poiché può esserci più di un file ho organizzato il tutto con più chiamate alla funzione Mi sembra tutto abbastanza elementare, se avete dubbi sulle funzioni basta guardare la msdn :D Una volta fatta la dll e compilata mettendo come tipo di progetto Windows dll (se usate dev c++) o tramite due semplici righe di codice in gcc: gcc -c file.c gcc -shared -o nomedll.dll file.o ora veniamo a noi, come usare le dll in ruby? ma... aveva scritto una bellissima guida tanti mesi fa un certo progm, RIGUARDATEVELA! per i più pigri scrivo come dovrebbe essere usata la dll :) @finder1 = Win32API.new("finder.dll", "FindFirst","P","P") @finder2 = Win32API.new("finder.dll","FindNext","","P") #metodo per chiamata def cerca(percorso) a = @finder1.call("screenshot") #cerca dentro la cartella screenshot if (a[0] == "*") #gestisco l'errore come fossi in ruby e non in RGSS, non saprei come fare print "Errore, Cartella non valida o inesistente\n" return 1 end if (a == "") print "Cartella vuota!" return 0 end print "Elenco file:\n"+a while (a = @finder2.call() && a != "") #non so se in ruby è concesso, io ci provo print a+"\n" end return 0 end #chiamata cerca("screenshot") #mostra la lista dei file la dll è essenziale, potete aggiungerci le funzioni che volete come di ricerca per un determinato tipo di file, ecc... Il tutorial finisce qui, forse sarò stato un po' confusionario perché molte cose o le ignoro o le do per scontato XD se avete bisogno di chiarimenti/puntualizzazioni/segnalazioni errori o volete dare il vostro giudizio non avete che da postare
  15. per imparare ti basta leggere l'msdn di windows e conoscere un po' di C, non hai bisogno di esami di programmazione
  16. andate al diavolo sono per la legalità io se vi foste presi la briga di leggere il sito c'è scritto: Please read the Installation.txt File instructions which Includes the Registration Key. Thankyou.
  17. il programma che ti ho consigliato nell'altro post serve per i tileset non per i titoli :P
  18. in inglese la parola è mystic e non mistic prova a mettere il testo sopra una immagine piuttosto che uno schermo nero
  19. sì anche se sono poco conosciuti: Il più famoso e potente è World Creator Freeware v1.5 Ne stavo creando un clone che aggiungesse delle funzionalità ma ho perso in un format il sorgente e soprattutto le basi grafiche per costruire nuovi tile ._. Se c'è qualcuno interessato allo sviluppo di un tile maker che mi possa ri-trovare dei tile on the net riscrivo il sorcio :)
  20. Sei il benvenuto :D! potresti automatizzare la configurazione leggendo da file diverse alternative già pronte per gli emu più diffusi, o fare input manuale e dare modo di salvare la preferenza. Confido solo in un credit XD
  21. farli interagire è una perdita di tempo visto che rallenterebbe tutto la cosa possibile invece è riscrivere l'engine del mugen in C ed affiancarlo con un engine per gli rpg e mettere come linguaggio di scripting il ruby. Un lavoro enorme che gratuitamente non sono disposto a fare :)
  22. è relativo al fatto che prima mi quoti e poi ti ammorbidisci ritrattando :) @progm: era per flame fondamentalmente, anche perché ho letto di fretta il tuo post e pensavo che fosse rivolto anche a me :) (sono contento che tu mi citi XD)
  23. il timer di lcxcapture è in secondi mentre qui come unità base puoi avere il centesimo di secondo
  24. ziel parli troppo e cambi idea come un ignavo :) Ognuno può avere i propri ideali/obiettivi da raggiungere, l'insieme di valori di cui parli come famiglia casa e lavoro non è oggettivo ma soggettivo, che poi rappresenti l'obiettivo del più degli occidentali di destra è un altro discorso. La mia risposta a Mahun è consona al suo atteggiamento arrogante e le offese da flame e progm le considero gratuite e inopportune :)
×
×
  • Create New...