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.
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 12:42
carlduke
stupendo! anch'io mi ero messo a sviluppare un framework SDL, con un piccolo motore fisico
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