Hi everybody,
After my first game and story, it is time to start the new one with more experience this time.
The primary goal is to avoid the same mistakes, so I will start to talk about it now. It is not the very beginning as I already have 11000 lines of codes. From Soul of Mask experiences, I learn that I should talk about my game as soon as possible. So I will introduce the new game to my two favourite forums GDN and another one in French:
- Game name: Not sure about it yet and it is not so important now.
- Game genre: Platform, Adventure. (kind of limbo and Ninja Gaiden mixt)
- Programming: C core engine, C or C++ game (not decided yet)
- Graphics: 2D/3D.
- Graphics lib: OpenGL > 3.5
- Audio: Not sure yet (probably OpenAl)
- Platforms: for the moment Windows 10 and Linux (other may come later or not)
- Relative to the game ( story, artwork, ....): As I said it didn't start already, but story big picture is finished.
So what am I doing now?
I am finishing the first part that will make me decide if I continue the project or not. It is essentially technical like object collision, sprite animation, learning more about platform game technic...
What did I do?
Well, I decided to not use SDL2 as I want to port my game in some platform that does not support SDL. So I choose OpenGL. Plus I plan to use some 3D features in the game. So I mocked SDL2 behaviour and write it very specifically for my game.
Here is a screenshot that shows objects rotating. I used a sprite sheet from Soul of Mask, we can also see a red box and a rectangle coming from a function call drawRectangle (more details soon)
here we can see the code I will need to write for an animation:
bkp_graphics_2dReady(BKP_TRUE);
BKP_Rec dest,src;
BKP_Rotate r;
src.w = 64;
src.h = 64;
src.x = 2;
src.y = 2;
dest.w = 92;
dest.h = 92;
dest.x = 500;
dest.y = 200;
static float iii = 0;
static double tm = 0;
static double ta = 0;
static int alpha = 255 ;
static int dal = 2;
tm = glfwGetTime();
//animation timers
if(tm - ta > 64.0f / 1000.0f)
{
ta = tm;
iii += .125;
if(alpha <=0 || alpha >=255)
dal = -dal;
alpha += dal;
}
r.center.z = 0;
r.angle = -iii;
r.center.x = dest.x + dest.w / 2;
r.center.y = dest.y + dest.h / 2;
bkp_graphics_drawSurface(G[0] ,&dest,&src,&r,BKP_GRAPHICS_FLIPNONE, &alpha);
dest.w = 368;
dest.h = 138;
dest.x -= 35;
dest.y -= 20;
bkp_graphics_2dsetColori(255,255,255,255);
bkp_graphics_drawRectangle(&dest, BKP_FALSE);
dest.w = 168;
dest.x = 250;
r.angle = iii;
bkp_graphics_drawSurface(G[2] ,&dest,&src,&r,BKP_GRAPHICS_FLIPH, NULL);
r.angle = -iii /4;
bkp_graphics_drawSurface(G[0] ,&dest,&src,&r,BKP_GRAPHICS_FLIPV, NULL);
dest.x = 620;
bkp_graphics_2dsetColori(255,0,0,255 / 2);
bkp_graphics_drawRectangle(&dest, BKP_TRUE);
bkp_graphics_2dFlush();
Looks a little bit like SDL. In this example we can see all the job done so far, Scaling, Positioning, FLIP (vertical, horizontal), Rotate around a point and transparency. Those are all I used with SDL2 so far for Soul of Mask. The first objective is checked. Here is a video that illustrates it:
I don't go into the deep details about how I did things, but if people request it in the comments I will, I mean I would like to share it as I think some people who use OpenGL better than I do may give me some precious pieces of advice and improve the way I did it, in the meantime more beginner than I am will have a hint to start.
Time for a little of performance:
The graphics engine is able to draw on those 3 differents devices (here GPU integrated in CPU)
- draw a frame in 0.016 ms for 1700 animated sprites on a Intel(R) Core(TM) i5-4210U CPU 1366x768
- draw a frame in 0.016 ms for 1000 animated sprites on a Broadwell Intel Core M-5Y70 HD 4k
- draw a frame in 0.016 ms for 7000 animated sprites on a Intel(R) Core(TM) i7-7700 CPU 1920x1080
I didn't test it with a Nvidia or Radeon graphics card yet, for the moment it is irrelevant but it will come later.
Conclusion on using custom vs SDL2
pro: Faster. I know everything behind it.
con: Fewer features, less flexible, unoptimized and probably full of bugs I didn't notice yet.
I also added a log system I didn't have it for my previous game so at any crash I add to try to reproduce it very hard now it is better just have to read log file on crashes.
here is the output of this video:
DEBUG set
Moving to directory `../`
[ INFO ][ 2018-03-01 15:27:06] -> Starting Graphics Engine ...
[ INFO ][ 2018-03-01 15:27:06] -> Starting GLFW 3.2.1 X11 GLX EGL clock_gettime /dev/js Xf86vm shared
[ INFO ][ 2018-03-01 15:27:06] -> Monitor info:
[ INFO ][ 2018-03-01 15:27:06] -> #1 1920x1080
[ INFO ][ 2018-03-01 15:27:06] -> #0 1366x768
[ INFO ][ 2018-03-01 15:27:06] -> --------------------------
[ INFO ][ 2018-03-01 15:27:06] -> GL Context Params :
[ INFO ][ 2018-03-01 15:27:06] -> GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS : 192
[ INFO ][ 2018-03-01 15:27:06] -> GL_MAX_CUBE_MAP_TEXTURE_SIZE : 16384
[ INFO ][ 2018-03-01 15:27:06] -> GL_MAX_DRAW_BUFFERS : 8
[ INFO ][ 2018-03-01 15:27:06] -> GL_MAX_FRAGMENT_UNIFORM_COMPONENTS : 16384
[ INFO ][ 2018-03-01 15:27:06] -> GL_MAX_TEXTURE_IMAGE_UNITS : 32
[ INFO ][ 2018-03-01 15:27:06] -> GL_MAX_TEXTURE_SIZE : 16384
[ INFO ][ 2018-03-01 15:27:06] -> GL_MAX_VARYING_FLOATS : 128
[ INFO ][ 2018-03-01 15:27:06] -> GL_MAX_VERTEX_ATTRIBS : 16
[ INFO ][ 2018-03-01 15:27:06] -> GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS : 32
[ INFO ][ 2018-03-01 15:27:06] -> GL_MAX_VERTEX_UNIFORM_COMPONENTS : 16384
[ INFO ][ 2018-03-01 15:27:06] -> GL_MAX_MULTISAMPLE_COVERAGE_MODES_NV : 0
[ INFO ][ 2018-03-01 15:27:06] -> GL_MAX_SAMPLES : 8
[ INFO ][ 2018-03-01 15:27:06] -> GL_MAX_MULTISAMPLE_COVERAGE_MODES_NV : 32768 : 32768
[ INFO ][ 2018-03-01 15:27:06] -> GL_MAX_SAMPLES : 0
[ INFO ][ 2018-03-01 15:27:06] -> --------------------------
[ INFO ][ 2018-03-01 15:27:06] -> Opening window with GLFW3 [OK]
[ INFO ][ 2018-03-01 15:27:06] -> Renderer : Mesa DRI Intel(R) Haswell Mobile
[ INFO ][ 2018-03-01 15:27:06] -> OpenGL version : 4.5 (Core Profile) Mesa 17.2.4
[ INFO ][ 2018-03-01 15:27:06] -> 4.5
[ INFO ][ 2018-03-01 15:27:06] -> program 3 GL_VALIDATE_STATUS = 1:
[ INFO ][ 2018-03-01 15:27:06] -> ------------- shader programme 3 info ---------------
[ INFO ][ 2018-03-01 15:27:06] -> GL_LINK_STATUS = 1:
[ INFO ][ 2018-03-01 15:27:06] -> GL_ATTACHED_SHADERS = 2:
[ INFO ][ 2018-03-01 15:27:06] -> GL_ACTIVE_ATTRIBUTES = 1:
[ INFO ][ 2018-03-01 15:27:06] -> 0) type:vec3 name: vp location: 0
[ INFO ][ 2018-03-01 15:27:06] -> GL_ACTIVE_UNIFORMS = 2:
[ INFO ][ 2018-03-01 15:27:06] -> 0) type:mat4 name: matrix location: 0
[ INFO ][ 2018-03-01 15:27:06] -> 1) type:vec4 name: color location: 1
[ INFO ][ 2018-03-01 15:27:06] -> ------------- end info ---------------
[ INFO ][ 2018-03-01 15:27:06] -> program 6 GL_VALIDATE_STATUS = 1:
[ INFO ][ 2018-03-01 15:27:06] -> ------------- shader programme 6 info ---------------
[ INFO ][ 2018-03-01 15:27:06] -> GL_LINK_STATUS = 1:
[ INFO ][ 2018-03-01 15:27:06] -> GL_ATTACHED_SHADERS = 2:
[ INFO ][ 2018-03-01 15:27:06] -> GL_ACTIVE_ATTRIBUTES = 2:
[ INFO ][ 2018-03-01 15:27:06] -> 0) type:vec3 name: vertex_position location: 0
[ INFO ][ 2018-03-01 15:27:06] -> 1) type:vec2 name: vt_loc location: 1
[ INFO ][ 2018-03-01 15:27:06] -> GL_ACTIVE_UNIFORMS = 3:
[ INFO ][ 2018-03-01 15:27:06] -> 0) type:mat4 name: matrix location: 0
[ INFO ][ 2018-03-01 15:27:06] -> 1) type:vec4 name: vt_ location: 1
[ INFO ][ 2018-03-01 15:27:06] -> 2) type:sampler2D name: basic_texture location: 2
[ INFO ][ 2018-03-01 15:27:06] -> ------------- end info ---------------
[ INFO ][ 2018-03-01 15:27:06] -> program 9 GL_VALIDATE_STATUS = 1:
[ INFO ][ 2018-03-01 15:27:06] -> ------------- shader programme 9 info ---------------
[ INFO ][ 2018-03-01 15:27:06] -> GL_LINK_STATUS = 1:
[ INFO ][ 2018-03-01 15:27:06] -> GL_ATTACHED_SHADERS = 2:
[ INFO ][ 2018-03-01 15:27:06] -> GL_ACTIVE_ATTRIBUTES = 2:
[ INFO ][ 2018-03-01 15:27:06] -> 0) type:vec3 name: vertex_position location: 0
[ INFO ][ 2018-03-01 15:27:06] -> 1) type:vec2 name: vt_loc location: 1
[ INFO ][ 2018-03-01 15:27:06] -> GL_ACTIVE_UNIFORMS = 4:
[ INFO ][ 2018-03-01 15:27:06] -> 0) type:mat4 name: matrix location: 0
[ INFO ][ 2018-03-01 15:27:06] -> 1) type:vec4 name: vt_ location: 1
[ INFO ][ 2018-03-01 15:27:06] -> 2) type:sampler2D name: basic_texture location: 2
[ INFO ][ 2018-03-01 15:27:06] -> 3) type:float name: alpha_factor location: 3
[ INFO ][ 2018-03-01 15:27:06] -> ------------- end info ---------------
[ INFO ][ 2018-03-01 15:27:06] -> 2D Graphics Engine start [OK]
[ INFO ][ 2018-03-01 15:27:06] -> Graphics Engine started
[ INFO ][ 2018-03-01 15:27:17] ->
[ INFO ][ 2018-03-01 15:27:17] -> deleting shader programe 3
[ INFO ][ 2018-03-01 15:27:17] -> deleting shader programe 6
[ INFO ][ 2018-03-01 15:27:17] -> deleting shader programe 9
[ INFO ][ 2018-03-01 15:27:17] -> 2D Graphics Engine closed [OK]
[ INFO ][ 2018-03-01 15:27:17] -> Window closed [OK]
[ INFO ][ 2018-03-01 15:27:17] -> Graphics Engine stopped [OK]
[ INFO ][ 2018-03-01 15:27:17] -> Logger closed [OK]
[ INFO ][ 2018-03-01 15:27:17] -> Game Engine stopped [OK]
What's next?
I am learning about the type of game I am doing, I should have some basic movement of main character and platform collisions soon. I promise myself I will not do everything alone again so this blog will be also used to seduce whoever want to jump into this adventure. But by experience I know I may finish alone again (who knows).
Thanks for reading, I will post more as soon as I have something new to show.
Have a nice day.
Nice job!