|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: May 2006
Città: Salerno
Messaggi: 936
|
[Any] 2D Game programming, nudo e crudo
Salve a tutti,
è da un po' che ho lo sfizio di programmarmi un piccolo motore grafico (roba 2d, top-down, niente di che) e farci qualche giochino. Diciamo che il mio obiettivo è qualcosa di questo tipo, per rendere l'idea: ![]() Non sono assolutamente interessato alla grafica avanzata, ai suoni, alla trama, la roba che fa "perdere tempo", insomma; mi interessa soltanto la programmazione che c'è sotto, collision checking, fisica, eventuali moduli che implementerò, magari mantenere il motore e cambiare totalmente il sistema di rendering, così da esercitarmi anche con l'encapsulation, capire come funziona una libreria grafica, i driver grafici, ho sete di conoscenza, insomma. Detto questo, ho sbattuto la testa contro C++/OpenGL per trovarmi davanti una miriade di tutorials o outdated o che saltavano le basi, l'effettiva "inizializzazione" del contesto OGL, per passare direttamente al 3D, allo shading e ai concetti avanzati. La mia idea era di partire col C++ per avere a che fare davvero con lo "scheletro" del game programming, ma sono abbastanza flessibile, e nella mia vita da "casual programmer" ho provato davvero di tutto, e non mi dispiacerebbe imparare qualcosa di nuovo o approfondire qualcosa di cui ho scalfito solo la superficie. Mi scuso per il lungo post e ringrazio in anticipo chiunque mi dedicherà un po' del suo tempo! |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Mi sembri bello deciso a imparare quello che ci sta sotto più che a produrre qualcosa di funzionante.
In tal caso OpenGL o DirectX sono sicuramente gli strumenti che fanno per te. Il C++ già lo sai o lo stai imparando? La situazione della documentazione di OpenGL allo stato attuale non è delle più rosee ... Il Red Book (quello ufficiale attualmente alla settima edizione) finora arriva solo a OpenGL 3.3 (siamo alla 4.2) e il nuovo libro non esce prima di marzo dell'anno prossimo. Inoltre è pieno di spiegazioni su funzioni deprecate senza che sia specificato in maniera chiara cosa è deprecato e cosa no (c'è solo un laconico avviso ad inizio capitolo che alcune delle funzioni contenute nel capitolo sono deprecate), nonostante ciò rimane comunque il miglior strumento su cui studiare allo stato attuale, perchè i vari tutorial come "NeHe" o altri ormai sono veramente vecchissimi. Ce ne sono anche di nuovi (un po' meno completi), che però ti obbligano ad usare gli shaders e per quello che devi fare tu (a meno che non devi applicare dei particolari effetti speciali implementati via fragment shader) è una complicazione abbastanza inutile, anche se però è il futuro della grafica moderna e visto che il tuo scopo è di imparare forse vale la pena fare questo sforzo. Questo tutorial spiega abbastanza bene i concetti base di opengl 3/4 , (per i concetti più avanzati sarà necessario il Red Book): http://www.arcsynthesis.org/gltut/index.html . PS = Ho notato che non spiega granchè riguardo al Blending che potrebbe essere utile in un gioco 2D (il tutorial è ancora in costruzione/espansione), per quello puoi guardare da un altra parte o sul red book
__________________
GPU Compiler Engineer |
|
|
|
|
|
#4 | ||
|
Senior Member
Iscritto dal: May 2006
Città: Salerno
Messaggi: 936
|
Quote:
Per quanto riguarda il Java, non è che magari "wrappa" un po' troppe cose, nascondendomi ciò che in realtà viene fatto? Quote:
Comunque, inizio a dare un'occhiata a questi due tutorial, thanks for the tip! EDIT: ecco, mi sono bloccato dove mi ero bloccato anche ieri: ho gli header gl.h, glu.h e glext.h inclusi di default in MinGW, ma non ho capito come funziona la storia delle library, vengono fornite dal manutentore della gpu? E col makefile, che devo fare? Non c'è una sorta di pre-tutorial? E per quanto riguarda il redbook, è questo? Perchè ci sono 3/4 manuali, tutorial e reference diversi su opengl.org! Ultima modifica di AngeL) : 06-09-2011 alle 09:09. |
||
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Io consiglio XNA
Ho fatto anche io un giochino (ispirato). La corsa dei controller. Prendi 2-4 controller wireless, li piazzi su un lato di un tavolo inclinato abbastanza. Schiacci start, e i controller iniziano a vibrare. Vibrando si muovono perche' il tavolo e' inclinato, e iniziano a scendere. Il primo controller che cade dal tavolo vince. Ovviamente tu intanto prendi le scommesse, fai da allibratore, mentre i tuoi amici sbracciano e incitano il proprio favorito a correre. Alla fine chi vince offre a tutti gli altri una birra.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. Ultima modifica di gugoXX : 06-09-2011 alle 09:21. |
|
|
|
|
|
#6 | ||
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Quote:
OpenGL è una specifica e viene implementata dai vari vendors di hardware grafico che sono principalmente i vari AMD , Nvidia e Intel ... etc. In pratica installi il runtime OpenGL quando installi i drivers grafici che contengono anche l'implementazione opengl. Per quanto riguarda l'SDK ... questo è più problematico. I drivers contengono solo il runtime (la libreria per l' esecuzione dei programmi) , ma non contengono header files per la programmazione. Per quanto riguarda Windows Microsoft ha incluso una propria versione degli headers file OpenGL nel proprio sistema operativo che però arrivano fino a OpenGL 1.2/1.4 e quindi l'utilizzo di ogni funzione non presente in queste versioni di opengl darà un errore. Il modo UFFICIALE per utilizzare le funzioni OpenGL su qualsiasi sistema è quello di richiedere un puntatore alla funzione utilizzando la funzione "wglGetProcAddress()" per Windows , "glXGetProcAddress()" per Unix e "cglGetProcAddress()" per Mac. In pratica si passa il nome della funzione che si vuole a queste funzioni (ad esempio "wglGetProcAddress("glDrawElements") ) e questa ritorna un puntatore a tale funzione che dovrà essere memorizzato in un puntatore a funzione e chiamato attraverso il puntatore. Questo permette di utilizzare tutte le funzioni messe a disposizione dalle varie implementazioni di OpenGL (che non è una, ma sono tante) e che possono esporre solo un subset di tutti i metodi OpenGL o addirittura funzioni in più utilizzando il meccanismo delle estensioni. Da usare in pratica questo metodo è un delirio Quote:
Ti assicuro che non vuoi imparare opengl su quello, visto che si ferma a OpenGL 1.1 ed è FORTEMENTE deprecato L'ultima versione del libro è la settima e l'unico modo legale per averla è comprarla
__________________
GPU Compiler Engineer Ultima modifica di AnonimoVeneziano : 06-09-2011 alle 10:03. |
||
|
|
|
|
|
#7 | ||
|
Senior Member
Iscritto dal: May 2006
Città: Salerno
Messaggi: 936
|
Quote:
Quote:
Oppure, mi sta bene usare glut per gestire la parte os-related delle finestre (serve a questo, giusto?) ma vorrei prima fare a mano la procedura, almeno su windows, per capire cosa succede. Stesso discorso per glew. Grazie mille per la disponibilità e gentilezza! Ultima modifica di AngeL) : 06-09-2011 alle 13:12. |
||
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
ciao , wglGetProcAddress() è definita in wingdi.h che è inclusa a sua volta da windows.h.
Se vuoi gestire il tutto tu allora quello che devi fare è: Per ogni funzione che vuoi chiamare devi creare un puntatore a funzione (possibilmente globale , così lo inizializzi una volta per tutto il programma) e assegnargli il valore ritornato da wglGetProcAddress(). I prototipi di questi puntatori a funzione sono in genere in un file "glext.h" che ti fornisce o la tua implementazione o trovi in giro (ad esempio sul sito di opengl che contiene l'ultima versione con tutti i simboli opengl aggiornati). Devi ottenere con questa funzione solo le funzioni che sono state introdotte con una versione di OpenGL superiore alla 1.1 . Tutte le funzioni OpenGL 1.1 (che è la versione "base" di ogl) sono chiamabili già direttamente . Ogni funzione opengl appartiene a una determinata "estensione" opengl . Se la tua implementazione OpenGL non supporta una certa estensione allora chiamare wglGetProcAddress() per quella funzione ritornerà NULL. Il formato del nome delle funzioni opengl da passare a getprocaddress è "glNomeFunzioneVENDOR_ESTENSIONE" (ad esempio "glGenVertexArraysARB" dove il vendor dell'estensione è l'ARB che indica che è una funzione standard opengl) . Quindi dovresti verificare anche che la tua implementazione supporti alcune estensioni OpenGL che vuoi usare. Le varie versioni di opengl non sono altro che una collezione di estensioni "ufficializzate" dall'ARB opengl. Per sapere se la tua implementazione supporta una certa estensione devi usare la funzione "glGetString(GL_EXTENSIONS)" che ritorna una stringa molto grossa con il nome di tutte le estensioni supportate (glGetString è già inclusa in gl.h e supportata dall'implementazione base di MS, quindi non devi ottenerla tramite wglGetProcAddress) e parsare la stringa per cercare il nome della estensione che ti interessa. Questa cosa ti serve, perchè alcune funzioni sono implementate attraverso estensioni diverse a seconda del vendor e se usi un'implementazione NVidia a getprocaddress dovrai passare un certo nome di funzione, mentre ad una AMD dovrai passare un altro nome (questo perchè cambia la parte finale della stringa, ossia il VENDOR_ESTENSIONE a seconda del vendor). All'inizio tutte le funzioni che chiamerai comunque saranno funzioni standard e quindi con estensione ARB. Quindi in sostanza per inizializzare una funzione che sai essere supportata dalla tua implementazione (nell'esempio "glGenVertexArrays" dell'estensione "GL_ARB_vertex_array_object") : Codice:
#include <GL/gl.h>
#include "glext.h"
...
PFNGLGENVERTEXARRAYSPROC glGenVertexArrays;
...
void init_function()
{
....
glGenVertexArrays = wglGetProcAddress("glGenVertexArraysARB");
....
}
Ciao
__________________
GPU Compiler Engineer Ultima modifica di AnonimoVeneziano : 06-09-2011 alle 13:18. |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: May 2006
Città: Salerno
Messaggi: 936
|
Dunque... sto seguendo principalmente questo tutorial, più roba googlata qua e là.
Ho creato un environment unix-like con msys, e sto impazzendo per capire tutte le dipendenze, cosa si appoggia a cosa... è praticamente impossibile, ma è anche nella mia indole P.S. mica hai idea di qualche progetto a cui posso aggregarmi, qualche community, risorsa da cui prendere spunto, così, per non essere "solo"? E' orribile dialogare con google |
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Quote:
Ti risparmia diversi grattacapi. Per il resto non conosco gruppi del genere, sorry.
__________________
GPU Compiler Engineer |
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: May 2006
Città: Salerno
Messaggi: 936
|
Sto iniziando a pensare che forse, per quello che devo fare, le OpenGL sono troppo potenti. Il fatto di dover creare oggetti in un contesto 3d per poi proiettarli su un "mero" piano 2d mi sembra un po' uno spreco di tutto il calcolo matriciale che c'è dietro... ma in fondo neanche posso mettermi a blittare bitmap, no?
A questo punto, mi conviene creare un piccolo header con funzioni tipo Codice:
Rect(x, y, width, height); Circle(x, y, radius); Ultima modifica di AngeL) : 06-09-2011 alle 21:54. |
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
Si, se vuoi proprio scendere alla base, blittare manualmente tutto a schermo (senza usare la GPU) è sempre un gran esercizio
Le prestazioni saranno ovviamente alcune decine di volte sotto OpenGL, ma forse si impara anche di più Specie se ti dai a vari livelli di parallasse, sprite che ruotano, linee vettoriali, animazioni e trasparenze, che con OpenGL sono gratis, ma a mano devi saperle fare :ahsisi: Poi probabilmente OGL sarà molto più semplice da imparare! |
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: May 2006
Città: Salerno
Messaggi: 936
|
Alla fine mi sono buttato su SDL. Rimane molto più complesso di altri approcci, però sento di star iniziando a capirci qualcosa
Gli unici problemi che sto avendo sono di tipo pratico: se mi conviene definire variabili globali o locali, molti moduli o pochi, classi all-purpose o codice specifico... però credo di dovermi fare le ossa leggendo altro codice, e scrivendone, ovviamente |
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Sep 2009
Messaggi: 638
|
Da quello che hai scritto, io ti consiglierei la libreria Allegro.
È fatta molto bene, bastano poche righe per l'inizializzazione, hai tutte le funzioni per creare forme geometriche e testo (come rect e circle Io la uso sempre in C++ quando ho bisogno di fare roba 2D. SDL e OpenGL (che usate assieme sono veramente una bomba) sono molto potenti, ma anche complesse per un beginner. |
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: May 2006
Città: Salerno
Messaggi: 936
|
Ci avevo già dato (più di) un'occhiata, ma mi sembra un po' troppo basica... con le SDL mi tocca sicuramente scrivere qualche riga di codice in più, però sento di avere più controllo. Sarò sadico...
Comunque ho seguito il classico path: tris, pong e tra oggi e domani inizio l'ennesimo clone di space invaders |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 21:34.























