Oppure

Loading
04/03/11 20:17
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: antoniobarba.org/2011/03/04/un-engine-per-domarli-un-engine-per-trovarli-ecc/ )

int main(int argc, char *argv[])
{
	using namespace engine;
	using namespace engine::graphics;
	using namespace engine::platform;

	Platform * myPlatform = new Platform();
	myPlatform->init();

	Display * display = myPlatform->getGraphicsDevice()->getDisplay(0);

	FixedSprite * testSprite = new FixedSprite("data\prova.bmp");
	testSprite->setPosition(Vec2f(30, 30));

	Renderer * myRenderer = new Renderer();

	myRenderer->setDisplay(display);

	Entity2DTree * entityTree = new Entity2DTree(testSprite);

	myRenderer->draw(entityTree);
	myRenderer->update(1.0f);

	myPlatform->getCommon()->delay(1000);

	return 0;
}


Risultato: antoniobarba.org/wp-content/uploads/2011/03/…

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 04/03/11 20:19
aaa
04/03/11 21:02
pierotofy
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: piero.dev
04/03/11 21:23
TheKaneB
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 ;-)
aaa
05/03/11 5:16
pierotofy
:love:

Spero di vedere presto altri demo allora.
Il mio blog: piero.dev
05/03/11 5:47
TheKaneB
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!
aaa
05/03/11 12:42
carlduke
stupendo! anch'io mi ero messo a sviluppare un framework SDL, con un piccolo motore fisico :rotfl:

ecco un piccolo spezzone di codice :

void level0(void){
  f2dBody* plume = new f2dBody(0.002);
  f2dBody* ball = new f2dBody(4);
   
  sprite<f2dBody> *_pPlume = new sprite<f2dBody>(plume);
  _pPlume->load_image("plume.bmp");

  sprite<f2dBody> *_pBall = new sprite<f2dBody>(ball);
  _pBall->load_image("ball.bmp");

 
  f2dGravity *gravity = new f2dGravity(0,4);
  f2dWorld* world = new f2dWorld(gravity,EarthMass,EarthRadius);
  

  world->AddBody(plume);
  world->AddBody(ball);
  world->AddBody(NULL);

  plume->setWidthAndEigth(_pPlume->getImage()->w,_pPlume->getImage()->h);
  ball->setWidthAndEigth(_pBall->getImage()->w,_pPlume->getImage()->h);

  cout<<"Body number -> "<<world->getBodyNumber()<<endl;
  cout<<"Gravity force -> x "<<gravity->getDirection().x<<" y "<<gravity->getDirection().y<<endl;

  getchar();
  cout<<"Press a key to continue...";
  getchar();

  string colour;
  cout<<"Wich colour would you like to set for the background? (black,white,red,green,blue) ";
  cin>>colour;

  framework *engine;

  if(colour == "white")
	engine = new framework(0xFFFFFF);
  else if(colour == "black")
	engine = new framework();
  else if(colour == "red")
	engine = new framework(0xFF0000);
  else if(colour == "green")
    engine = new framework(0x00FF00);
  else 
	engine = new framework(0x0000FF);

  plume->setXY(800,10);
  ball->setXY(200,10);

  
  world->setWidthAndHeigth((meter)engine->getWidth(),(meter)engine->getHeight());
  world->pointerErrorCheck(); //check if some pointer is null, like the third body added to the world

  while(engine->isnt_quitted())
  {
   engine->_mainLoop();
   world->play();
   _pPlume->draw(engine->buf);
   _pBall->draw(engine->buf);
   
  }
  
  engine->quit();

  delete plume,ball,_pPlume,_pBall,engine;
}

void level1(void){
   f2dLevel* level01 = new f2dLevel("level02.xml");
  level01->load();
  level01->play();

  OpenglFramework* engine = new OpenglFramework();

  sprite<f2dBody> *_pBodies = new sprite<f2dBody>[level01->file->instances->f2dBodyNumber];
  for(int i = 0;i < level01->file->instances->f2dBodyNumber; i++){
	_pBodies[i].setGLFrame(true);
	_pBodies[i].setFramework(engine);
    _pBodies[i].load_image("player_alpha.png");
	fe_out<<"Image loaded"<<endl;
	_pBodies[i].setType(level01->file->instances->bodies[i]);
    level01->file->instances->bodies[i]->setWidthAndEigth(_pBodies[i].getImage()->w,_pBodies[i].getImage()->h);
    level01->file->instances->bodies[i]->setWeight(70);
	fe_out<<"Set all"<<endl;
	
  }

  sprite<f2dPlatform> *_pPlatform = new sprite<f2dPlatform>[level01->file->instances->f2dPlatformNumber];
  for(int i = 0;i < level01->file->instances->f2dPlatformNumber; i++){
	_pPlatform[i].setGLFrame(true);
	_pPlatform[i].setFramework(engine);
    _pPlatform[i].load_image("platform_alpha.png");
	_pPlatform[i].setType(level01->file->instances->platforms[i]);
	level01->file->instances->platforms[i]->setFriction(FrictionLow);
    level01->file->instances->platforms[i]->setWidthAndEigth(_pPlatform[i].getImage()->w,_pPlatform[i].getImage()->h);
  }

 

  level01->file->instances->worlds->setWidthAndHeigth((meter)engine->getWidth(),(meter)engine->getHeight());
  level01->file->instances->worlds->pointerErrorCheck();

  while(engine->isnt_quitted()){
   engine->_mainLoop();
   level01->play();
  
   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))
	   level01->file->instances->bodies[0]->rotate(5);

   if(level01->file->instances->bodies[0]->getStopped()){
	   level01->file->instances->platforms[0]->move(1,-1);
   }else{
      if(level01->file->instances->bodies[0]->getY() > level01->file->instances->platforms[0]->getY())
		  level01->file->instances->platforms[0]->move(0,1);
   }
   for(int i = 0;i < level01->file->instances->f2dBodyNumber; i++)
	   _pBodies[i].draw(engine->buf);

   for(int i = 0;i < level01->file->instances->f2dPlatformNumber; i++)
	   _pPlatform[i].draw(engine->buf);

  }
  
  engine->quit();

  delete level01;
  delete engine;
  delete _pBodies;
  delete _pPlatform;
}

(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 06/03/11 9:57
aaa
05/03/11 13:32
TheKaneB
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
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.
aaa
06/03/11 9:55
carlduke
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 :)
aaa