Test de mi gameEngine en C++

Todo aquello que no está relacionado con Gemix Studio ni con la programación DIV en general.

Re: gameLibZeroCPP [game engine] open source.

Postby erkosone » Sun Dec 16, 2018 5:07 pm

OskarG wrote:Gracias. por la info.....entonces me espero ....


El sistema de scroll esta ya hecho en raylib, incluso el sistema de 3d con camara jeje...
Creo que si la parienta no me llama para quedar esta tarde dentro de una hora lo tengo ya publicado, esta tirado de añadir, dame un rato haber si lo saco.
User avatar
erkosone
 
Posts: 10654
Joined: Tue Feb 24, 2009 2:13 pm
Location: Barcelona.

Re: gameLibZeroCPP [game engine] open source.

Postby Hokuto7 » Sun Dec 16, 2018 5:51 pm

He visto el video y te comento un par de cositas.

El video esta perfecto pero tiene el mismo problema de siempre,la letra es muy pequeña y no la veo,tienes que saber que tengo un monitor de 19 pulgadas y el ordenador esta a 800x600 de resolucion,para los proximos videos aumenta las letras al triple porfa. :(

De momento lo que he visto de la libreria es mas o menos lo mismo de java exceptuando algunas cosas de c++ pero no tengo ninguna pega que poner,pero tengo una sugerencia,la funcion setFps()
tienes que meterle un segundo parametro para poder restarle frames como en gemix y poder aumentar el rendimiento ejemplo:set_fps(60,1).

Otra sugerencia que ya sabras es la de poner dos parametros a la funcion de musica para aumentar y disminuir el sonido y para que suene una vez o se repita siempre.

Ahora tengo una pregunta,he visto que ponias las variables musics,images etc..Estas variables tienen el mismo nombre que las carpetas del proyecto,esto quiere decir que tengo que poner siempre el tipo images para variables de imagen o el tipo cambia segun el nombre de la carpeta.
User avatar
Hokuto7
 
Posts: 1396
Joined: Mon Aug 28, 2017 10:14 am

Re: Test de mi gameEngine en C++

Postby erkosone » Mon Dec 17, 2018 1:08 am

actualizado al inicio del hilo.
User avatar
erkosone
 
Posts: 10654
Joined: Tue Feb 24, 2009 2:13 pm
Location: Barcelona.

Re: Test de mi gameEngine en C++

Postby erkosone » Tue Dec 18, 2018 12:42 am

Terminado el sistema de scroll 2D, mañana lo publico para el que quiera trastear con el y el video también.
User avatar
erkosone
 
Posts: 10654
Joined: Tue Feb 24, 2009 2:13 pm
Location: Barcelona.

Re: Test de mi gameEngine en C++

Postby erkosone » Tue Dec 18, 2018 1:01 am

Os cuelgo un test ya con el sistema de scroll, a mi me da casi 17 mil procesos, joder la verdad es que me ha costado hacer que esto del scroll sea eficiente, al final he tenido problemas tecnicos con las Z y he tenido que recurrir a los consejos que me comentaste CicTec, sobre hacer varios barridos de la coleccion de procesos y en cada barrido renderizar unos y luego en otros barridos renderizar otros y luego en otro barrido ejecutar el codigo de los procesos, al final he podido dejarlo medio decente, pero tenias razon tio.. tiene tela marinera esto de ordenar todos los procesos en el orden correcto.. y mas cuando unos tienen que pintarse encima de otros pero ejecutarse en otro orden jeje..

Bueno os dejo el test del scroll.. es muy basico, haber cuantos procesos os crea a vosotros, para ser mas real también reproduce un archivo .ogg en stream.. así se tiene una vision mas real de lo que consume una aplicación de este tipo.
El source del programa es este, mañana colgaré todo el entorno actualizado con la nueva versión de la libreria y el video tutorial con la explicación del sistema de camaras y scroll, pero por el codigo vereis que es super sencillo.

Comentar que se puede hacer zoom al scroll y girarlo muy facilmente :)

Source Code (C++) [ Download ] [ Hide ]
  • /*        BASIC SCROLL TEMPLATE           */
  • #include "gameLibZero.cpp"
  •  
  • // Global var block..
  • int st = 0;
  • images img;
  • sounds snd;
  • musics mus;
  • //--------------------------------------------------------------------------------------
  • void setup(){
  •     setMode(640, 400);
  •     //ToggleFullscreen();
  •     setTitle("gameLibZero C++ TUTORIAL 00");
  •     setFps(60);
  •     loadImages("data/images", &img);
  •     loadSounds("data/sounds", &snd);
  •     loadMusics("data/musics", &mus);
  • }
  • //--------------------------------------------------------------------------------------
  • class personaje : public sprite{
  •     public:
  •     void frame(){
  •         //screenDrawText(GetFontDefault(), 22, "Ejemplo scroll", CENTER, 320, 20, WHITE, 255);
  •         if(key(KEY_LEFT)){
  •             addVx(-10);
  •         }
  •         if(key(KEY_RIGHT)){
  •             addVx(10);
  •         }
  •         if(key(KEY_UP)){
  •             addVy(-10);
  •         }
  •         if(key(KEY_DOWN)){
  •             addVy(10);
  •         }
  •     }
  •    
  • };
  • //--------------------------------------------------------------------------------------
  • class cosa : public sprite{
  •     public:
  •     int st = 0;
  •     void frame(){
  •        
  •     }
  •    
  • };
  • //--------------------------------------------------------------------------------------
  • void draw(){
  •     screenDrawText(GetFontDefault(), 22, (int)sprites.size(), RIGHT, 10, 10, WHITE, 255);
  •     switch(st){
  •         case 0:
  •         {
  •             setGravity(0,0);
  •             setDamping(0.4);
  •             setBackgroundColor(BLACK);
  •             playMusic(mus[1]);
  •             st = 10;
  •         }
  •             break;
  •         case 10:
  •         {
  •             // call personaje..
  •             personaje* a = new personaje();
  •             a->graph = img[1];
  •             a->visible = true;
  •             a->x = rand(0, 320);
  •             a->y = rand(0,200);
  •             a->physicsEntityBuild(TYPE_BOX, STONE);
  •             a->scene = true;
  •             a->setCamera((sprite*)a);
  •             a->z = 0;
  •             st = 20;
  •         }
  •             break;
  •         case 20:
  •         {
  •             if(GetFPS() > 58){
  •                 for(int i=0;i<10;i++){                
  •                     // call cosa..
  •                     cosa* b = new cosa();
  •                     b->graph = img[2];
  •                     b->visible = true;
  •                     b->x = rand(0, GetScreenWidth());
  •                     b->y = rand(0, GetScreenHeight());
  •                     b->scene = true;
  •                     b->z = 10;
  •                 }
  •             }
  •            
  •         }
  •             break;
  •         default:
  •             //..
  •             break;
  •     }
  • }



Ahora tengo una pregunta,he visto que ponias las variables musics,images etc..Estas variables tienen el mismo nombre que las carpetas del proyecto,esto quiere decir que tengo que poner siempre el tipo images para variables de imagen o el tipo cambia segun el nombre de la carpeta.

@Hokuto: images sounds y musics son tipos de variable como por ejemplo int float o string, las carpetas pueden llamarse como tu quieras jeje.. solo es cargarlas así:
Source Code (C++) [ Download ] [ Hide ]
  • images myImageArray;
  • loadImages("mi directorio de imagens", &myImageArray);



DESCARGA ACTUALIZADA DEL ENTORNO COMPLETO: https://www.dropbox.com/s/54a7xq9gq0avc ... P.zip?dl=0
You do not have the required permissions to view the files attached to this post.
User avatar
erkosone
 
Posts: 10654
Joined: Tue Feb 24, 2009 2:13 pm
Location: Barcelona.

Re: Test de mi gameEngine en C++

Postby CicTec » Tue Dec 18, 2018 2:30 am

erkosone wrote:Os cuelgo un test ya con el sistema de scroll, a mi me da casi 17 mil procesos, joder la verdad es que me ha costado hacer que esto del scroll sea eficiente, al final he tenido problemas tecnicos con las Z y he tenido que recurrir a los consejos que me comentaste CicTec, sobre hacer varios barridos de la coleccion de procesos y en cada barrido renderizar unos y luego en otros barridos renderizar otros y luego en otro barrido ejecutar el codigo de los procesos, al final he podido dejarlo medio decente, pero tenias razon tio.. tiene tela marinera esto de ordenar todos los procesos en el orden correcto.. y mas cuando unos tienen que pintarse encima de otros pero ejecutarse en otro orden jeje..

Ya te lo habia dicho que te hubiera dado problemas, ahora cual es el codigo del main del gameLibZero.cpp ?
User avatar
CicTec
 
Posts: 16553
Joined: Thu Jul 31, 2008 10:18 pm

Re: Test de mi gameEngine en C++

Postby erkosone » Tue Dec 18, 2018 8:17 am

El tema peliagudo ha sido el scroll..

No he querido montar un sistema propio para aprobechar el sistema de camaras 2d y 3D que ya tiene raylib, pero esto tenia un problema con el sistema de procesos.. si tengo 1000 procesos y algunos se renderizan en scroll y otros no.. tengo que modificar constantemente la matriz de transformaciones en cada llamada al metodo render() de cada proceso, y eso me hacia perder performance a lo bestia..

Con lo cual he preferido hacer algo similar a lo que me comentabas, hacer varias pasadas a la lista de procesos y primero filtrar los que tienen que renderizarse con la matriz de transformaciones lista para la camara2D, luego otra pasada para filtrar los procesos que no usan la matriz modificada por la camara2D.. y por ultimo "y sin ordenar por priority todavia" hago una tercera pasada y lanzo los metodos frame() de todos los procesos..

La cosa es que ya puestos no me cuesta absolutamente nada añadir una llamada a:
Source Code (C++) [ Download ] [ Hide ]
  • // Sort sprites..
  •         stable_sort( sprites.begin( ), sprites.end( ), [ ]( const auto& lhs, const auto& rhs )
  •         {
  •            return lhs->z > rhs->z;
  •         });


Pero usando la propiedad 'priority' en vez de la 'z' y finalmente ejecutar el frame() de los procesos, y así ya tendria lo que tu me comentabas antes.

Este es el codigo por ahora, ya te digo que todavia no lo ordeno por priority antes de lanzar el frame() pero creo que lo añadire.. ya que no pierde apenas rendimiento la llamada al algoritmo stable_sort().

Este es el main():
Source Code (C++) [ Download ] [ Hide ]
  • int main()
  • {
  •     // init sound system..
  •     InitAudioDevice();
  •     //SetMasterVolume(1.0f);
  •     // Initialization physics engine..
  •     cpVect gravity = cpv(0, 100);
  •     // Create an empty space.
  •     space = cpSpaceNew();
  •     cpSpaceSetGravity(space, gravity);
  •    
  •    
  •     // Init mouse body..
  •     mouse.body = cpSpaceAddBody(space, cpBodyNewKinematic());
  •     mouse.shape = cpSpaceAddShape(space, cpCircleShapeNew(mouse.body, 1, cpvzero));
  •     cpShapeSetSensor(mouse.shape, true);
  •    
  •    
  •     // Call game.cpp setup user function..
  •     setup();
  •    
  •     // generate image for draw screen fade..
  •     screenFadeImage = LoadTextureFromImage( GenImageColor(GetScreenWidth(), GetScreenHeight(), screenFadeColor) );
  •    
  •     camera.target = (Vector2){ GetScreenWidth()/2.0f, GetScreenHeight()/2.0f };
  •     camera.offset = (Vector2){ 0, 0 };
  •     camera.rotation = 0.0f;
  •     camera.zoom = 1.0f;
  •    
  •     // Main game loop
  •     while (!WindowShouldClose())    // Detect window close button or ESC key
  •     {
  •        
  •        
  •         int  i=0;
  •         //----------------------------------------------------------------------------------
  •         // Update objects
  •         //----------------------------------------------------------------------------------
  •         // update mouse parameters..
  •         mouse.left = IsMouseButtonDown(MOUSE_LEFT_BUTTON);
  •         mouse.right = IsMouseButtonDown(MOUSE_RIGHT_BUTTON);
  •         mouse.middle = IsMouseButtonDown(MOUSE_MIDDLE_BUTTON);
  •         mouse.pos = GetMousePosition();
  •         mouse.x = mouse.pos.x;
  •         mouse.y = mouse.pos.y;
  •         mouse.wheel = GetMouseWheelMove();
  •         if(mouse.wheel > 0){
  •             mouse.wheelUp = true;
  •         }else if(mouse.wheel < 0){
  •             mouse.wheelDown = true;
  •         }
  •        
  •         cpBodySetPosition(mouse.body, cpv(mouse.x, mouse.y));
  •        
  •        
  •         // Sort sprites..
  •         stable_sort( sprites.begin( ), sprites.end( ), [ ]( const auto& lhs, const auto& rhs )
  •         {
  •            return lhs->z > rhs->z;
  •         });
  •        
  •        
  •         //----------------------------------------------------------------------------------
  •         // Draw objects
  •         //----------------------------------------------------------------------------------
  •         BeginDrawing();
  •                    
  •                     ClearBackground(_BK_COLOR_);
  •                     draw();                     // main game code call..
  •                    
  •                     if(_music_play_){
  •                         UpdateMusicStream(_music_play_id_);        // Update music buffer with new stream data
  •                     }
  •                    
  •                     // ejecutar codigo de los sprites/procesos..
  •                     for(auto s : sprites){
  •                         s->frame();
  •                     }
  •                    
  •                     if(_camera_id_){
  •                         camera.offset.x = GetScreenWidth()/2 - _camera_id_->x;
  •                         camera.offset.y = GetScreenHeight()/2 - _camera_id_->y;
  •                         camera.target.x = _camera_id_->x;
  •                         camera.target.y = _camera_id_->y;
  •                     }
  •                    
  •                     // renderizar sprites que estan en la escena 2d.. "scroll"..
  •                     BeginMode2D(camera);
  •                     for(auto s : sprites){
  •                         if(s->scene){
  •                             s->render();
  •                         }
  •                     }
  •                     EndMode2D();
  •                    
  •                     // renderizar sprites relativos a la pantalla "no scroll"..
  •                     for(auto s : sprites){
  •                         if(!s->scene){
  •                             s->render();
  •                         }
  •                     }
  •                    
  •                    
  •                     if (fading) {
  •                         if (fadingType == -1) {
  •                             if (alphaFading < 1.0f) {
  •                                 alphaFading += deltaFading;
  •                             } else {
  •                                 deltaFading = 0;
  •                                 alphaFading = 1.0f;
  •                                 fading = false;
  •                                 fadingType = 0;
  •                             }
  •                         } else if (fadingType == 1) {
  •                             if (alphaFading > 0.0f) {
  •                                 alphaFading -= deltaFading;
  •                             } else {
  •                                 deltaFading = 0;
  •                                 alphaFading = 0.0f;
  •                                 fading = false;
  •                                 fadingType = 0;
  •                             }
  •                         }
  •                     }
  •                     if(alphaFading < 1.0f){
  •                         DrawRectangle(0, 0, GetScreenWidth(), GetScreenHeight(), Fade(BLACK, 1.0f-alphaFading));
  •                     }
  •        
  •            
  •         EndDrawing();
  •         //----------------------------------------------------------------------------------
  •         //----------------------------------------------------------------------------------
  •        
  •        
  •         // Reset mouse flags..
  •         mouse.wheelUp = false;
  •         mouse.wheelDown = false;
  •        
  •        
  •         int itr=0;
  •         for(auto s : sprites){
  •             if(!s->live){
  •                 if(s->liveFrames>1){
  •                     cpSpaceRemoveShape(space, s->shape);
  •                     cpShapeDestroy(s->shape);
  •                     cpShapeFree(s->shape);
  •                     cpSpaceRemoveBody(space, s->body);
  •                     cpBodyDestroy(s->body);
  •                     cpBodyFree(s->body);
  •                     sprites.erase(sprites.begin()+itr);
  •                 }
  •             }
  •             itr++;
  •         }
  •        
  •         // Update all world & bodies..
  •         cpSpaceStep(space, timeStep);
  •        
  •     }
  •  
  •     // De-Initialization
  •     //--------------------------------------------------------------------------------------  
  •     CloseWindow();        // Close window and OpenGL context
  •     //--------------------------------------------------------------------------------------
  •  
  •     return 0;
  • }
User avatar
erkosone
 
Posts: 10654
Joined: Tue Feb 24, 2009 2:13 pm
Location: Barcelona.

Re: Test de mi gameEngine en C++

Postby CicTec » Tue Dec 18, 2018 10:33 am

No se BeginDrawing y Begin2DMode que hacen internamente, pero el sistema sigue no siendo correcto, te falta una gestion de senales, de priority (ya lo dijiste) y ordenacion correcta de ejecucion, deberia ser asi:
Source Code (C++ (QT)) [ Download ] [ Hide ]
  •         int itr=0;
  •         for(auto s : sprites){
  •             if(!s->live){
  •                 //if(s->liveFrames>1){
  •                     cpSpaceRemoveShape(space, s->shape);
  •                     cpShapeDestroy(s->shape);
  •                     cpShapeFree(s->shape);
  •                     cpSpaceRemoveBody(space, s->body);
  •                     cpBodyDestroy(s->body);
  •                     cpBodyFree(s->body);
  •                // }
  •  
  •                 // aqui se debe destruir la clase sprite que representa el proceso...
  •                  sprites.erase(sprites.begin()+itr);
  •             }
  •             itr++;
  •         }
  •        
  •         // Update all world & bodies..
  •         cpSpaceStep(space, timeStep);
  •  
  •         ....
  •  
  •         // aqui se ordenan los procesos por priority...
  •         // Sort sprites..
  •         stable_sort( sprites.begin( ), sprites.end( ), [ ]( const auto& lhs, const auto& rhs )
  •         {
  •            return lhs->priority > rhs->priority;
  •         });
  •      
  •         // ejecutar codigo de los sprites/procesos..
  •         for(auto s : sprites){
  •            s->frame();
  •         }
  •        
  •         //----------------------------------------------------------------------------------
  •         // Draw objects
  •         //----------------------------------------------------------------------------------
  •         BeginDrawing();
  •                    
  •                     ClearBackground(_BK_COLOR_);
  •                     draw();                     // main game code call..
  •                    
  •                     if(_music_play_){
  •                         UpdateMusicStream(_music_play_id_);        // Update music buffer with new stream data
  •                     }
  •                                      
  •                    aqui se ordenan los procesos por Z (rendering)
  •                    // Sort sprites..
  •                    stable_sort( sprites.begin( ), sprites.end( ), [ ]( const auto& lhs, const auto& rhs )
  •                    {
  •                      return lhs->z > rhs->z;
  •                    });
  •  
  •                     if(_camera_id_){
  •                         camera.offset.x = GetScreenWidth()/2 - _camera_id_->x;
  •                         camera.offset.y = GetScreenHeight()/2 - _camera_id_->y;
  •                         camera.target.x = _camera_id_->x;
  •                         camera.target.y = _camera_id_->y;
  •                     }
  •                    
  •                     // renderizar sprites que estan en la escena 2d.. "scroll".. y relativos a pantalla "no scroll"
  •                     BeginMode2D(camera);
  •                     for(auto s : sprites){
  •                         s->render();
  •                     }
  •                     EndMode2D();
  •                                                          
  •                     if (fading) {
  •                         if (fadingType == -1) {
  •                             if (alphaFading < 1.0f) {
  •                                 alphaFading += deltaFading;
  •                             } else {
  •                                 deltaFading = 0;
  •                                 alphaFading = 1.0f;
  •                                 fading = false;
  •                                 fadingType = 0;
  •                             }
  •                         } else if (fadingType == 1) {
  •                             if (alphaFading > 0.0f) {
  •                                 alphaFading -= deltaFading;
  •                             } else {
  •                                 deltaFading = 0;
  •                                 alphaFading = 0.0f;
  •                                 fading = false;
  •                                 fadingType = 0;
  •                             }
  •                         }
  •                     }
  •                     if(alphaFading < 1.0f){
  •                         DrawRectangle(0, 0, GetScreenWidth(), GetScreenHeight(), Fade(BLACK, 1.0f-alphaFading));
  •                     }
  •        
  •            
  •         EndDrawing();  
  •  

Si lo que hay en BeginDrawing y Begin2DMode no crea conflicto eso deberia ser el orden correcto, ahi solo te falta la gestion de los otros senales fuera de S_KILL.

La priority funciona un poco distinta al DIV original, pero es tolerable ya que el sistema de ordenacion de priority di DIV para tener un estado de cambio realtime es muy muy lento y no compensaria.
User avatar
CicTec
 
Posts: 16553
Joined: Thu Jul 31, 2008 10:18 pm

Re: Test de mi gameEngine en C++

Postby Hokuto7 » Tue Dec 18, 2018 12:19 pm

Despues pruebo el test.

Una pregunta,como hago para pasar de string a int o float y viceversa,te lo comento porque no se como hacer para poner un numero en la funcion esta:

screenDrawText(GetFontDefault(),23,"puntos:"+puntos,CENTER,320,32,RED,255);
User avatar
Hokuto7
 
Posts: 1396
Joined: Mon Aug 28, 2017 10:14 am

Re: Test de mi gameEngine en C++

Postby erkosone » Tue Dec 18, 2018 1:33 pm

en c++ no puedes sumar cadenas tan facimente jeje.. luego miro de hacer alguna implementacion con strings, por ahora imprime costant char int float y bool, luego miro como sumar cadenas y lo meto
User avatar
erkosone
 
Posts: 10654
Joined: Tue Feb 24, 2009 2:13 pm
Location: Barcelona.

PreviousNext

Return to Offtopic

Who is online

Users browsing this forum: No registered users and 17 guests