Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Engine per giochi 2D multipiattaforma
Forum - C/C++ - Engine per giochi 2D multipiattaforma

Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 21:17
Venerdì, 04/03/2011
Piano piano, nel suo tempo libero, il buon Obi-Wan KaneB, tra un Commodore 128 e un Amiga 500 da riparare, con i clienti che lo assillano al telefono perchè non gli funziona il router, i piatti da lavare e i porcellini d'India da strapazzare (ci sta!), si occupa "anche" di scrivere giochi...

Per il momento i lavori fremono sull'Engine, che supporta tutti i sistemi operativi che abbiano le librerie SDL oppure le librerie Qt (e sono parecchi).
I sistemi da me personalmente testati sono Windows, Linux, Symbian S60 5th Ed, Symbian^3, MorphOS.

Scrivere un engine completo è un lavoro molto lungo e in parte noioso, ma ne vale la pena se questo può aiutare a scrivere un gioco ed averlo contemporaneamente su N piattaforme senza modificare una riga di codice!

Esempio (fonte: http://www.antoniobarba.org/2011/03/04/un-engine-per-domar ... )

Codice sorgente - presumibilmente C++

  1. int main(int argc, char *argv[])
  2. {
  3.         using namespace engine;
  4.         using namespace engine::graphics;
  5.         using namespace engine::platform;
  6.  
  7.         Platform * myPlatform = new Platform();
  8.         myPlatform->init();
  9.  
  10.         Display * display = myPlatform->getGraphicsDevice()->getDisplay(0);
  11.  
  12.         FixedSprite * testSprite = new FixedSprite("data\\prova.bmp");
  13.         testSprite->setPosition(Vec2f(30, 30));
  14.  
  15.         Renderer * myRenderer = new Renderer();
  16.  
  17.         myRenderer->setDisplay(display);
  18.  
  19.         Entity2DTree * entityTree = new Entity2DTree(testSprite);
  20.  
  21.         myRenderer->draw(entityTree);
  22.         myRenderer->update(1.0f);
  23.  
  24.         myPlatform->getCommon()->delay(1000);
  25.  
  26.         return 0;
  27. }



Risultato: http://www.antoniobarba.org/wp-content/uploads/2011/03/eng ...

Ora che l'engine supporta le funzioni di base del 2D, inizierò a scrivere una Demo di uno shooter a scorrimento. Per adesso mi tengo sul classico, perchè le prime demo di un engine, di solito, sono quelle che ti aiutano a capire cosa manca ancora nell'engine e in definitiva sono dei test-bench per indirizzare meglio lo sviluppo.

Ultima modifica effettuata da TheKaneB il 04/03/2011 alle 21:19
PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 22:02
Venerdì, 04/03/2011
Come sviluppatore, delle cose che non vorrei fare a meno quando scelgo quale engine 2d usare:

- La presenza di un Particle engine.
- La facile integrazione con un physics engine.
- La possibilita' di impostare diversi layers nelle mie sprites (quale viene visualizzata sopra le altre).
- Le solite animazioni, rotazioni, scale, skew, move, etc. delle 2D.
- Transizioni tra le scene.

Penso il resto sia un extra.


Il mio blog: https://piero.dev
PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 22:23
Venerdì, 04/03/2011
Beh, sono lieto di rincuorarti, dicendoti che il mio Engine, oltre a tutte quelle cose che hai citato, supporta anche lo scripting visuale, animazioni scheletali, animazioni frame-based, un completo sistema di gestione delle scene mediante grafi, gli schermi multipli, le tilemaps con tanto di pathfinding, il batch rendering (per ottimizzare le prestazioni), il parallax scrolling basato su layers (i layers possono essere uno sprite molto grande, una tilemap o addirittura un'intera scena con il suo scenegraph, di conseguenza sono a loro volta animati), ecc... ecc... ecc....


Chiaramente il tutto viene setuppato tramite file XML, anche se per mostrarlo al lavoro ho hardcodato 10 righe per mostrarne un po' il funzionamento, ma in un gioco commerciale i livelli, le scene, gli oggetti di gioco, gli script dell'IA, e TUTTO il resto, vengono trattati in XML tramite dei tools esterni oppure compilati a mano.

Al momento non ho ancora sviluppato i tools esterni, ma questo avverrà nel momento in cui dovrò sviluppare dei giochi commerciali ;-)

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 6:16
Sabato, 05/03/2011
:love:

Spero di vedere presto altri demo allora.


Il mio blog: https://piero.dev
PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 6:47
Sabato, 05/03/2011
Vedrai :-)

Questo è il mio terzo engine 2D (ne ho fatto anche un'altro 3D), e la demo che sto facendo è la undicesima o dodicesima demo (ho perso il conto), di cui 3 sono diventati giochi commerciali. Ci sto mettendo tutto me stesso in questo progetto, e ti posso assicurare che un engine 2D così ben strutturato non l'ho mai visto :love:
Ha un livello di complessità strutturale paragonabile a quello di un engine commerciale di giochi tripla A, ma ho scelto di dedicarmi al solo 2D in questo engine, per una questione di gusti personali più che altro :-)
Ritengo che i migliori giochi per piccoli schermi e piccole potenze di calcolo si possano realizzare solo in 2D, dove lasci lavorare molto la fantasia del giocatore ma non per questo significa che la realizzazione debba essere meno curata!
Basti vedere che perle di giochi 2D ci hanno regalato (e continuano tutt'ora a sfornare) i grandi della Lucas Arts, Nintendo, SEGA, Square Enix e via discorrendo!

PM Quote
Avatar
carlduke (Member)
Pro


Messaggi: 153
Iscritto: 29/01/2011

Segnala al moderatore
Postato alle 13:42
Sabato, 05/03/2011
stupendo! anch'io mi ero messo a sviluppare un framework SDL, con un piccolo motore fisico :rotfl:

ecco un piccolo spezzone di codice :

Codice sorgente - presumibilmente VB.NET

  1. void level0(void){
  2.   f2dBody* plume = new f2dBody(0.002);
  3.   f2dBody* ball = new f2dBody(4);
  4.    
  5.   sprite<f2dBody> *_pPlume = new sprite<f2dBody>(plume);
  6.   _pPlume->load_image("plume.bmp");
  7.  
  8.   sprite<f2dBody> *_pBall = new sprite<f2dBody>(ball);
  9.   _pBall->load_image("ball.bmp");
  10.  
  11.  
  12.   f2dGravity *gravity = new f2dGravity(0,4);
  13.   f2dWorld* world = new f2dWorld(gravity,EarthMass,EarthRadius);
  14.  
  15.  
  16.   world->AddBody(plume);
  17.   world->AddBody(ball);
  18.   world->AddBody(NULL);
  19.  
  20.   plume->setWidthAndEigth(_pPlume->getImage()->w,_pPlume->getImage()->h);
  21.   ball->setWidthAndEigth(_pBall->getImage()->w,_pPlume->getImage()->h);
  22.  
  23.   cout<<"Body number -> "<<world->getBodyNumber()<<endl;
  24.   cout<<"Gravity force -> x "<<gravity->getDirection().x<<" y "<<gravity->getDirection().y<<endl;
  25.  
  26.   getchar();
  27.   cout<<"Press a key to continue...";
  28.   getchar();
  29.  
  30.   string colour;
  31.   cout<<"Wich colour would you like to set for the background? (black,white,red,green,blue) ";
  32.   cin>>colour;
  33.  
  34.   framework *engine;
  35.  
  36.   if(colour == "white")
  37.         engine = new framework(0xFFFFFF);
  38.   else if(colour == "black")
  39.         engine = new framework();
  40.   else if(colour == "red")
  41.         engine = new framework(0xFF0000);
  42.   else if(colour == "green")
  43.     engine = new framework(0x00FF00);
  44.   else
  45.         engine = new framework(0x0000FF);
  46.  
  47.   plume->setXY(800,10);
  48.   ball->setXY(200,10);
  49.  
  50.  
  51.   world->setWidthAndHeigth((meter)engine->getWidth(),(meter)engine->getHeight());
  52.   world->pointerErrorCheck(); //check if some pointer is null, like the third body added to the world
  53.  
  54.   while(engine->isnt_quitted())
  55.   {
  56.    engine->_mainLoop();
  57.    world->play();
  58.    _pPlume->draw(engine->buf);
  59.    _pBall->draw(engine->buf);
  60.    
  61.   }
  62.  
  63.   engine->quit();
  64.  
  65.   delete plume,ball,_pPlume,_pBall,engine;
  66. }
  67.  
  68. void level1(void){
  69.    f2dLevel* level01 = new f2dLevel("level02.xml");
  70.   level01->load();
  71.   level01->play();
  72.  
  73.   OpenglFramework* engine = new OpenglFramework();
  74.  
  75.   sprite<f2dBody> *_pBodies = new sprite<f2dBody>[level01->file->instances->f2dBodyNumber];
  76.   for(int i = 0;i < level01->file->instances->f2dBodyNumber; i++){
  77.         _pBodies[i].setGLFrame(true);
  78.         _pBodies[i].setFramework(engine);
  79.     _pBodies[i].load_image("player_alpha.png");
  80.         fe_out<<"Image loaded"<<endl;
  81.         _pBodies[i].setType(level01->file->instances->bodies[i]);
  82.     level01->file->instances->bodies[i]->setWidthAndEigth(_pBodies[i].getImage()->w,_pBodies[i].getImage()->h);
  83.     level01->file->instances->bodies[i]->setWeight(70);
  84.         fe_out<<"Set all"<<endl;
  85.        
  86.   }
  87.  
  88.   sprite<f2dPlatform> *_pPlatform = new sprite<f2dPlatform>[level01->file->instances->f2dPlatformNumber];
  89.   for(int i = 0;i < level01->file->instances->f2dPlatformNumber; i++){
  90.         _pPlatform[i].setGLFrame(true);
  91.         _pPlatform[i].setFramework(engine);
  92.     _pPlatform[i].load_image("platform_alpha.png");
  93.         _pPlatform[i].setType(level01->file->instances->platforms[i]);
  94.         level01->file->instances->platforms[i]->setFriction(FrictionLow);
  95.     level01->file->instances->platforms[i]->setWidthAndEigth(_pPlatform[i].getImage()->w,_pPlatform[i].getImage()->h);
  96.   }
  97.  
  98.  
  99.  
  100.   level01->file->instances->worlds->setWidthAndHeigth((meter)engine->getWidth(),(meter)engine->getHeight());
  101.   level01->file->instances->worlds->pointerErrorCheck();
  102.  
  103.   while(engine->isnt_quitted()){
  104.    engine->_mainLoop();
  105.    level01->play();
  106.  
  107.    if(level01->file->instances->bodies[0]->getStopped() == false && level01->file->instances->bodies[0]->getY() < (level01->file->instances->worlds->getHeight()-level01->file->instances->bodies[0]->getHeigth()-150))
  108.            level01->file->instances->bodies[0]->rotate(5);
  109.  
  110.    if(level01->file->instances->bodies[0]->getStopped()){
  111.            level01->file->instances->platforms[0]->move(1,-1);
  112.    }else{
  113.       if(level01->file->instances->bodies[0]->getY() > level01->file->instances->platforms[0]->getY())
  114.                   level01->file->instances->platforms[0]->move(0,1);
  115.    }
  116.    for(int i = 0;i < level01->file->instances->f2dBodyNumber; i++)
  117.            _pBodies[i].draw(engine->buf);
  118.  
  119.    for(int i = 0;i < level01->file->instances->f2dPlatformNumber; i++)
  120.            _pPlatform[i].draw(engine->buf);
  121.  
  122.   }
  123.  
  124.   engine->quit();
  125.  
  126.   delete level01;
  127.   delete engine;
  128.   delete _pBodies;
  129.   delete _pPlatform;
  130. }


(ovviamente non è neanche paragonabile al tuo)  

l'unico neo con solamente SDL è che non si possono gestire cose come rotazione..

Perchè non apri un progetto? ovviamente se ti va di pubblicare i sorgenti ;)

Ultima modifica effettuata da carlduke il 06/03/2011 alle 10:57
PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 14:32
Sabato, 05/03/2011
per essere hobbistico non sembra male, considerando il numero di parametri impostabili, anche se avrei qualcosa da ridire sulla coding convention, ma questi son dettagli :)

per ruotare le immagini ci sono le routine di SDL_gfx
http://www.ferzkopp.net/joomla/content/view/19/14/

oppure puoi programmarle da te usando le comunissime formule per le trasformazioni affini, ma se non sei *bravo* ad ottimizzare meglio usare la versione già pronta.

I sorgenti al momento li tengo per me. Sprecare del codice di elevata qualità non mi sembra il caso. Ho lavorato per software house che facevano 300 mila euro l'anno con un engine enormemente più scarso del mio, e non voglio "regalare" la mia fatica al mondo intero prima di essermi in qualche modo ripagato dello sforzo.

Prima venderò dei giochi commerciali, e porterò avanti lo sviluppo. Quando questa versione diventerà obsoleta, probabilmente la rilascerò, come fa la idSoftware che rilascia i sorgenti degli engine di 2-3 generazioni prima, che nel frattempo non sono più tanto appetibili commercialmente parlando.

PM Quote
Avatar
carlduke (Member)
Pro


Messaggi: 153
Iscritto: 29/01/2011

Segnala al moderatore
Postato alle 10:55
Domenica, 06/03/2011
Testo quotato

Postato originariamente da TheKaneB:
I sorgenti al momento li tengo per me. Sprecare del codice di elevata qualità non mi sembra il caso. Ho lavorato per software house che facevano 300 mila euro l'anno con un engine enormemente più scarso del mio, e non voglio "regalare" la mia fatica al mondo intero prima di essermi in qualche modo ripagato dello sforzo.

Prima venderò dei giochi commerciali, e porterò avanti lo sviluppo. Quando questa versione diventerà obsoleta, probabilmente la rilascerò, come fa la idSoftware che rilascia i sorgenti degli engine di 2-3 generazioni prima, che nel frattempo non sono più tanto appetibili commercialmente parlando.



gia, intendevo proprio questo :)

PM Quote
Avatar
marco12 (Normal User)
Newbie


Messaggi: 16
Iscritto: 18/05/2011

Segnala al moderatore
Postato alle 13:26
Sabato, 19/05/2012
Testo quotato

Postato originariamente da TheKaneB:

Piano piano, nel suo tempo libero, il buon Obi-Wan KaneB, tra un Commodore 128 e un Amiga 500 da riparare, con i clienti che lo assillano al telefono perchè non gli funziona il router, i piatti da lavare e i porcellini d'India da strapazzare (ci sta!), si occupa "anche" di scrivere giochi...

Per il momento i lavori fremono sull'Engine, che supporta tutti i sistemi operativi che abbiano le librerie SDL oppure le librerie Qt (e sono parecchi).
I sistemi da me personalmente testati sono Windows, Linux, Symbian S60 5th Ed, Symbian^3, MorphOS.

Scrivere un engine completo è un lavoro molto lungo e in parte noioso, ma ne vale la pena se questo può aiutare a scrivere un gioco ed averlo contemporaneamente su N piattaforme senza modificare una riga di codice!

Esempio (fonte: http://www.antoniobarba.org/2011/03/04/un-engine-per-domar ... )

Codice sorgente - presumibilmente C++

  1. int main(int argc, char *argv[])
  2. {
  3.         using namespace engine;
  4.         using namespace engine::graphics;
  5.         using namespace engine::platform;
  6.  
  7.         Platform * myPlatform = new Platform();
  8.         myPlatform->init();
  9.  
  10.         Display * display = myPlatform->getGraphicsDevice()->getDisplay(0);
  11.  
  12.         FixedSprite * testSprite = new FixedSprite("data\\prova.bmp");
  13.         testSprite->setPosition(Vec2f(30, 30));
  14.  
  15.         Renderer * myRenderer = new Renderer();
  16.  
  17.         myRenderer->setDisplay(display);
  18.  
  19.         Entity2DTree * entityTree = new Entity2DTree(testSprite);
  20.  
  21.         myRenderer->draw(entityTree);
  22.         myRenderer->update(1.0f);
  23.  
  24.         myPlatform->getCommon()->delay(1000);
  25.  
  26.         return 0;
  27. }



Risultato: http://www.antoniobarba.org/wp-content/uploads/2011/03/eng ...

Ora che l'engine supporta le funzioni di base del 2D, inizierò a scrivere una Demo di uno shooter a scorrimento. Per adesso mi tengo sul classico, perchè le prime demo di un engine, di solito, sono quelle che ti aiutano a capire cosa manca ancora nell'engine e in definitiva sono dei test-bench per indirizzare meglio lo sviluppo.




Ciao TheKaneB, volevo dirti se hai qualche documentazione in pdf o qualche link per iniziare a sviluppare qualcosa. Puoi aiutarmi? :) Da dove iniziare? Grazie in anticipo a tutti

PM Quote