gasti-jm / super-mario-bros

Super Mario Bros in C++ under SDL2
3 stars 1 forks source link

Hi there, very good project. #1

Open FabioMoro opened 2 years ago

FabioMoro commented 2 years ago

Hi there, I really like your project! I'm trying to improve my skills about SDL2 and your code looks great, I am a bit stuck with the files bodys.bin, cfg.bin, fonts.bin, graphics.ind. May I know why you are using the binary format? I'd like to view if feasible the content so I can understand what happens under the hood, please let me know, you can find my email below my signature. Thank you very much and keep up the great work!

Fabio fabiomoro82@gmail.com

gasti-jm commented 2 years ago

Hello, I hope you can understand me well, since I'm from Argentina and I don't have good English and I'm using the magic google translator haha.

Similarly, I still need to upload a "compressor" project to GitHub (now I'm going to upload it, don't worry) where you will be able to better understand this, where I go from a ".txt" to binary these files.

The "graphics.ind" stores each "grhindex" and each grhindex represents a clipped or animated frame or graphic for each index, so it is represented in a ".txt" before being binary:

Grh(NumIndex)=NumFrames-NumGraphic-posX-posY-Width-Height

NumFrames: Number of frames, you have to put 1 when you index a single frame graphic. NumGraphic: If you look at the path "resources/graphics/" you have many images with the graphics of the game, each name has a number to identify them. posX: The X position where the crop will be made in the image posY: The position Y where the crop will be made in the image Width: Wide size of the clipping. Height: Height size of the cutout.

When you store an animation NumFrames as greater than 1, it renders an animation and with a speed. In this way for example:

Grh(NumIndex)=NumFrames-GrhIndex-GrhIndex-....-Speed

For example: Grh100=4-20-21-22-23-555

To understand "Fonts.bin", you need to understand a bit about "graphics.ind", since "Fonts.bin" stores a grhindex for each character of letters and also in each type of font (there are 2, one that is the letters in general, and others are only for the small numbers that is for the score more than anything). Since the letter system works on the same graphics system, loading an index and then rendering it on the screen.

Then the "bodys.bin" is similar to the "Fonts.bin", it stores a body index with an animated grhindex.

Finally "cfg.bin" has stored certain variables of the general configuration of the game (For example, Full Screen, Vsync, Audio Volume, FPS Limit, etc.)

Here you have the repository of the compressor of the game: GitHub Repository | Compressor - Super Mario Bros Files https://github.com/gasti-jm/compressor-SMarioBrosFiles

One thing I want to clarify for you, this "Super Mario Bros" project was a project I did for my university, I didn't have very clear concepts of the C++ language (what's more, this project doesn't even have include guards haha), therefore it has errors that I am going to explain to you.

I come from a very obsolete language that is Visual Basic 6.0, I learned this language when I wanted to create my own "Argentum Online" server, which is an Argentine 2D MMORPG and it is precisely programmed in this language and from this same game I got some ideas to create this "Super Mario Bros" in C++.

And so you have an idea, this language brings very bad programming practices, a terrible example and what happens in this mario project, is that in VB6 you can create matrices or arrays with positions from size 1 to x... where in C++ and in all the other languages it is from 0 to X..., if you notice I have made a mistake and I have assigned in the load of "graficos.ind" one more position in certain arrays (if you notice when creating a new dimension of GrhData I have put a "+ 1" at the end) and in the reading of "frames" (which is for animations) I started assigning in some important variables that the first grhIndex is the position 1 of the array, when in fact it is the position 0, I suppose that if you read it you will realize and you will solve all these logical errors, it is more I realized that the animations were skipped or restarted quickly. (you would also be leaving position 0 empty and with garbage data)

Regarding the rest, the code is a bit spaghetti, since I did it in a hurry and with little knowledge of this language.

I have learned a lot about C++ over time and I notice all these errors easily, I would recommend you to fix them since they are few, add include guards, and accommodate the code a bit.

Anything you can consult me.

El dom, 10 abr 2022 a las 19:18, FabioMoro @.***>) escribió:

Hi there, I really like your project! I'm trying to improve my skills about SDL2 and your code looks great, I am a bit stuck with the files bodys.bin, cfg.bin, fonts.bin, graphics.ind. May I know why you are using the binary format? I'd like to view if feasible the content so I can understand what happens under the hood, please let me know, you can find my email below my signature. Thank you very much and keep up the great work!

Fabio @.***

— Reply to this email directly, view it on GitHub https://github.com/gasti-jm/Super-Mario-Bros-cpp-sdl2/issues/1, or unsubscribe https://github.com/notifications/unsubscribe-auth/ATVLJ572PQP7FACDCNSW5ELVENHUPANCNFSM5TBOC33Q . You are receiving this because you are subscribed to this thread.Message ID: @.***>

gasti-jm commented 2 years ago

Another thing I want to clarify, I have written the world.map, fonts.bin and the bodys.bin by hand, if you look at the compressor project you will see many lines of code (especially where it loads the map haha) , I have not designed any other program or world editor, etc, that does all this automatically.

As I was saying, everything was done in a hurry haha.

El dom, 10 abr 2022 a las 22:29, Jorge Gastón Martínez @.***>) escribió:

Hello, I hope you can understand me well, since I'm from Argentina and I don't have good English and I'm using the magic google translator haha.

Similarly, I still need to upload a "compressor" project to GitHub (now I'm going to upload it, don't worry) where you will be able to better understand this, where I go from a ".txt" to binary these files.

The "graphics.ind" stores each "grhindex" and each grhindex represents a clipped or animated frame or graphic for each index, so it is represented in a ".txt" before being binary:

Grh(NumIndex)=NumFrames-NumGraphic-posX-posY-Width-Height

NumFrames: Number of frames, you have to put 1 when you index a single frame graphic. NumGraphic: If you look at the path "resources/graphics/" you have many images with the graphics of the game, each name has a number to identify them. posX: The X position where the crop will be made in the image posY: The position Y where the crop will be made in the image Width: Wide size of the clipping. Height: Height size of the cutout.

When you store an animation NumFrames as greater than 1, it renders an animation and with a speed. In this way for example:

Grh(NumIndex)=NumFrames-GrhIndex-GrhIndex-....-Speed

For example: Grh100=4-20-21-22-23-555

To understand "Fonts.bin", you need to understand a bit about "graphics.ind", since "Fonts.bin" stores a grhindex for each character of letters and also in each type of font (there are 2, one that is the letters in general, and others are only for the small numbers that is for the score more than anything). Since the letter system works on the same graphics system, loading an index and then rendering it on the screen.

Then the "bodys.bin" is similar to the "Fonts.bin", it stores a body index with an animated grhindex.

Finally "cfg.bin" has stored certain variables of the general configuration of the game (For example, Full Screen, Vsync, Audio Volume, FPS Limit, etc.)

Here you have the repository of the compressor of the game: GitHub Repository | Compressor - Super Mario Bros Files https://github.com/gasti-jm/compressor-SMarioBrosFiles

One thing I want to clarify for you, this "Super Mario Bros" project was a project I did for my university, I didn't have very clear concepts of the C++ language (what's more, this project doesn't even have include guards haha), therefore it has errors that I am going to explain to you.

I come from a very obsolete language that is Visual Basic 6.0, I learned this language when I wanted to create my own "Argentum Online" server, which is an Argentine 2D MMORPG and it is precisely programmed in this language and from this same game I got some ideas to create this "Super Mario Bros" in C++.

And so you have an idea, this language brings very bad programming practices, a terrible example and what happens in this mario project, is that in VB6 you can create matrices or arrays with positions from size 1 to x... where in C++ and in all the other languages it is from 0 to X..., if you notice I have made a mistake and I have assigned in the load of "graficos.ind" one more position in certain arrays (if you notice when creating a new dimension of GrhData I have put a "+ 1" at the end) and in the reading of "frames" (which is for animations) I started assigning in some important variables that the first grhIndex is the position 1 of the array, when in fact it is the position 0, I suppose that if you read it you will realize and you will solve all these logical errors, it is more I realized that the animations were skipped or restarted quickly. (you would also be leaving position 0 empty and with garbage data)

Regarding the rest, the code is a bit spaghetti, since I did it in a hurry and with little knowledge of this language.

I have learned a lot about C++ over time and I notice all these errors easily, I would recommend you to fix them since they are few, add include guards, and accommodate the code a bit.

Anything you can consult me.

El dom, 10 abr 2022 a las 19:18, FabioMoro @.***>) escribió:

Hi there, I really like your project! I'm trying to improve my skills about SDL2 and your code looks great, I am a bit stuck with the files bodys.bin, cfg.bin, fonts.bin, graphics.ind. May I know why you are using the binary format? I'd like to view if feasible the content so I can understand what happens under the hood, please let me know, you can find my email below my signature. Thank you very much and keep up the great work!

Fabio @.***

— Reply to this email directly, view it on GitHub https://github.com/gasti-jm/Super-Mario-Bros-cpp-sdl2/issues/1, or unsubscribe https://github.com/notifications/unsubscribe-auth/ATVLJ572PQP7FACDCNSW5ELVENHUPANCNFSM5TBOC33Q . You are receiving this because you are subscribed to this thread.Message ID: @.***>

FabioMoro commented 2 years ago

Hi Gastón, thanks for getting back to me!

I can understand you, indeed your English is good so do not worry about that. 😎

I had a look at the compressor and I could only find graphics.ini, would it be possible to have a look at the content of bodys.bin, cfg.bin fonts.bin, world.map, to better understand their structure?Thanks for the explanation about graphics.ini. 👍

Also may I ask the reason why you have converted those files to .bin?

Many thanks for your time and keep up the great job!

Fabio

Sent from my iPhone

On 11 Apr 2022, at 02:43, Gastón Martínez @.***> wrote:

 Another thing I want to clarify, I have written the world.map, fonts.bin and the bodys.bin by hand, if you look at the compressor project you will see many lines of code (especially where it loads the map haha) , I have not designed any other program or world editor, etc, that does all this automatically.

As I was saying, everything was done in a hurry haha.

El dom, 10 abr 2022 a las 22:29, Jorge Gastón Martínez @.***>) escribió:

Hello, I hope you can understand me well, since I'm from Argentina and I don't have good English and I'm using the magic google translator haha.

Similarly, I still need to upload a "compressor" project to GitHub (now I'm going to upload it, don't worry) where you will be able to better understand this, where I go from a ".txt" to binary these files.

The "graphics.ind" stores each "grhindex" and each grhindex represents a clipped or animated frame or graphic for each index, so it is represented in a ".txt" before being binary:

Grh(NumIndex)=NumFrames-NumGraphic-posX-posY-Width-Height

NumFrames: Number of frames, you have to put 1 when you index a single frame graphic. NumGraphic: If you look at the path "resources/graphics/" you have many images with the graphics of the game, each name has a number to identify them. posX: The X position where the crop will be made in the image posY: The position Y where the crop will be made in the image Width: Wide size of the clipping. Height: Height size of the cutout.

When you store an animation NumFrames as greater than 1, it renders an animation and with a speed. In this way for example:

Grh(NumIndex)=NumFrames-GrhIndex-GrhIndex-....-Speed

For example: Grh100=4-20-21-22-23-555

To understand "Fonts.bin", you need to understand a bit about "graphics.ind", since "Fonts.bin" stores a grhindex for each character of letters and also in each type of font (there are 2, one that is the letters in general, and others are only for the small numbers that is for the score more than anything). Since the letter system works on the same graphics system, loading an index and then rendering it on the screen.

Then the "bodys.bin" is similar to the "Fonts.bin", it stores a body index with an animated grhindex.

Finally "cfg.bin" has stored certain variables of the general configuration of the game (For example, Full Screen, Vsync, Audio Volume, FPS Limit, etc.)

Here you have the repository of the compressor of the game: GitHub Repository | Compressor - Super Mario Bros Files https://github.com/gasti-jm/compressor-SMarioBrosFiles

One thing I want to clarify for you, this "Super Mario Bros" project was a project I did for my university, I didn't have very clear concepts of the C++ language (what's more, this project doesn't even have include guards haha), therefore it has errors that I am going to explain to you.

I come from a very obsolete language that is Visual Basic 6.0, I learned this language when I wanted to create my own "Argentum Online" server, which is an Argentine 2D MMORPG and it is precisely programmed in this language and from this same game I got some ideas to create this "Super Mario Bros" in C++.

And so you have an idea, this language brings very bad programming practices, a terrible example and what happens in this mario project, is that in VB6 you can create matrices or arrays with positions from size 1 to x... where in C++ and in all the other languages it is from 0 to X..., if you notice I have made a mistake and I have assigned in the load of "graficos.ind" one more position in certain arrays (if you notice when creating a new dimension of GrhData I have put a "+ 1" at the end) and in the reading of "frames" (which is for animations) I started assigning in some important variables that the first grhIndex is the position 1 of the array, when in fact it is the position 0, I suppose that if you read it you will realize and you will solve all these logical errors, it is more I realized that the animations were skipped or restarted quickly. (you would also be leaving position 0 empty and with garbage data)

Regarding the rest, the code is a bit spaghetti, since I did it in a hurry and with little knowledge of this language.

I have learned a lot about C++ over time and I notice all these errors easily, I would recommend you to fix them since they are few, add include guards, and accommodate the code a bit.

Anything you can consult me.

El dom, 10 abr 2022 a las 19:18, FabioMoro @.***>) escribió:

Hi there, I really like your project! I'm trying to improve my skills about SDL2 and your code looks great, I am a bit stuck with the files bodys.bin, cfg.bin, fonts.bin, graphics.ind. May I know why you are using the binary format? I'd like to view if feasible the content so I can understand what happens under the hood, please let me know, you can find my email below my signature. Thank you very much and keep up the great work!

Fabio @.***

— Reply to this email directly, view it on GitHub https://github.com/gasti-jm/Super-Mario-Bros-cpp-sdl2/issues/1, or unsubscribe https://github.com/notifications/unsubscribe-auth/ATVLJ572PQP7FACDCNSW5ELVENHUPANCNFSM5TBOC33Q . You are receiving this because you are subscribed to this thread.Message ID: @.***>

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you authored the thread.

gasti-jm commented 2 years ago

Hello! How are you? It's a pleasure!

The reason why one goes from a ".txt" to binary files is precisely so that they can be read faster and not pose a difficult algorithm when reading a simple file (If you don't believe me, look at how complicated it was read the graphics.ini haha), in addition this also allows us that the file weighs much less than a ".txt" and finally allows that nobody can manipulate, access or steal the file.

If tomorrow you create a big project (where you invest in graphic designers, sound engineers, etc.), you have to compress your files to binary (if you want, or you don't mind someone else stealing your resources), What's more, you can compress a folder full of images or textures (for example the "graphics" folder that is in the mario project) and transform it into a single file of the format you want (for example ".bin").

Regarding the other files, I mentioned that I did it through code for my logic, but I can explain it to you:

The "Bodys.bin" is as if you would see it in the following way in a ".txt":

[INIT] MAXBODYS=3

[0] // small mario body numBodyGrhIndexAnimation0 = 6; // jump numBodyGrhIndexAnimation1 = 11; // crouched or dead numBodyGrhIndexAnimation2 = 21; // walk numBodyGrhIndexAnimation3 = 9; // caught on the flag

[1] // Mushroom NPC posWalkGrhIndex0 = 55; // jump (does not have) posWalkGrhIndex1 = 55; // crouched or dead (does not have) posWalkGrhIndex2 = 182; // walk posWalkGrhIndex3 = 55; // caught on the flag (does not have)

[2] // Turtle NPC posWalkGrhIndex0 = 193; // jump (does not have) posWalkGrhIndex1 = 193; // crouched or dead (does not have) posWalkGrhIndex2 = 194; // walk posWalkGrhIndex3 = 193; // caught on the flag (does not have)

[3] // NPC Tortoise WINGS posWalkGrhIndex0 = 193; // jump (does not have) posWalkGrhIndex1 = 193; // crouched or dead (does not have) posWalkGrhIndex2 = 195; // walk posWalkGrhIndex3 = 193; // caught on the flag (does not have)

Look, each body index saves 4 different "GrhIndex" (either animated or not, remember that there are GrhIndex in the "graficos.ind" that have animations), if you look at Mario I use the 4 "posWalkGrhIndex" with different GrhIndex (and I indicate with comments what each one is for), in this case in the others (which are NPC's) you only use 1 and 2 (from posWalkGrhIndex), in the rest they are 0 and 3 (from posWalkGrhIndex ) repeats the values of 1 (only to fill with a value,) so in a nutshell, then in the mario code, you can make your character (mario or NPC) that has an "X" Body you can change its "postWalk". For example, if you are walking (your posWalk is 2) tapping the up arrow changes your posWalk to 0.

as seen in the following code that is in the "mario" class:

// force always down. if(!DetectCollisionButtom() && !isJumping){ inTheAir = true; posWalk = 0; // we change the grhIndex of the body for the jump or fall index PixelOffSetY += VEL_FALL * timer; } else { inTheAir = false;

    // he is jumping? we change the grhIndex of the body for the one of

jump, otherwise it leaves the grhIndex of walk. isJumping ? posWalk = 0 : posWalk = 2;

Then the world.map, it is difficult to explain in a ".txt", but I will explain it to you. The world.map first loads this structure, which would be all the map information:

struct mapInfo{ int max_tiles_x, max_tiles_y; // For the two-dimensional array of type pointer. int typeMap; // this defines the textures of coins, objects, background music, etc. int TOTAL_NPCs, TOTAL_OBJs; // for object creation after loading the map. int Mario_PosX, Mario_PosY, PosCastle; };

After mario's code creates an array next to the mapData structure as follows:

MapData = new mapData * [MapInfo.max_tiles_x]; for(int i = 0; i < MapInfo.max_tiles_x; i++) MapData[i] = new mapData[MapInfo.max_tiles_y];

In this case if you look at the compressor: MapInfo.max_tiles_x = 224 and MapInfo.max_tiles_x = 15

Therefore, the map in the game will create a matrix of these dimensions (X with 224 tiles and Y with 15). Then for each position of the array (tiles) the entire mapData structure will be read and loaded:

struct mapData{ grh Layer[2]; boolblocked; int typeOBJ, typeNPC, NPCIndex, OBJIndex; };

If you read the compressor a bit in the "LoadMap" function, I'll build the map (or mapping without world editor😂) assigning each data to each position of the matrix. (ideally it would be to build a world editor that can have a list of grhindex, npcs, objects, etc so you don't have to do it this way like I did).

The cfg.bin is like this in a ".txt":

[GameConfiguration] screen_width = 640 screen_height = 480 volume = 100 fullscreen = false capFPS = false vsync = false

This reads all these variables as soon as the project starts, and also when configuring it also saves them and recompresses them to binary, in addition to performing certain behaviors, for example (screen_width and screen_height, define the resolution of the game window).

Finally the fonts.bin would be something like this in a ".txt", without going too far

[0] // general font_type ascii_code1 = grhIndex of the character of ascii code number 1... ascii_code2 = grhIndex of the character of ascii code number 2... ascii_code3 = grhIndex of the character of ascii code number 3... ... so up to 255 of the ASCII code

[1] // font_type for small letters (like the score when killing an npc) ascii_code1 = grhIndex of the character of ascii code number 1... ascii_code2 = grhIndex of the character of ascii code number 2... ascii_code3 = grhIndex of the character of ascii code number 3... ... so up to 255 of the ASCII code

If you look at the compressor project in the "LoadFonts" function I am assigning a GrhIndex to each ASCII value, if you also look at the graphics folder, the image 10.bmp and 59.bmp are the graphics of the letters and yes you look for it in the graphics.ini you will find its grhIndex. Obviously there are not all the characters of the ASCII code if you look at the images, that's why in the rest I assign a 0 as GrhIndex.

I hope it has been understood. Greetings!

El mar, 12 abr 2022 a las 19:29, FabioMoro @.***>) escribió:

Hi Gastón, thanks for getting back to me!

I can understand you, indeed your English is good so do not worry about that. 😎

I had a look at the compressor and I could only find graphics.ini, would it be possible to have a look at the content of bodys.bin, cfg.bin fonts.bin, world.map, to better understand their structure?Thanks for the explanation about graphics.ini. 👍

Also may I ask the reason why you have converted those files to .bin?

Many thanks for your time and keep up the great job!

Fabio

Sent from my iPhone

On 11 Apr 2022, at 02:43, Gastón Martínez @.***> wrote:

 Another thing I want to clarify, I have written the world.map, fonts.bin and the bodys.bin by hand, if you look at the compressor project you will see many lines of code (especially where it loads the map haha) , I have not designed any other program or world editor, etc, that does all this automatically.

As I was saying, everything was done in a hurry haha.

El dom, 10 abr 2022 a las 22:29, Jorge Gastón Martínez @.***>) escribió:

Hello, I hope you can understand me well, since I'm from Argentina and I don't have good English and I'm using the magic google translator haha.

Similarly, I still need to upload a "compressor" project to GitHub (now I'm going to upload it, don't worry) where you will be able to better understand this, where I go from a ".txt" to binary these files.

The "graphics.ind" stores each "grhindex" and each grhindex represents a clipped or animated frame or graphic for each index, so it is represented in a ".txt" before being binary:

Grh(NumIndex)=NumFrames-NumGraphic-posX-posY-Width-Height

NumFrames: Number of frames, you have to put 1 when you index a single frame graphic. NumGraphic: If you look at the path "resources/graphics/" you have many images with the graphics of the game, each name has a number to identify them. posX: The X position where the crop will be made in the image posY: The position Y where the crop will be made in the image Width: Wide size of the clipping. Height: Height size of the cutout.

When you store an animation NumFrames as greater than 1, it renders an animation and with a speed. In this way for example:

Grh(NumIndex)=NumFrames-GrhIndex-GrhIndex-....-Speed

For example: Grh100=4-20-21-22-23-555

To understand "Fonts.bin", you need to understand a bit about "graphics.ind", since "Fonts.bin" stores a grhindex for each character of letters and also in each type of font (there are 2, one that is the letters in general, and others are only for the small numbers that is for the score more than anything). Since the letter system works on the same graphics system, loading an index and then rendering it on the screen.

Then the "bodys.bin" is similar to the "Fonts.bin", it stores a body index with an animated grhindex.

Finally "cfg.bin" has stored certain variables of the general configuration of the game (For example, Full Screen, Vsync, Audio Volume, FPS Limit, etc.)

Here you have the repository of the compressor of the game: GitHub Repository | Compressor - Super Mario Bros Files https://github.com/gasti-jm/compressor-SMarioBrosFiles

One thing I want to clarify for you, this "Super Mario Bros" project was a project I did for my university, I didn't have very clear concepts of the C++ language (what's more, this project doesn't even have include guards haha), therefore it has errors that I am going to explain to you.

I come from a very obsolete language that is Visual Basic 6.0, I learned this language when I wanted to create my own "Argentum Online" server, which is an Argentine 2D MMORPG and it is precisely programmed in this language and from this same game I got some ideas to create this "Super Mario Bros" in C++.

And so you have an idea, this language brings very bad programming practices, a terrible example and what happens in this mario project, is that in VB6 you can create matrices or arrays with positions from size 1 to x... where in C++ and in all the other languages it is from 0 to X..., if you notice I have made a mistake and I have assigned in the load of "graficos.ind" one more position in certain arrays (if you notice when creating a new dimension of GrhData I have put a "+ 1" at the end) and in the reading of "frames" (which is for animations) I started assigning in some important variables that the first grhIndex is the position 1 of the array, when in fact it is the position 0, I suppose that if you read it you will realize and you will solve all these logical errors, it is more I realized that the animations were skipped or restarted quickly. (you would also be leaving position 0 empty and with garbage data)

Regarding the rest, the code is a bit spaghetti, since I did it in a hurry and with little knowledge of this language.

I have learned a lot about C++ over time and I notice all these errors easily, I would recommend you to fix them since they are few, add include guards, and accommodate the code a bit.

Anything you can consult me.

El dom, 10 abr 2022 a las 19:18, FabioMoro @.***>) escribió:

Hi there, I really like your project! I'm trying to improve my skills about SDL2 and your code looks great, I am a bit stuck with the files bodys.bin, cfg.bin, fonts.bin, graphics.ind. May I know why you are using the binary format? I'd like to view if feasible the content so I can understand what happens under the hood, please let me know, you can find my email below my signature. Thank you very much and keep up the great work!

Fabio @.***

— Reply to this email directly, view it on GitHub https://github.com/gasti-jm/Super-Mario-Bros-cpp-sdl2/issues/1, or unsubscribe < https://github.com/notifications/unsubscribe-auth/ATVLJ572PQP7FACDCNSW5ELVENHUPANCNFSM5TBOC33Q

. You are receiving this because you are subscribed to this thread.Message ID: @.***>

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you authored the thread.

— Reply to this email directly, view it on GitHub https://github.com/gasti-jm/Super-Mario-Bros-cpp-sdl2/issues/1#issuecomment-1097292847, or unsubscribe https://github.com/notifications/unsubscribe-auth/ATVLJ5ZCLWEEJYDDOB5O3ITVEX2LLANCNFSM5TBOC33Q . You are receiving this because you commented.Message ID: @.***>