<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Giovanni Cortés</title>
    <description>The latest articles on DEV Community by Giovanni Cortés (@gidrek).</description>
    <link>https://dev.to/gidrek</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F57664%2Fa83eb446-0024-4090-8939-bcab5f93bda1.jpg</url>
      <title>DEV Community: Giovanni Cortés</title>
      <link>https://dev.to/gidrek</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gidrek"/>
    <language>en</language>
    <item>
      <title>Setup FNA Framework in macOS with Apple Processors</title>
      <dc:creator>Giovanni Cortés</dc:creator>
      <pubDate>Fri, 06 Sep 2024 13:00:00 +0000</pubDate>
      <link>https://dev.to/gidrek/setup-fna-framework-in-macos-with-apple-processors-177j</link>
      <guid>https://dev.to/gidrek/setup-fna-framework-in-macos-with-apple-processors-177j</guid>
      <description>&lt;p&gt;FNA is a reimplementation of the Microsoft XNA Game Studio 4.0 Refresh libraries, the framework with which I started learning to create video games.&lt;/p&gt;

&lt;p&gt;FNA has good support for Windows and Linux to create a viable environment, but it has some problems with macOS, specially with M processors. So if you want to develop a FNA game in macOS is not as simple as seen, but I finally got to have a setup in my Mac.&lt;/p&gt;

&lt;p&gt;If you want to develop games in macOS using FNA, follow these steps, these are working for me, but I can’t guarantee that it will work 100% for you. If you have problems, you can join to the &lt;a href="https://discord.com/invite/2Gg8zju" rel="noopener noreferrer"&gt;Discord Server&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install brew
&lt;/h2&gt;

&lt;p&gt;First of all, we need to setup brew to be able to install all the requirements.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Install the required prerequisites
&lt;/h2&gt;

&lt;p&gt;Once you have installed brew, now is time to install python, cmake and git.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;brew install cmake python3 git

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Get the fnalibs and compile for the platform
&lt;/h2&gt;

&lt;p&gt;This is the more important step, FNA uses natives libraries to develop and run games, the FNA team provides the native libraries for Windows, Linux, and x86_64 macOS but for arm64 we need to compile by our self, but thanks to &lt;code&gt;TheSpydog&lt;/code&gt; and his repo, we can compile our libraries easier than before.&lt;/p&gt;

&lt;p&gt;First, you need to download the repo: &lt;a href="https://github.com/TheSpydog/fnalibs-apple-builder" rel="noopener noreferrer"&gt;https://github.com/TheSpydog/fnalibs-apple-builder&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The repo has clear instructions for building, so we only need to reproduce here.&lt;/p&gt;

&lt;p&gt;For example, if you download the repo in the &lt;code&gt;Download&lt;/code&gt; folder, you need to go to the folder in the terminal and run the commands.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd ~/Downloads
./updatelibs
./buildlibs macos # Build for mac, you can build for ios/ios-sim/tvos/tvos-sim/all too

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After building the libraries, you are going to have a bin directory where you are going to find the native libraries that you are going to use.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install dotnet 8
&lt;/h2&gt;

&lt;p&gt;FNA uses C# to write games, so we need to install dotnet in your mac, go to the&lt;a href="https://dotnet.microsoft.com/en-us/download" rel="noopener noreferrer"&gt;official site&lt;/a&gt; and install the Arm64 version.&lt;/p&gt;

&lt;h2&gt;
  
  
  Create your project
&lt;/h2&gt;

&lt;p&gt;Finally we can create our project for our game. Open to your terminal, then go to the location where you are going to put your project.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd ~/Desktop
mkdir MyGame
cd MyGame
dotnet new sln # Create a solution file to add the projects
dotnet new console -o MyGame
dotnet sln add MyGame/MyGame.csproj

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You need to add the FNA repo, the &lt;a href="https://fna-xna.github.io/docs/0%3A-FAQ/#where-is-the-nuget-package" rel="noopener noreferrer"&gt;FNA FAQ’s&lt;/a&gt; has a explanation why they are not using NuGet packages, so, in the terminal run the this command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone --recursive https://github.com/FNA-XNA/FNA
dotnet sln add FNA/FNA.Core.csproj # Add the core project because we are using dotnet core

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We need to add the reference in our project so we can get the FNA Framework working in our code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd MyGame
dotnet add reference ../FNA/FNA.Core.csproj

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once we have created the reference, we need to build our project.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dotnet build

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The build command, is going to generate a &lt;code&gt;build&lt;/code&gt; directory, you need to put the native libraries that compiled early in the &lt;code&gt;build/Debu/net8.0&lt;/code&gt; path.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr6ptnn6zhc09aypkpddm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr6ptnn6zhc09aypkpddm.png" alt="native_libraries_in_folder" width="800" height="595"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating the Content folder
&lt;/h2&gt;

&lt;p&gt;If you have used Monogame or XNA, you know that we need to use a Content Pipeline to convert the files in a &lt;code&gt;.xnb&lt;/code&gt; format. In FNA we have more freedom in our assets,&lt;/p&gt;

&lt;p&gt;The FNA documentation says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;FNA supports loading common data formats like PNG, WAV and OGG directly, and the community maintains a few libraries for font loading and rendering.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But we want to emulate XNA, so in your project root folder, create a folder and named&lt;code&gt;Content&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fya3yeif6b1ta7zkub9lm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fya3yeif6b1ta7zkub9lm.png" alt="content_folder" width="580" height="428"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But we need a little of configuration in the &lt;code&gt;MyGame.csproj&lt;/code&gt; to add the Content folder to our bin directory. Open and modify &lt;code&gt;MyGame.csproj&lt;/code&gt; to add the next code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;ItemGroup&amp;gt;
    &amp;lt;None Include="Content\**" CopyToOutputDirectory="PreserveNewest" /&amp;gt;
&amp;lt;/ItemGroup&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your file should looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;Project Sdk="Microsoft.NET.Sdk"&amp;gt;

  &amp;lt;ItemGroup&amp;gt;
    &amp;lt;ProjectReference Include="..\FNA\FNA.Core.csproj" /&amp;gt;
  &amp;lt;/ItemGroup&amp;gt;

  &amp;lt;ItemGroup&amp;gt;
    &amp;lt;None Include="Content\**" CopyToOutputDirectory="PreserveNewest" /&amp;gt;
  &amp;lt;/ItemGroup&amp;gt;

  &amp;lt;PropertyGroup&amp;gt;
    &amp;lt;OutputType&amp;gt;Exe&amp;lt;/OutputType&amp;gt;
    &amp;lt;TargetFramework&amp;gt;net8.0&amp;lt;/TargetFramework&amp;gt;
  &amp;lt;/PropertyGroup&amp;gt;

&amp;lt;/Project&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Test our FNA setup
&lt;/h2&gt;

&lt;p&gt;Now, is time to test and see if all the steps are working.&lt;/p&gt;

&lt;p&gt;First, download the ball image (I took from &lt;a href="https://docs.monogame.net/articles/getting_started/4_adding_content.html" rel="noopener noreferrer"&gt;Monogame Tutorial&lt;/a&gt;) and save it as &lt;code&gt;ball.png&lt;/code&gt; in the &lt;code&gt;Content&lt;/code&gt; folder.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foskmprv64wgoo69ifw82.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foskmprv64wgoo69ifw82.png" alt="ball" width="64" height="64"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, replace the &lt;code&gt;Program.cs&lt;/code&gt; file with this code&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;using System;

static class Program
{
    [STAThread]
    static void Main()
    {
        using (var g = new MainGame())
        {
            g.Run();
        }
    }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create a new file and named it &lt;code&gt;MainGame.cs&lt;/code&gt; and add this code&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;

public class MainGame : Game
{
    private GraphicsDeviceManager _graphics;
    private SpriteBatch _spriteBatch;

    Texture2D ballTexture;

    public MainGame()
    {
        _graphics = new GraphicsDeviceManager(this);
        Content.RootDirectory = "Content";
    }

    protected override void Initialize()
    {

        // TODO: Add your initialization logic here

        base.Initialize();
    }

    protected override void LoadContent()
    {
        _spriteBatch = new SpriteBatch(GraphicsDevice);
        ballTexture = Content.Load&amp;lt;Texture2D&amp;gt;("ball");
    }

    protected override void UnloadContent()
    {
        base.UnloadContent();
    }

    protected override void Update(GameTime gameTime)
    {
        if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Keys.Escape))
            Exit();

        // TODO: Add your game logic here

        base.Update(gameTime);
    }

    protected override void Draw(GameTime gameTime)
    {
        _graphics.GraphicsDevice.Clear(Color.CornflowerBlue);

        // TODO: Add your drawing code here
        _spriteBatch.Begin();
        _spriteBatch.Draw(ballTexture, new Vector2(0, 0), Color.White);
        _spriteBatch.End();

        base.Draw(gameTime);
    }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is a code that was generated in the template of XNA (I just added the ball), and it is a good template for start with your game.&lt;/p&gt;

&lt;h2&gt;
  
  
  Running the game
&lt;/h2&gt;

&lt;p&gt;Now you can run your game&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dotnet run

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see our FNA window with a ball :D&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F200nnha7lkxuim8xsyw9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F200nnha7lkxuim8xsyw9.png" width="800" height="543"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From here, you can read XNA, Monogame and FNA tutorials to learn more or if you are a experience developer you can test your ideas.&lt;/p&gt;

</description>
      <category>csharp</category>
      <category>fna</category>
      <category>xna</category>
      <category>gamedev</category>
    </item>
    <item>
      <title>Gaming on Ubuntu and Derivatives</title>
      <dc:creator>Giovanni Cortés</dc:creator>
      <pubDate>Thu, 15 Jul 2021 22:43:40 +0000</pubDate>
      <link>https://dev.to/gidrek/gaming-on-ubuntu-and-derivatives-23ep</link>
      <guid>https://dev.to/gidrek/gaming-on-ubuntu-and-derivatives-23ep</guid>
      <description>&lt;p&gt;One of the myths that we have about Linux is that it is not good for gaming, and this has been true for a long time, since we could only enjoy native games and not so high budget, although there were exceptions, we must admit that if you wanted to play , you had to have a partition with Windows.&lt;/p&gt;

&lt;p&gt;Lately this has changed, because, although there are not many native AAA games for Linux yet, there are ways that we can play modern games and almost as easily as Windows.&lt;/p&gt;

&lt;p&gt;In this post I am going to show you what are the options that we have to play using Ubuntu and its Ubuntu based distros (Linux Mint, Pop! _OS, Kubuntu, etc), so there will no longer be a pretext because your options to play in Linux have increased.&lt;/p&gt;

&lt;h2&gt;
  
  
  Steam
&lt;/h2&gt;

&lt;p&gt;One of the easiest ways to play games in Linux is Steam. The Steam client is native to Linux and you can play a lot of games that are made natively for Linux, but there is also the option to use &lt;strong&gt;Proton&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Proton is developed by Valve and works through Steam Play so that games developed for Windows are translated into a language that is compatible with Linux, uses tools such as &lt;strong&gt;DirectX Vulkan&lt;/strong&gt; so we will have almost the same performance as in Windows.&lt;/p&gt;

&lt;p&gt;But not all games are compatible with Steam, to know which games run well and which ones we will have a bit of problems we can use &lt;a href="https://www.protondb.com/" rel="noopener noreferrer"&gt;Proton DB&lt;/a&gt;. In Proton DB we have a database that will help us know which games are compatible, we have ratings to know this.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Native:&lt;/strong&gt; (They are native games for Linux)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Platinum&lt;/strong&gt; : (They run perfectly without making modifications)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gold&lt;/strong&gt; : (Runs perfectly after making a few minor modifications)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Silver&lt;/strong&gt; : (Runs the game, with a few minor issues, but generally plays well)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bronze&lt;/strong&gt; : (Runs but with problems)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Borked&lt;/strong&gt; : (Game won’t even start or is unplayable)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you go to the page, you will see that many games are Gold or above, and that the little unplayable are generally multiplayer (like Destiny), but before installing anything I recommend that you visit the page to see if your game runs well.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Set up and install Steam&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Using Steam in Ubuntu is very easy, you just have to download the Steam client from its &lt;a href="https://store.steampowered.com/" rel="noopener noreferrer"&gt;website&lt;/a&gt; and install it. If you use Pop! _OS it is much easier, since it comes in the repositories, in fact Pop!_OS has very good support for games.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt install steam
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once we have Steam installed we need to start the application, now we have to activate Steam Play and Proton&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NntoGKTb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://giovanni.codes/wp-content/uploads/2021/07/steam_play.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NntoGKTb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://giovanni.codes/wp-content/uploads/2021/07/steam_play.png" width="740" height="585"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you activate it, you can start playing games like The Witcher 3, Skyrim and other great titles.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lutris
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://lutris.net/" rel="noopener noreferrer"&gt;Lutris&lt;/a&gt; is an Open Source library in which users upload scripts for emulators and WINE to run games that were made for Windows, personally I use it if there is a game that is not on Steam like Magic The Gathering Arena and World of Warcraft.&lt;/p&gt;

&lt;p&gt;The easiest way to install lutris is thought the repositories&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt install lutris
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If there is not Lutris in your repos, you need to add the apt-repository&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo dpkg --add-architecture i386
sudo add-apt-repository ppa:lutris-team/lutris
sudo apt update
sudo apt install lutris
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once done, you can start searching the Lutris app for games and installing them.&lt;/p&gt;

&lt;p&gt;Using Lutris is not as simple as Steam, but there shouldn’t be so many complications, I play Magic and WoW without problems, but sometimes there are scripts that don’t work, it is a matter of reading the instructions that come at the beginning and installing.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IVGC2VJX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://giovanni.codes/wp-content/uploads/2021/07/lutris.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IVGC2VJX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://giovanni.codes/wp-content/uploads/2021/07/lutris.png" width="800" height="639"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here are some screenshots that I am actually playing in WoW&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9XqJ5YXX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://codigolinux.mx/wp-content/uploads/2021/03/Screenshot-from-2021-02-28-21-28-36.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9XqJ5YXX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://codigolinux.mx/wp-content/uploads/2021/03/Screenshot-from-2021-02-28-21-28-36.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LX1pdMlD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://codigolinux.mx/wp-content/uploads/2021/03/Screenshot-from-2021-02-28-21-22-49.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LX1pdMlD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://codigolinux.mx/wp-content/uploads/2021/03/Screenshot-from-2021-02-28-21-22-49.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TYIaEDEU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://codigolinux.mx/wp-content/uploads/2021/03/Screenshot-from-2021-02-28-21-17-19.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TYIaEDEU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://codigolinux.mx/wp-content/uploads/2021/03/Screenshot-from-2021-02-28-21-17-19.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Graphics Cards and Hardware
&lt;/h2&gt;

&lt;p&gt;Obviously Linux does not make miracles, to play recent games you will have to have a graphic card that is capable to play games in high resolution, for example, to play high in 1080p you can use an NVIDIA GeForce GTX 1660Ti or 1660 super, if you have a better card you can take advantage of it.&lt;/p&gt;

&lt;p&gt;Also the AMD cards are good and have good Linux support.&lt;/p&gt;

&lt;p&gt;If you want to use your NVIDIA card to its full potential, you have to activate the proprietary drivers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fX4wdj42--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://giovanni.codes/wp-content/uploads/2021/07/nvidia.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fX4wdj42--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://giovanni.codes/wp-content/uploads/2021/07/nvidia.png" width="800" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you use Pop! _OS, you have to download the ISO that has the NVIDIA drivers integrated.&lt;/p&gt;

&lt;p&gt;Regarding the CPU, it is good to have an iCore 5 from 8th generation onwards or a Ryzen 5 from 2nd generation, for RAM with 16 GB it is enough for all games.&lt;/p&gt;

&lt;h2&gt;
  
  
  MangoHud
&lt;/h2&gt;

&lt;p&gt;One of the things I like to do is monitoring the temperature of the GPU and CPU while I am playing, as well as the percentage of use, I use MangoHud to have those statistics&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RE7MVbUW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://giovanni.codes/wp-content/uploads/2021/07/thewitcher.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RE7MVbUW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://giovanni.codes/wp-content/uploads/2021/07/thewitcher.jpeg" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To install MangoHud do the following, we must install git to make it easier&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt install git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inside the MangoHud folder we run the following (let it finish executing one command before running the next one)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;./build.sh build
./build.sh package
./build.sh install
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once it is installed, we must create a configuration file to show what we want to , we can copy the one that comes by default&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cp /usr/share/doc/mangohud/MangoHud.conf.example ~/.config/MangoHud/MangoHud.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open the file&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gedit ~/.config/MangoHud/MangoHud.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And copy paste this code&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;### MangoHud configuration file
### Uncomment any options you wish to enable. Default options are left uncommented
### Use some_parameter=0 to disable a parameter (only works with on/off parameters)
### Everything below can be used / overridden with the environment variable MANGOHUD_CONFIG instead

################ PERFORMANCE #################

### Limit the application FPS. Comma-separated list of one or more FPS values (e.g. 0,30,60). 0 means unlimited (unless VSynced).
# fps_limit=

### VSync [0-3] 0 = adaptive; 1 = off; 2 = mailbox; 3 = on
# vsync=

### OpenGL VSync [0-N] 0 = off; &amp;gt;=1 = wait for N v-blanks, N &amp;gt; 1 acts as a FPS limiter (FPS = display refresh rate / N)
# gl_vsync=

################### VISUAL ###################

### Legacy layout
# legacy_layout = false

### Display the current CPU information
cpu_stats
cpu_temp
# cpu_power
# cpu_text = "CPU"
# cpu_mhz
# cpu_load_change
# cpu_load_value
# cpu_load_color

### Display the current GPU information
gpu_stats
gpu_temp
# gpu_core_clock
# gpu_mem_clock
# gpu_name
# gpu_power
# gpu_text = "GPU"
# vulkan_driver
# gpu_load_change
# gpu_load_value
# gpu_load_color

### Display FPS and frametime
fps
# fps_sampling_period=
frametime

### Display loaded MangoHud architecture
# arch

### Display the frametime line graph
frame_timing
#histogram

### Display the current system time
# time

### Time formatting examples
# time_format = %H:%M
# time_format = [%T %F]
# time_format = %X # locally formatted time, because of limited glyph range, missing characters may show as '?' (e.g. Japanese)

### Change the hud font size (default is 24)
font_size=24
# font_scale=1.0
# font_size_text=24
# font_scale_media_player = 0.55
# no_small_font

### Change default font (set location to .TTF/.OTF file )
## Set font for the whole hud
# font_file=

## Set font only for text like media player metadata
# font_file_text=

## Set font glyph ranges. Defaults to latin-only. Don't forget to set font_file/text_font_file to font that supports these.
## Probably don't enable all at once because of memory usage and hardware limits concerns.
## If you experience crashes or text is just squares, reduce glyph range or reduce font size.
# font_glyph_ranges=korean, chinese, chinese_simplified, japanese, cyrillic, thai, vietnamese, latin_ext_a, latin_ext_b

### Change the hud position (default is top-left)
position=top-left

### Display the current CPU load &amp;amp; frequency for each core
# core_load

### IO read and write for the app (not system)
# io_read
# io_write
# io_stats

### Display system RAM / VRAM usage
ram
vram

### Display MangoHud, engine or Wine version
# version
# engine_version
# wine

### Disable / hide the hud by default
# no_display

### Hud position offset
# offset_x=
# offset_y=

### Hud dimensions
# width=
# height=
# table_columns=
# cellpadding_y=

### Hud transparency / alpha
background_alpha=0.5
# alpha=

### Color customization
# text_color=FFFFFF
# gpu_color=2E9762
# cpu_color=2E97CB
# vram_color=AD64C1
# ram_color=C26693
# engine_color=EB5B5B
# io_color=A491D3
# frametime_color=00FF00
# background_color=020202
# media_player_color=FFFFFF
# wine_color=732010

### Show media player metadata
# media_player
# media_player_name = spotify
# media_player_order = title,artist,album

### Specify gpu with pci bus id for amdgpu and NVML stats.
### Set to 'domain:bus:slot.function'
# pci_dev = 0:0a:0.0

### Blacklist
# blacklist =

################## INTERACTION #################

### Change toggle keybinds for the hud &amp;amp; logging
toggle_hud=F11
# toggle_fps_limit=Shift_L+F1
# toggle_logging=Shift_L+F2
# reload_cfg=Shift_L+F4
# upload_log=Shift_L+F3

################## LOG #################
### Automatically start the log after X seconds
# autostart_log = 1
### Set amount of time in seconds that the logging will run for
# log_duration
### Set location of the output files (required for logging)
# output_folder = /home/&amp;lt;USERNAME&amp;gt;/mangologs
### Permit uploading logs directly to FlightlessMango.com
# permit_upload=1
### Define a '+'-separated list of percentiles shown in the benchmark results.
### Use "AVG" to get a mean average. Default percentiles are 97+AVG+1+0.1
# benchmark_percentiles=
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are several options that you can uncomment (remove the # from the command) but with this file that we have we can already see the amount of RAM and CPU that is used as well as the percentage and you can activate and deactivate with F11.&lt;/p&gt;

&lt;p&gt;Now, to show it in Steam games, you must type the following in the launch parameters of each game.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mangohud %command%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--p3b3YFwz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://giovanni.codes/wp-content/uploads/2021/07/steam_mangohuyd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--p3b3YFwz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://giovanni.codes/wp-content/uploads/2021/07/steam_mangohuyd.png" width="800" height="571"&gt;&lt;/a&gt;I will change the picture for the english version&lt;/p&gt;

&lt;p&gt;For Lutris we must go to &lt;strong&gt;Options&lt;/strong&gt; and have the &lt;strong&gt;advanced option&lt;/strong&gt; enabled, and in system options in the &lt;strong&gt;Command Prefix&lt;/strong&gt; part, write mangohud&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--a3pih5I9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://giovanni.codes/wp-content/uploads/2021/07/lustis-preferences.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--a3pih5I9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://giovanni.codes/wp-content/uploads/2021/07/lustis-preferences.png" width="800" height="606"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And now you can have MangoHud activated.&lt;/p&gt;

&lt;p&gt;With this guide I hope you can start playing on Linux and enjoy gaming.&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://giovanni.codes/gaming-on-ubuntu-and-derivatives/" rel="noopener noreferrer"&gt;Gaming on Ubuntu and Derivatives&lt;/a&gt; appeared first on &lt;a href="https://giovanni.codes" rel="noopener noreferrer"&gt;Giovanni Codes&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>ubuntu</category>
    </item>
    <item>
      <title>Setup SDL2 with Visual Studio Code and mingw64 on Windows</title>
      <dc:creator>Giovanni Cortés</dc:creator>
      <pubDate>Mon, 28 Sep 2020 15:50:18 +0000</pubDate>
      <link>https://dev.to/gidrek/setup-sdl2-with-visual-studio-code-and-mingw64-on-windows-14c5</link>
      <guid>https://dev.to/gidrek/setup-sdl2-with-visual-studio-code-and-mingw64-on-windows-14c5</guid>
      <description>&lt;p&gt;Recently I changed my setup from macOS to Windows, and I’d like to do some experiments with GameDev in Windows. So one of the first things that I did was try to set up my dev environment and test some SDL2 code.&lt;/p&gt;

&lt;p&gt;This is a simple guide to how to setup SDL2 with Visual Studio Code and mingw64, for me worked and I hope that you can start with SDL2 in Windows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing the tools.
&lt;/h2&gt;

&lt;p&gt;The first thing that we need to install is &lt;a href="https://code.visualstudio.com/download" rel="noopener noreferrer"&gt;Visual Studio Code&lt;/a&gt; editor. Download, install, and launch VS Code.&lt;/p&gt;

&lt;p&gt;You need to install the &lt;strong&gt;C/C++ plugin from Microsoft&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--p4vUkako--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://giovanni.codes/wp-content/uploads/2020/09/cpp-plugin-editor.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--p4vUkako--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://giovanni.codes/wp-content/uploads/2020/09/cpp-plugin-editor.png" alt="C/C++ plugin" width="800" height="140"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, you need to install mingw64 to use the compilers that are included like g++, if you want to use the Visual Studio compiler, you can change some of the settings here but for now we continue with mingw64.&lt;/p&gt;

&lt;p&gt;For easy installation, use the &lt;a href="https://sourceforge.net/projects/mingw-w64/files/" rel="noopener noreferrer"&gt;MinGW-W64 Online&lt;/a&gt; Installer, take note of the path where you installed your compiler, because we’re going to need it in the configuration.&lt;/p&gt;

&lt;p&gt;Now, we need to download &lt;a href="https://www.libsdl.org/download-2.0.php" rel="noopener noreferrer"&gt;SDL2&lt;/a&gt;. For our case, we have to download the Development libraries for MinGW&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6D6mEX-E--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://giovanni.codes/wp-content/uploads/2020/09/sdl2-library-mingw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6D6mEX-E--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://giovanni.codes/wp-content/uploads/2020/09/sdl2-library-mingw.png" width="333" height="27"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And download the Runtime libraries to run our games.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Y1siYJDL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://giovanni.codes/wp-content/uploads/2020/09/sdl2-runtime-libraries.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Y1siYJDL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://giovanni.codes/wp-content/uploads/2020/09/sdl2-runtime-libraries.png" width="314" height="131"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We are going to use the x64 version. Unzip those folders in a location that you can find because we are going to need it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating the SDL2 project
&lt;/h2&gt;

&lt;p&gt;Now we are ready to start our SDL2 project. Create a folder for your project and open it with VSCode. Inside the folder, create another called &lt;strong&gt;src&lt;/strong&gt; , here is where are going to save our code files. For our SDL2 and C++ configuration, create a &lt;strong&gt;.vscode&lt;/strong&gt; folder. For the output of our compilation, create a &lt;strong&gt;build&lt;/strong&gt; folder. Your editor should be like this&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--J1-3DLhO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://giovanni.codes/wp-content/uploads/2020/09/sdl2-src-vscode-build-folder.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--J1-3DLhO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://giovanni.codes/wp-content/uploads/2020/09/sdl2-src-vscode-build-folder.png" width="226" height="191"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The first thing that we need to create is our Task to compile our code. In the  &lt;strong&gt;.vscode ** folder, create a new file and name it  **tasks.json.&lt;/strong&gt; Inside the file, write the following configuration.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2.0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"tasks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"shell"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SDL2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"D:&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;sdk&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;mingw-w64&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;x86_64-8.1.0-posix-seh-rt_v6-rev0&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;mingw64&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;bin&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;g++.exe"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="s2"&gt;"-g"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="s2"&gt;"src&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;*.cpp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="s2"&gt;"-o"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="s2"&gt;"build&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;game.exe"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="s2"&gt;"-ID:/sdk/sdl2/mingw/x86_64/include"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="s2"&gt;"-LD:/sdk/sdl2/mingw/x86_64/lib"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="s2"&gt;"-lmingw32"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="s2"&gt;"-lSDL2main"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="s2"&gt;"-lSDL2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="s2"&gt;"-mwindows"&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"options"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"cwd"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"${workspaceFolder}"&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"problemMatcher"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="s2"&gt;"$gcc"&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"group"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"kind"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"build"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"isDefault"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;label&lt;/strong&gt; option is the name in which we are going to identify our task.&lt;/p&gt;

&lt;p&gt;In the  &lt;strong&gt;command&lt;/strong&gt; option, we need to put the path to our g++ installation, that is where we install mingw64.&lt;/p&gt;

&lt;p&gt;In the  &lt;strong&gt;args&lt;/strong&gt; options, we have some arguments that are important to notice. For example, &lt;code&gt;"build\\game.exe",&lt;/code&gt; is the name of our game and the folder where we’re going to save it.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;"-ID:/sdk/sdl2/mingw/x86_64/include"&lt;/code&gt; is where we save our SDL2 files, this is for SDL2 include libraries, the same as &lt;code&gt;"-LD:/sdk/sdl2/mingw/x86_64/lib",&lt;/code&gt; is the path to SDL2 libraries.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;"-lmingw32"&lt;/code&gt; is an option to compile with the mingw libraries, besides that said 32, we’re are using the 64 bits compiler. &lt;code&gt;"-lSDL2main",&lt;br&gt;
                "-lSDL2",&lt;br&gt;
                "-mwindows"&lt;/code&gt; in this case, we are indicating to our compiler that we need to include the SDL2main and SDL2 libraries and we don’t want the command prompt when launching our game.&lt;/p&gt;

&lt;p&gt;Now, we need to create a  &lt;strong&gt;launch.json&lt;/strong&gt; file to launch our game and debugging.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0.2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"configurations"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"(gdb)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cppdbg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"request"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"launch"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"program"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"${workspaceFolder}&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;build&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;game.exe"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"stopAtEntry"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"cwd"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"${workspaceFolder}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"environment"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"externalConsole"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"MIMode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"gdb"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"miDebuggerPath"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"D:&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;sdk&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;mingw-w64&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;x86_64-8.1.0-posix-seh-rt_v6-rev0&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;mingw64&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;bin&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;gdb.exe"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"setupCommands"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                    &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Enably pretty printing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                    &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"-enable-pretty-printing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                    &lt;/span&gt;&lt;span class="nl"&gt;"ignoreFailures"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"preLaunchTask"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SDL2"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;"program": "${workspaceFolder}\\build\\game.exe",&lt;/code&gt; is the executable that we are going to launch, in our case is the same that our game.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;"miDebuggerPath": "D:\\sdk\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\mingw64\\bin\\gdb.exe"&lt;/code&gt; is the path where gdb.exe is.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;"preLaunchTask": "SDL2"&lt;/code&gt; before launch our program, we need to run the task “SDL2”, this is the name that we put in the label option in tasks.json.&lt;/p&gt;

&lt;p&gt;Now, as the last configuration step, we need to configure our C++ options to have a better Intellisense autocomplete and configuration of our compiler.&lt;/p&gt;

&lt;p&gt;In Visual Studio Code, press  &lt;strong&gt;CTRL&lt;/strong&gt; + &lt;strong&gt;SHIFT&lt;/strong&gt; + &lt;strong&gt;P&lt;/strong&gt; , write C/C++ and select &lt;strong&gt;C/C++ Edit configurations (GUI)&lt;/strong&gt;. Here we’re are going to change some configurations.&lt;/p&gt;

&lt;p&gt;In  &lt;strong&gt;Compiler Path,&lt;/strong&gt; you need to put the path to your compiler. Like we put in the tasks.json and change the &lt;strong&gt;IntelliSense mode&lt;/strong&gt; to  &lt;strong&gt;gcc_x64.&lt;/strong&gt; In &lt;strong&gt;Include Path,&lt;/strong&gt; add the path to your SDL2 includes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dzqjER8b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://giovanni.codes/wp-content/uploads/2020/09/cpp-options.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dzqjER8b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://giovanni.codes/wp-content/uploads/2020/09/cpp-options.png" width="800" height="651"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Other options that you may change are &lt;strong&gt;C Standard&lt;/strong&gt; and  &lt;strong&gt;C++ Standard, ** If you save these configurations, you are going to have a file named  **c_cpp_properties.json&lt;/strong&gt; in your .vscode folder.&lt;/p&gt;

&lt;p&gt;Now, you need to put the &lt;strong&gt;SDL2.dll&lt;/strong&gt; file in the  &lt;strong&gt;build&lt;/strong&gt; folder, to be able to run our SDL2 game.&lt;/p&gt;

&lt;p&gt;Remember to use the version of your game&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--D6BdLNMq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://giovanni.codes/wp-content/uploads/2020/09/build-sdldll.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--D6BdLNMq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://giovanni.codes/wp-content/uploads/2020/09/build-sdldll.png" width="176" height="62"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing our SDL2 game.
&lt;/h2&gt;

&lt;p&gt;Create a  &lt;strong&gt;main.cpp&lt;/strong&gt; file in the  *&lt;em&gt;src *&lt;/em&gt; folder to test our environment, and write the next code&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;SDL2/SDL.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;SDL_Init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SDL_INIT_EVERYTHING&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;SDL_Window&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;window&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SDL_CreateWindow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello SDL"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SDL_WINDOWPOS_CENTERED&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SDL_WINDOWPOS_CENTERED&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;800&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;SDL_Renderer&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;renderer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SDL_CreateRenderer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;isRunning&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;SDL_Event&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;isRunning&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SDL_PollEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;SDL_QUIT&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;isRunning&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

            &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;SDL_KEYDOWN&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;keysym&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sym&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;SDLK_ESCAPE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="n"&gt;isRunning&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="n"&gt;SDL_RenderClear&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;renderer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;SDL_SetRenderDrawColor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;renderer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="n"&gt;SDL_RenderPresent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;renderer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;SDL_DestroyRenderer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;renderer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;SDL_DestroyWindow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;SDL_Quit&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Press  *&lt;em&gt;F5 *&lt;/em&gt; and cross your fingers. You should watch a red window, is you see it, then you are ready to work with SDL2 and VS Code!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uaw1I_5q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://giovanni.codes/wp-content/uploads/2020/09/sdl2-window-1024x754.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uaw1I_5q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://giovanni.codes/wp-content/uploads/2020/09/sdl2-window-1024x754.png" width="800" height="589"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is a simple configuration for start with SDL2, if you want to use SDL_image, you should do the same steps to add the headers and libraries. I will continue with SDL2 and check if with this configuration can be have some problems, but for now, you are able to start working with SDL2.&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://giovanni.codes/setup-sdl2-with-visual-studio-code-and-mingw64-on-windows/" rel="noopener noreferrer"&gt;Setup SDL2 with Visual Studio Code and mingw64 on Windows&lt;/a&gt; appeared first on &lt;a href="https://giovanni.codes" rel="noopener noreferrer"&gt;Giovanni Codes&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7XFUlj91--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/http://feeds.feedburner.com/%7Er/giovannicodes/%7E4/g3DHeT91T-M" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7XFUlj91--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/http://feeds.feedburner.com/%7Er/giovannicodes/%7E4/g3DHeT91T-M" width="1" height="1"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>sdl2</category>
    </item>
    <item>
      <title>SFML Template to start with your game</title>
      <dc:creator>Giovanni Cortés</dc:creator>
      <pubDate>Thu, 07 May 2020 21:31:42 +0000</pubDate>
      <link>https://dev.to/gidrek/sfml-template-to-start-with-your-game-2d48</link>
      <guid>https://dev.to/gidrek/sfml-template-to-start-with-your-game-2d48</guid>
      <description>&lt;p&gt;If you have setup SFML  &lt;a href="https://giovanni.codes/sfml-2-5-1-setup-on-macos-with-clion/" rel="noopener noreferrer"&gt;with the tutorial that I wrote&lt;/a&gt;, the example is easy but is not very useful if you want to create more complex games.&lt;/p&gt;

&lt;p&gt;In this post, I going to show you how I create a simple Game class to have more control about the game loop, the user input and the frame rate.&lt;/p&gt;

&lt;p&gt;First, you need to create a  &lt;strong&gt;Game.h&lt;/strong&gt; and  &lt;strong&gt;Game.cpp&lt;/strong&gt; files. In your &lt;code&gt;Game.h&lt;/code&gt; write this code&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#ifndef GAME_H
#define GAME_H
&lt;/span&gt;
&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;SFML/Graphics.hpp&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Game&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nl"&gt;public:&lt;/span&gt;
    &lt;span class="n"&gt;Game&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;Run&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nl"&gt;private:&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;processEvents&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Time&lt;/span&gt; &lt;span class="n"&gt;deltaTime&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;render&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;handlePlayerInput&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Keyboard&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Key&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;isPressed&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;sf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;RenderWindow&lt;/span&gt; &lt;span class="n"&gt;mWindow&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;sf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Time&lt;/span&gt; &lt;span class="n"&gt;TimePerFrame&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="cp"&gt;#endif //GAME_H
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the header of our Game class, as you can see, we have only a constructor and one public method &lt;code&gt;run&lt;/code&gt;, all other methods are private to Game.&lt;/p&gt;

&lt;p&gt;We have one method for process the SFML events and one for the player input. The &lt;strong&gt;update&lt;/strong&gt; method take a delta time which is going to help us with the frame rate and with other stuffs.&lt;/p&gt;

&lt;p&gt;And we have the  *&lt;em&gt;render *&lt;/em&gt; method, that is going to draw our game.&lt;/p&gt;

&lt;p&gt;We need a  &lt;strong&gt;RenderWindow&lt;/strong&gt; to render our window &lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbulkqolfy11mtnwbvu9x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbulkqolfy11mtnwbvu9x.png" alt="😛" width="72" height="72"&gt;&lt;/a&gt; and finally a &lt;strong&gt;const&lt;/strong&gt; to help us with the frame rate.&lt;/p&gt;

&lt;p&gt;Now, in the  &lt;strong&gt;Game.cpp&lt;/strong&gt; file, write the next code&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="c1"&gt;//&lt;/span&gt;
&lt;span class="c1"&gt;// Created by Giovanni Cortes on 07/05/20.&lt;/span&gt;
&lt;span class="c1"&gt;//&lt;/span&gt;

&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;"Game.h"&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;sf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Time&lt;/span&gt; &lt;span class="n"&gt;Game&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;TimePerFrame&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;seconds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;60.&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;Game&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Game&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;mWindow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;VideoMode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;640&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;480&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s"&gt;"Your Awesome Game!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;Game&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;sf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Clock&lt;/span&gt; &lt;span class="n"&gt;clock&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;sf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Time&lt;/span&gt; &lt;span class="n"&gt;timeSinceLastUpdate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Time&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Zero&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mWindow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isOpen&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;timeSinceLastUpdate&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;clock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;timeSinceLastUpdate&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;TimePerFrame&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;timeSinceLastUpdate&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="n"&gt;TimePerFrame&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="n"&gt;processEvents&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TimePerFrame&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;render&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;Game&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;processEvents&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;sf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Event&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;{};&lt;/span&gt;

    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mWindow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pollEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;sf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Event&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;KeyPressed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;handlePlayerInput&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;sf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Event&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;KeyReleased&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;handlePlayerInput&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;sf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Event&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Closed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;mWindow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
                &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="nl"&gt;default:&lt;/span&gt;
                &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;Game&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Time&lt;/span&gt; &lt;span class="n"&gt;deltaTime&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// TODO: Update your objects here&lt;/span&gt;
    &lt;span class="c1"&gt;// Example: mWindow.draw(mPlayer);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;Game&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;render&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;mWindow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clear&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="c1"&gt;// TODO: Draw your objects here&lt;/span&gt;

    &lt;span class="n"&gt;mWindow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;Game&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;handlePlayerInput&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Keyboard&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Key&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;isPressed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// TODO: Key events for your game&lt;/span&gt;
    &lt;span class="c1"&gt;// Example:&lt;/span&gt;
    &lt;span class="c1"&gt;// if (key == sf::Keyboard::W)&lt;/span&gt;
    &lt;span class="c1"&gt;// {&lt;/span&gt;
    &lt;span class="c1"&gt;// mIsMovingUp = isPressed;&lt;/span&gt;
    &lt;span class="c1"&gt;// }&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The most important method, is the  &lt;strong&gt;run&lt;/strong&gt; method. We have locked our game loop to 60 frames per second thanks to line&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;sf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Time&lt;/span&gt; &lt;span class="n"&gt;TimePerFrame&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;seconds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;60.&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;SFML has a &lt;code&gt;setFrameLimit()&lt;/code&gt; method, but I prefer use mine for control and for learning.&lt;/p&gt;

&lt;p&gt;The remains methods are self explanatory but if you have any doubt, you can write me to explain more in detail.&lt;/p&gt;

&lt;h2&gt;
  
  
  Running the game loop
&lt;/h2&gt;

&lt;p&gt;Now, we have to create a  &lt;strong&gt;Main.cpp&lt;/strong&gt; file to run our game loop, write the next code&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;"Game.h"&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Game&lt;/span&gt; &lt;span class="n"&gt;game&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;game&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Run&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As you can see, the code is very simple, we create a Game instance and run our game loop. If you run this, you are going to see this window&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--21t5Mi9M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://giovanni.codes/wp-content/uploads/2020/05/running_SFML-300x260.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--21t5Mi9M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://giovanni.codes/wp-content/uploads/2020/05/running_SFML-300x260.png" alt="Running SFML" width="300" height="260"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, you can extend your game and have a better control of your game loop.&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://giovanni.codes/sfml-template-to-start-with-your-game/" rel="noopener noreferrer"&gt;SFML Template to start with your game&lt;/a&gt; appeared first on &lt;a href="https://giovanni.codes" rel="noopener noreferrer"&gt;Giovanni Codes&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--e7aJZgmR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/http://feeds.feedburner.com/%7Er/giovannicodes/%7E4/6ifGqwySkxk" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--e7aJZgmR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/http://feeds.feedburner.com/%7Er/giovannicodes/%7E4/6ifGqwySkxk" width="1" height="1"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>sfml</category>
    </item>
    <item>
      <title>GBA Development setup in macOS</title>
      <dc:creator>Giovanni Cortés</dc:creator>
      <pubDate>Fri, 10 Jan 2020 21:36:42 +0000</pubDate>
      <link>https://dev.to/gidrek/gba-development-setup-in-macos-4l90</link>
      <guid>https://dev.to/gidrek/gba-development-setup-in-macos-4l90</guid>
      <description>&lt;p&gt;To develop in GBA we need the tools to do it, and installing it in macOS is simple even if they take a few steps.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install pacman
&lt;/h2&gt;

&lt;p&gt;The first thing we must do is install pacmac, which will allow us to download the devkitpro for the GBA, to install it we must go to the following URL:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/devkitPro/pacman/releases/tag/devkitpro-pacman-1.0.1" rel="noopener noreferrer"&gt;https://github.com/devkitPro/pacman/releases/tag/devkitpro-pacman-1.0.1&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And we will download &lt;strong&gt;devkitpro-pacman-installer.pkg&lt;/strong&gt;. Once it has been downloaded, we install the package. The following will appear::&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ciSiojqu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://giovanni.codes/wp-content/uploads/2020/01/devkitpronopermission-1024x626.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ciSiojqu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://giovanni.codes/wp-content/uploads/2020/01/devkitpronopermission-1024x626.png" width="800" height="489"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So, we need to go to  *&lt;em&gt;System Preferences -&amp;gt; Security &amp;amp; Privacy *&lt;/em&gt; and allow the permissions:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xtBkn1Kj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://giovanni.codes/wp-content/uploads/2020/01/Screenshot-2020-01-10-12.45.08-1024x134.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xtBkn1Kj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://giovanni.codes/wp-content/uploads/2020/01/Screenshot-2020-01-10-12.45.08-1024x134.png" width="800" height="105"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Follow the steps to install the package.&lt;/p&gt;

&lt;p&gt;Once that the installation was finished, we need to update our  &lt;strong&gt;.bashrc&lt;/strong&gt; or  &lt;strong&gt;.zshrc&lt;/strong&gt; file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Update our environments vars
&lt;/h2&gt;

&lt;p&gt;With the installation of pacman, we need to tell to our system where the files are located, so we need to update our &lt;strong&gt;.bashrc&lt;/strong&gt; or  &lt;strong&gt;.zshrc&lt;/strong&gt; file.&lt;/p&gt;

&lt;p&gt;Open your file and copy the next exports&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export DEVKITPRO=/opt/devkitpro
export DEVKITARM=${DEVKITPRO}/devkitARM
export DEVKITPPC=${DEVKITPRO}/devkitPPC
export PATH=${DEVKITPRO}/tools/bin:$PATH
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Install Xcode Tools
&lt;/h2&gt;

&lt;p&gt;Now we need to install the Xcode tools to use the compiler and other utilities. In your terminal write the follow command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;xcode-select --install
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Install devkitpro
&lt;/h2&gt;

&lt;p&gt;Now we have all the tools to install our GBA compiler, so is time to write in the terminal.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo dkp-pacman -S gba-dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Enter your password. You will prompt with options to get more control about the things that your going to install, for now we are going to install all of them. So, hit Enter and then Enter to confirm.&lt;/p&gt;

&lt;p&gt;If you have Catalina you will get an error.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;error: Partition / is mounted read only
error: not enough free disk space
error: failed to commit transaction (not enough free disk space)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is because Catalina root partition is only for read, and you cannot install anything here, but you can have a workaround installing with this command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo dkp-pacman -S gba-dev -r /System/Volumes/Data
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Again, hit Enter, and Enter.&lt;/p&gt;

&lt;p&gt;With devkitpro installed, your are not able to create a GBA game, so we need to test if our tools was installed correctly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hello World GBA
&lt;/h2&gt;

&lt;p&gt;In your Desktop or whenever you want, create a folder named  &lt;strong&gt;hellogma, ** inside create a new file named  **Makefile&lt;/strong&gt; , this file will help us to compile our code and generate a rom&lt;/p&gt;

&lt;p&gt;Copy the following&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight make"&gt;&lt;code&gt;&lt;span class="c"&gt;#---------------------------------------------------------------------------------
&lt;/span&gt;&lt;span class="nl"&gt;.SUFFIXES&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="c"&gt;#---------------------------------------------------------------------------------
&lt;/span&gt;
&lt;span class="k"&gt;ifeq&lt;/span&gt; &lt;span class="nv"&gt;($(strip $(DEVKITARM)),)&lt;/span&gt;
&lt;span class="nf"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;error&lt;/span&gt; &lt;span class="s2"&gt;"Please set DEVKITARM in your environment. export DEVKITARM=&amp;lt;path to&amp;gt;devkitARM"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;endif&lt;/span&gt;

&lt;span class="k"&gt;include&lt;/span&gt;&lt;span class="sx"&gt; $(DEVKITARM)/gba_rules&lt;/span&gt;

&lt;span class="c"&gt;#---------------------------------------------------------------------------------
# TARGET is the name of the output
# BUILD is the directory where object files &amp;amp; intermediate files will be placed
# SOURCES is a list of directories containing source code
# INCLUDES is a list of directories containing extra header files
# DATA is a list of directories containing binary data
# GRAPHICS is a list of directories containing files to be processed by grit
#
# All directories are specified relative to the project directory where
# the makefile is found
#
#---------------------------------------------------------------------------------
&lt;/span&gt;&lt;span class="nv"&gt;TARGET&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; rom/&lt;span class="p"&gt;$(&lt;/span&gt;notdir &lt;span class="p"&gt;$(&lt;/span&gt;CURDIR&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="nv"&gt;BUILD&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; build
&lt;span class="nv"&gt;SOURCES&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; src
&lt;span class="nv"&gt;INCLUDES&lt;/span&gt;    &lt;span class="o"&gt;:=&lt;/span&gt; include
&lt;span class="nv"&gt;DATA&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt;
&lt;span class="nv"&gt;MUSIC&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt;

&lt;span class="c"&gt;#---------------------------------------------------------------------------------
# options for code generation
#---------------------------------------------------------------------------------
&lt;/span&gt;&lt;span class="nv"&gt;ARCH&lt;/span&gt;    &lt;span class="o"&gt;:=&lt;/span&gt;  &lt;span class="nt"&gt;-mthumb&lt;/span&gt; &lt;span class="nt"&gt;-mthumb-interwork&lt;/span&gt;

&lt;span class="nv"&gt;CFLAGS&lt;/span&gt;  &lt;span class="o"&gt;:=&lt;/span&gt;  &lt;span class="nt"&gt;-g&lt;/span&gt; &lt;span class="nt"&gt;-Wall&lt;/span&gt; &lt;span class="nt"&gt;-O2&lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;-mcpu&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;arm7tdmi &lt;span class="nt"&gt;-mtune&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;arm7tdmi&lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="p"&gt;$(&lt;/span&gt;ARCH&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nv"&gt;CFLAGS&lt;/span&gt;  &lt;span class="o"&gt;+=&lt;/span&gt;  &lt;span class="p"&gt;$(&lt;/span&gt;INCLUDE&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nv"&gt;CXXFLAGS&lt;/span&gt;    &lt;span class="o"&gt;:=&lt;/span&gt;  &lt;span class="p"&gt;$(&lt;/span&gt;CFLAGS&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nt"&gt;-fno-rtti&lt;/span&gt; &lt;span class="nt"&gt;-fno-exceptions&lt;/span&gt;

&lt;span class="nv"&gt;ASFLAGS&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt;  &lt;span class="nt"&gt;-g&lt;/span&gt; &lt;span class="p"&gt;$(&lt;/span&gt;ARCH&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;LDFLAGS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;   &lt;span class="nt"&gt;-g&lt;/span&gt; &lt;span class="p"&gt;$(&lt;/span&gt;ARCH&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nt"&gt;-Wl&lt;/span&gt;,-Map,&lt;span class="p"&gt;$(&lt;/span&gt;notdir &lt;span class="nv"&gt;$*&lt;/span&gt;.map&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;#---------------------------------------------------------------------------------
# any extra libraries we wish to link with the project
#---------------------------------------------------------------------------------
&lt;/span&gt;&lt;span class="nv"&gt;LIBS&lt;/span&gt;    &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nt"&gt;-lmm&lt;/span&gt; &lt;span class="nt"&gt;-lgba&lt;/span&gt;

&lt;span class="c"&gt;#---------------------------------------------------------------------------------
# list of directories containing libraries, this must be the top level containing
# include and lib
#---------------------------------------------------------------------------------
&lt;/span&gt;&lt;span class="nv"&gt;LIBDIRS&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt;  &lt;span class="p"&gt;$(&lt;/span&gt;LIBGBA&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;#---------------------------------------------------------------------------------
# no real need to edit anything past this point unless you need to add additional
# rules for different file extensions
#---------------------------------------------------------------------------------
&lt;/span&gt;
&lt;span class="k"&gt;ifneq&lt;/span&gt; &lt;span class="nv"&gt;($(BUILD),$(notdir $(CURDIR)))&lt;/span&gt;
&lt;span class="c"&gt;#---------------------------------------------------------------------------------
&lt;/span&gt;
&lt;span class="k"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;OUTPUT&lt;/span&gt;   &lt;span class="o"&gt;:=&lt;/span&gt;  &lt;span class="p"&gt;$(&lt;/span&gt;CURDIR&lt;span class="p"&gt;)&lt;/span&gt;/&lt;span class="p"&gt;$(&lt;/span&gt;TARGET&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;VPATH&lt;/span&gt;    &lt;span class="o"&gt;:=&lt;/span&gt;  &lt;span class="p"&gt;$(&lt;/span&gt;foreach &lt;span class="nb"&gt;dir&lt;/span&gt;,&lt;span class="p"&gt;$(&lt;/span&gt;SOURCES&lt;span class="p"&gt;)&lt;/span&gt;,&lt;span class="p"&gt;$(&lt;/span&gt;CURDIR&lt;span class="p"&gt;)&lt;/span&gt;/&lt;span class="p"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;dir&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
            &lt;span class="p"&gt;$(&lt;/span&gt;foreach &lt;span class="nb"&gt;dir&lt;/span&gt;,&lt;span class="p"&gt;$(&lt;/span&gt;DATA&lt;span class="p"&gt;)&lt;/span&gt;,&lt;span class="p"&gt;$(&lt;/span&gt;CURDIR&lt;span class="p"&gt;)&lt;/span&gt;/&lt;span class="p"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;dir&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
            &lt;span class="p"&gt;$(&lt;/span&gt;foreach &lt;span class="nb"&gt;dir&lt;/span&gt;,&lt;span class="p"&gt;$(&lt;/span&gt;GRAPHICS&lt;span class="p"&gt;)&lt;/span&gt;,&lt;span class="p"&gt;$(&lt;/span&gt;CURDIR&lt;span class="p"&gt;)&lt;/span&gt;/&lt;span class="p"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;dir&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="k"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;DEPSDIR&lt;/span&gt;  &lt;span class="o"&gt;:=&lt;/span&gt;  &lt;span class="p"&gt;$(&lt;/span&gt;CURDIR&lt;span class="p"&gt;)&lt;/span&gt;/&lt;span class="p"&gt;$(&lt;/span&gt;BUILD&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nv"&gt;CFILES&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt;   &lt;span class="p"&gt;$(&lt;/span&gt;foreach &lt;span class="nb"&gt;dir&lt;/span&gt;,&lt;span class="p"&gt;$(&lt;/span&gt;SOURCES&lt;span class="p"&gt;)&lt;/span&gt;,&lt;span class="p"&gt;$(&lt;/span&gt;notdir &lt;span class="p"&gt;$(&lt;/span&gt;wildcard &lt;span class="p"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;dir&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;/&lt;span class="k"&gt;*&lt;/span&gt;.c&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="nv"&gt;CPPFILES&lt;/span&gt;    &lt;span class="o"&gt;:=&lt;/span&gt;  &lt;span class="p"&gt;$(&lt;/span&gt;foreach &lt;span class="nb"&gt;dir&lt;/span&gt;,&lt;span class="p"&gt;$(&lt;/span&gt;SOURCES&lt;span class="p"&gt;)&lt;/span&gt;,&lt;span class="p"&gt;$(&lt;/span&gt;notdir &lt;span class="p"&gt;$(&lt;/span&gt;wildcard &lt;span class="p"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;dir&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;/&lt;span class="k"&gt;*&lt;/span&gt;.cpp&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="nv"&gt;SFILES&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt;   &lt;span class="p"&gt;$(&lt;/span&gt;foreach &lt;span class="nb"&gt;dir&lt;/span&gt;,&lt;span class="p"&gt;$(&lt;/span&gt;SOURCES&lt;span class="p"&gt;)&lt;/span&gt;,&lt;span class="p"&gt;$(&lt;/span&gt;notdir &lt;span class="p"&gt;$(&lt;/span&gt;wildcard &lt;span class="p"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;dir&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;/&lt;span class="k"&gt;*&lt;/span&gt;.s&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="nv"&gt;BINFILES&lt;/span&gt;    &lt;span class="o"&gt;:=&lt;/span&gt;  &lt;span class="p"&gt;$(&lt;/span&gt;foreach &lt;span class="nb"&gt;dir&lt;/span&gt;,&lt;span class="p"&gt;$(&lt;/span&gt;DATA&lt;span class="p"&gt;)&lt;/span&gt;,&lt;span class="p"&gt;$(&lt;/span&gt;notdir &lt;span class="p"&gt;$(&lt;/span&gt;wildcard &lt;span class="p"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;dir&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;/&lt;span class="k"&gt;*&lt;/span&gt;.&lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;

&lt;span class="k"&gt;ifneq&lt;/span&gt; &lt;span class="nv"&gt;($(strip $(MUSIC)),)&lt;/span&gt;
    &lt;span class="k"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;AUDIOFILES&lt;/span&gt;   &lt;span class="o"&gt;:=&lt;/span&gt;  &lt;span class="p"&gt;$(&lt;/span&gt;foreach &lt;span class="nb"&gt;dir&lt;/span&gt;,&lt;span class="p"&gt;$(&lt;/span&gt;notdir &lt;span class="p"&gt;$(&lt;/span&gt;wildcard &lt;span class="p"&gt;$(&lt;/span&gt;MUSIC&lt;span class="p"&gt;)&lt;/span&gt;/&lt;span class="k"&gt;*&lt;/span&gt;.&lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;,&lt;span class="p"&gt;$(&lt;/span&gt;CURDIR&lt;span class="p"&gt;)&lt;/span&gt;/&lt;span class="p"&gt;$(&lt;/span&gt;MUSIC&lt;span class="p"&gt;)&lt;/span&gt;/&lt;span class="p"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;dir&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="nv"&gt;BINFILES&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; soundbank.bin
&lt;span class="k"&gt;endif&lt;/span&gt;

&lt;span class="c"&gt;#---------------------------------------------------------------------------------
# use CXX for linking C++ projects, CC for standard C
#---------------------------------------------------------------------------------
&lt;/span&gt;&lt;span class="k"&gt;ifeq&lt;/span&gt; &lt;span class="nv"&gt;($(strip $(CPPFILES)),)&lt;/span&gt;
&lt;span class="c"&gt;#---------------------------------------------------------------------------------
&lt;/span&gt; &lt;span class="k"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;LD&lt;/span&gt;   &lt;span class="o"&gt;:=&lt;/span&gt;  &lt;span class="p"&gt;$(&lt;/span&gt;CC&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c"&gt;#---------------------------------------------------------------------------------
&lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;
&lt;span class="c"&gt;#---------------------------------------------------------------------------------
&lt;/span&gt; &lt;span class="k"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;LD&lt;/span&gt;   &lt;span class="o"&gt;:=&lt;/span&gt;  &lt;span class="p"&gt;$(&lt;/span&gt;CXX&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c"&gt;#---------------------------------------------------------------------------------
&lt;/span&gt;&lt;span class="k"&gt;endif&lt;/span&gt;
&lt;span class="c"&gt;#---------------------------------------------------------------------------------
&lt;/span&gt;
&lt;span class="k"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;OFILES_BIN&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;$(&lt;/span&gt;addsuffix .o,&lt;span class="p"&gt;$(&lt;/span&gt;BINFILES&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="k"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;OFILES_SOURCES&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;$(&lt;/span&gt;CPPFILES:.cpp&lt;span class="o"&gt;=&lt;/span&gt;.o&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;$(&lt;/span&gt;CFILES:.c&lt;span class="o"&gt;=&lt;/span&gt;.o&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;$(&lt;/span&gt;SFILES:.s&lt;span class="o"&gt;=&lt;/span&gt;.o&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;OFILES&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;$(&lt;/span&gt;OFILES_BIN&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;$(&lt;/span&gt;OFILES_SOURCES&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;HFILES&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;$(&lt;/span&gt;addsuffix .h,&lt;span class="p"&gt;$(&lt;/span&gt;subst .,_,&lt;span class="p"&gt;$(&lt;/span&gt;BINFILES&lt;span class="p"&gt;)))&lt;/span&gt;

&lt;span class="k"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;INCLUDE&lt;/span&gt;  &lt;span class="o"&gt;:=&lt;/span&gt;  &lt;span class="p"&gt;$(&lt;/span&gt;foreach &lt;span class="nb"&gt;dir&lt;/span&gt;,&lt;span class="p"&gt;$(&lt;/span&gt;INCLUDES&lt;span class="p"&gt;)&lt;/span&gt;,-iquote &lt;span class="p"&gt;$(&lt;/span&gt;CURDIR&lt;span class="p"&gt;)&lt;/span&gt;/&lt;span class="p"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;dir&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
                    &lt;span class="p"&gt;$(&lt;/span&gt;foreach &lt;span class="nb"&gt;dir&lt;/span&gt;,&lt;span class="p"&gt;$(&lt;/span&gt;LIBDIRS&lt;span class="p"&gt;)&lt;/span&gt;,-I&lt;span class="p"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;dir&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;/include&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
                    &lt;span class="nt"&gt;-I&lt;/span&gt;&lt;span class="p"&gt;$(&lt;/span&gt;CURDIR&lt;span class="p"&gt;)&lt;/span&gt;/&lt;span class="p"&gt;$(&lt;/span&gt;BUILD&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;LIBPATHS&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt;  &lt;span class="p"&gt;$(&lt;/span&gt;foreach &lt;span class="nb"&gt;dir&lt;/span&gt;,&lt;span class="p"&gt;$(&lt;/span&gt;LIBDIRS&lt;span class="p"&gt;)&lt;/span&gt;,-L&lt;span class="p"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;dir&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;/lib&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nl"&gt;.PHONY&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;$(BUILD) clean&lt;/span&gt;

&lt;span class="c"&gt;#---------------------------------------------------------------------------------
&lt;/span&gt;&lt;span class="nl"&gt;$(BUILD)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nv"&gt;$@&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="nv"&gt;$@&lt;/span&gt;
    &lt;span class="p"&gt;@$(&lt;/span&gt;MAKE&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nt"&gt;--no-print-directory&lt;/span&gt; &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="p"&gt;$(&lt;/span&gt;BUILD&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="p"&gt;$(&lt;/span&gt;CURDIR&lt;span class="p"&gt;)&lt;/span&gt;/Makefile

&lt;span class="c"&gt;#---------------------------------------------------------------------------------
&lt;/span&gt;&lt;span class="nl"&gt;clean&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nb"&gt;echo &lt;/span&gt;clean ...
    &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-fr&lt;/span&gt; &lt;span class="p"&gt;$(&lt;/span&gt;BUILD&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;$(&lt;/span&gt;TARGET&lt;span class="p"&gt;)&lt;/span&gt;.elf &lt;span class="p"&gt;$(&lt;/span&gt;TARGET&lt;span class="p"&gt;)&lt;/span&gt;.gba

&lt;span class="c"&gt;#---------------------------------------------------------------------------------
&lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;

&lt;span class="c"&gt;#---------------------------------------------------------------------------------
# main targets
#---------------------------------------------------------------------------------
&lt;/span&gt;
&lt;span class="nl"&gt;$(OUTPUT).gba   &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;   &lt;span class="nf"&gt;$(OUTPUT).elf&lt;/span&gt;

&lt;span class="nl"&gt;$(OUTPUT).elf   &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;   &lt;span class="nf"&gt;$(OFILES)&lt;/span&gt;

&lt;span class="nl"&gt;$(OFILES_SOURCES) &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;$(HFILES)&lt;/span&gt;

&lt;span class="c"&gt;#---------------------------------------------------------------------------------
# The bin2o rule should be copied and modified
# for each extension used in the data directories
#---------------------------------------------------------------------------------
&lt;/span&gt;
&lt;span class="c"&gt;#---------------------------------------------------------------------------------
# rule to build soundbank from music files
#---------------------------------------------------------------------------------
&lt;/span&gt;&lt;span class="nl"&gt;soundbank.bin soundbank.h &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;$(AUDIOFILES)&lt;/span&gt;
&lt;span class="c"&gt;#---------------------------------------------------------------------------------
&lt;/span&gt; &lt;span class="err"&gt;@mmutil&lt;/span&gt; &lt;span class="err"&gt;$^&lt;/span&gt; &lt;span class="err"&gt;-osoundbank.bin&lt;/span&gt; &lt;span class="err"&gt;-hsoundbank.h&lt;/span&gt;

&lt;span class="c"&gt;#---------------------------------------------------------------------------------
# This rule links in binary data with the .bin extension
#---------------------------------------------------------------------------------
&lt;/span&gt;&lt;span class="nl"&gt;%.bin.o %_bin.h &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;   &lt;span class="nf"&gt;%.bin&lt;/span&gt;
&lt;span class="c"&gt;#---------------------------------------------------------------------------------
&lt;/span&gt; &lt;span class="err"&gt;@echo&lt;/span&gt; &lt;span class="nf"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;notdir&lt;/span&gt; &lt;span class="nv"&gt;$&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="err"&gt;@$(bin2o)&lt;/span&gt;

&lt;span class="k"&gt;-include&lt;/span&gt;&lt;span class="sx"&gt; $(DEPSDIR)/*.d&lt;/span&gt;
&lt;span class="c"&gt;#---------------------------------------------------------------------------------------
&lt;/span&gt;&lt;span class="k"&gt;endif&lt;/span&gt;
&lt;span class="c"&gt;#---------------------------------------------------------------------------------------
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This template include all necessary things to compile and generate a rom, for now, the most important lines are:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight make"&gt;&lt;code&gt;&lt;span class="nv"&gt;TARGET&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; rom/&lt;span class="p"&gt;$(&lt;/span&gt;notdir &lt;span class="p"&gt;$(&lt;/span&gt;CURDIR&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="nv"&gt;BUILD&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; build
&lt;span class="nv"&gt;SOURCES&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; src
&lt;span class="nv"&gt;INCLUDES&lt;/span&gt;    &lt;span class="o"&gt;:=&lt;/span&gt; include
&lt;span class="nv"&gt;DATA&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt;
&lt;span class="nv"&gt;MUSIC&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That are the directories where you’re going to write your code and generate the output. Create the &lt;strong&gt;rom, build, src&lt;/strong&gt; and  &lt;strong&gt;include&lt;/strong&gt; folders.&lt;/p&gt;

&lt;p&gt;Inside  &lt;strong&gt;src&lt;/strong&gt; directory, create a new file named  &lt;strong&gt;hello.c&lt;/strong&gt; and write the next code&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mh"&gt;0x04000000&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mh"&gt;0x0403&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;short&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mh"&gt;0x06000000&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;120&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;240&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mh"&gt;0x001F&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;short&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mh"&gt;0x06000000&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;136&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;240&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mh"&gt;0x03E0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;short&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mh"&gt;0x06000000&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;120&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;96&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;240&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mh"&gt;0x7C00&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This code show three points in the screen, we are going to use only to test our environment.&lt;/p&gt;

&lt;p&gt;Now is time to compile!&lt;/p&gt;

&lt;p&gt;In your terminal, write this&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;make
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And if you see this message&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;linking cartridge
built ... hellogba.gba
ROM fixed!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your environment is ready to work with. In the  &lt;strong&gt;rom ** folder, you are going to see two files,  **hello.gba&lt;/strong&gt; and  &lt;strong&gt;hello.elf&lt;/strong&gt; , the last one is util for debugging.&lt;/p&gt;

&lt;p&gt;Now we need an emulator to test our “game”.&lt;/p&gt;

&lt;p&gt;I am using  &lt;strong&gt;mGBA&lt;/strong&gt; and you can download it here &lt;a href="https://mgba.io/" rel="noopener noreferrer"&gt;https://mgba.io/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Load the  &lt;strong&gt;hello.gba&lt;/strong&gt; in the emulator and you should see this screen&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6YbcxGtl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://giovanni.codes/wp-content/uploads/2020/01/hellogba-1024x785.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6YbcxGtl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://giovanni.codes/wp-content/uploads/2020/01/hellogba-1024x785.png" width="800" height="613"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, you are ready to create GBA games!&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;p&gt;Some resources to start GBA development&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/channel/UCQvQbVuWMM7OYTVrmGQq0hA" rel="noopener noreferrer"&gt;https://www.youtube.com/channel/UCQvQbVuWMM7OYTVrmGQq0hA&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.coranac.com/tonc/text/toc.htm" rel="noopener noreferrer"&gt;http://www.coranac.com/tonc/text/toc.htm&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.loirak.com/gameboy/gbatutor.php" rel="noopener noreferrer"&gt;http://www.loirak.com/gameboy/gbatutor.php&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/gbdev/awesome-gbadev" rel="noopener noreferrer"&gt;https://github.com/gbdev/awesome-gbadev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.reinterpretcast.com/writing-a-game-boy-advance-game" rel="noopener noreferrer"&gt;https://www.reinterpretcast.com/writing-a-game-boy-advance-game&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://giovanni.codes/gba-development-setup-in-macos/" rel="noopener noreferrer"&gt;GBA Development setup in macOS&lt;/a&gt; appeared first on &lt;a href="https://giovanni.codes" rel="noopener noreferrer"&gt;Giovanni Codes&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NjWlq7eI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/http://feeds.feedburner.com/%7Er/giovannicodes/%7E4/fCAhCMB04a8" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NjWlq7eI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/http://feeds.feedburner.com/%7Er/giovannicodes/%7E4/fCAhCMB04a8" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>c</category>
      <category>gba</category>
    </item>
    <item>
      <title>OpenGL Setup in macOS</title>
      <dc:creator>Giovanni Cortés</dc:creator>
      <pubDate>Tue, 10 Dec 2019 18:25:23 +0000</pubDate>
      <link>https://dev.to/gidrek/opengl-setup-in-macos-48cl</link>
      <guid>https://dev.to/gidrek/opengl-setup-in-macos-48cl</guid>
      <description>&lt;p&gt;We have &lt;a href="https://giovanni.codes/sfml-2-5-1-setup-on-macos-with-clion/" rel="noopener noreferrer"&gt;configured SFML&lt;/a&gt; in macOS, now we’re going to configure OpenGL with macOS and Xcode.&lt;/p&gt;

&lt;p&gt;First, you need to install GLFW&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;brew install glfw
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, you need to download GLAD to get the OpenGL headers: Use &lt;strong&gt;gl&lt;/strong&gt; version 4.1 if you want to be compatible with macOS and in Profile select &lt;strong&gt;Core.&lt;/strong&gt; Click in &lt;strong&gt;Generate.&lt;/strong&gt; Download the &lt;strong&gt;glad.zip&lt;/strong&gt; and unzip in your Download folder.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://glad.dav1d.de" rel="noopener noreferrer"&gt;https://glad.dav1d.de&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you are downloaded and unzipped the folder, put the &lt;strong&gt;glad&lt;/strong&gt; and &lt;strong&gt;KHR&lt;/strong&gt; folders in the &lt;strong&gt;/usr/local/include&lt;/strong&gt; directory of your mac.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating the Xcode Project
&lt;/h2&gt;

&lt;p&gt;After installed GLFW and downloading the glad files, is time to create the XCode project.&lt;/p&gt;

&lt;p&gt;Create a new Project and &lt;strong&gt;macOS&lt;/strong&gt; and &lt;strong&gt;Command Line Tool,&lt;/strong&gt; then click on &lt;strong&gt;Next&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Kq5Hr5qS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://giovanni.codes/wp-content/uploads/2019/12/create-command-line-took-1024x735.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Kq5Hr5qS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://giovanni.codes/wp-content/uploads/2019/12/create-command-line-took-1024x735.png" width="800" height="574"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then, put a name to your project and select C++ as language, next and save the project&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Hl0wBVPG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://giovanni.codes/wp-content/uploads/2019/12/create-project-name-xcode-opengl-1024x593.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Hl0wBVPG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://giovanni.codes/wp-content/uploads/2019/12/create-project-name-xcode-opengl-1024x593.png" width="800" height="463"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the zip that you downloaded, you will have a glad.c file, add that file to your project&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Off75NAG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://giovanni.codes/wp-content/uploads/2019/12/glad-to-xcde.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Off75NAG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://giovanni.codes/wp-content/uploads/2019/12/glad-to-xcde.png" width="516" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We need to configure Xcode to find the libraries that we added, so in your Xcode, select the Project Target and then &lt;strong&gt;Build Settings&lt;/strong&gt; and in &lt;strong&gt;Header Search Paths&lt;/strong&gt; add &lt;strong&gt;/usr/local/include&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bif9Bzzg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://giovanni.codes/wp-content/uploads/2019/12/header-search-paths-1024x539.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bif9Bzzg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://giovanni.codes/wp-content/uploads/2019/12/header-search-paths-1024x539.png" width="800" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, in &lt;strong&gt;Framework and Libraries&lt;/strong&gt; you need to add the &lt;strong&gt;libglfw&lt;/strong&gt; library, so clic on + symbol and add the library that you will find in &lt;strong&gt;/usr/local/Cellar/glfw/3.3/lib&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--blrQpbTF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://giovanni.codes/wp-content/uploads/2019/12/lib-cellar-glfw-1024x286.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--blrQpbTF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://giovanni.codes/wp-content/uploads/2019/12/lib-cellar-glfw-1024x286.png" width="800" height="223"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, in the &lt;strong&gt;main.cpp&lt;/strong&gt; file, copy the follow code to test OpenGL&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;glad/glad.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;GLFW/glfw3.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;framebuffer_size_callback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;GLFWwindow&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;GLFWwindow&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// Initialize the library&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;glfwInit&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// Define version and compatibility settings&lt;/span&gt;
    &lt;span class="n"&gt;glfwWindowHint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;GLFW_CONTEXT_VERSION_MAJOR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;glfwWindowHint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;GLFW_CONTEXT_VERSION_MINOR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;glfwWindowHint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;GLFW_OPENGL_PROFILE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;GLFW_OPENGL_CORE_PROFILE&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;glfwWindowHint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;GLFW_OPENGL_FORWARD_COMPAT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;GL_TRUE&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Create a windowed mode window and its OpenGL context&lt;/span&gt;
    &lt;span class="n"&gt;window&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;glfwCreateWindow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;640&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;480&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Hello World"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"Failed to create GLFW window"&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;glfwTerminate&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Mathe the window's context current&lt;/span&gt;
    &lt;span class="n"&gt;glfwMakeContextCurrent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;glfwSetFramebufferSizeCallback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;framebuffer_size_callback&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Initialize the OpenGL API with GLAD&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;gladLoadGLLoader&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;GLADloadproc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;glfwGetProcAddress&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"Failed to initialize GLAD"&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Loop until the user closes the window&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;glfwWindowShouldClose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Render here!&lt;/span&gt;
        &lt;span class="n"&gt;glClear&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;GL_COLOR_BUFFER_BIT&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// Swap front and back buffers&lt;/span&gt;
        &lt;span class="n"&gt;glfwSwapBuffers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// Poll for and process events&lt;/span&gt;
        &lt;span class="n"&gt;glfwPollEvents&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;glfwTerminate&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// glfw: whenever the window size changed (by OS or user resize) this callback function executes&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;framebuffer_size_callback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;GLFWwindow&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// make sure the viewport matches the new window dimensions; note that width&lt;/span&gt;
    &lt;span class="c1"&gt;// and height will be significantly larger than specified on retina displays&lt;/span&gt;
    &lt;span class="n"&gt;glViewport&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you are in Catalina and run the project, your are going to see an error, that is because the library has not the permissions to run in your mac, so you will need to sign it to run.&lt;/p&gt;

&lt;p&gt;In the terminal copy and paste the command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;codesign -f -s "your@email.com" /usr/local/Cellar/glfw/3.3/lib/libglfw.3.3.dylib
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, run the project again and you should see the window (&lt;a href="https://s.w.org/images/core/emoji/12.0.0-1/72x72/1f642.png" rel="noopener noreferrer"&gt;https://s.w.org/images/core/emoji/12.0.0-1/72x72/1f642.png&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NQGaa12Z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://giovanni.codes/wp-content/uploads/2019/12/Screenshot-2019-12-10-11.55.10-1024x836.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NQGaa12Z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://giovanni.codes/wp-content/uploads/2019/12/Screenshot-2019-12-10-11.55.10-1024x836.png" width="800" height="653"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now you will be able to play with OpenGL &lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fee02z822yt0l19fsu8k8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fee02z822yt0l19fsu8k8.png" alt="🙂" width="72" height="72"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://giovanni.codes/opengl-setup-in-macos/" rel="noopener noreferrer"&gt;OpenGL Setup in macOS&lt;/a&gt; appeared first on &lt;a href="https://giovanni.codes" rel="noopener noreferrer"&gt;Giovanni Codes&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Ckvn6pnA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/http://feeds.feedburner.com/%7Er/giovannicodes/%7E4/xewtBiaxBNg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Ckvn6pnA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/http://feeds.feedburner.com/%7Er/giovannicodes/%7E4/xewtBiaxBNg" width="1" height="1"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>opengl</category>
      <category>cpp</category>
    </item>
    <item>
      <title>About my learning of GameDev</title>
      <dc:creator>Giovanni Cortés</dc:creator>
      <pubDate>Thu, 31 Oct 2019 03:17:22 +0000</pubDate>
      <link>https://dev.to/gidrek/about-my-learning-of-gamedev-29h8</link>
      <guid>https://dev.to/gidrek/about-my-learning-of-gamedev-29h8</guid>
      <description>&lt;p&gt;For a long time I wanted to create video games; In fact, it was thanks to RPG Maker that I start to learn programming and I liked it, and that’s why I became a software developer&lt;/p&gt;

&lt;p&gt;After a while I finally set out to really develop a game and release something, more than anything like a hobby, since I like everything that involves the game dev and also because it is very different from traditional programming.&lt;/p&gt;

&lt;p&gt;I have tried some engines and sometimes I don’t feel at all comfortable, since I want to learn how everything works from inside and really learn how to program a video game without the help of engines.&lt;/p&gt;

&lt;p&gt;After thinking a little and trying some frameworks, I decided, at least for now, to focus on two topics&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MonoGame and C#&lt;/li&gt;
&lt;li&gt;C++ and GBA programing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The first is because I like C # and it is &lt;a href="https://giovanni.codes/why-c-sharp-is-one-of-my-favorite-language/" rel="noopener noreferrer"&gt;one of my favorite languages&lt;/a&gt;, and I also consider MonoGame an excellent and well designed framework that comes from XNA and there is a lot of documentation since then, and something very important, it is cross platform!&lt;/p&gt;

&lt;p&gt;Programming for GBA is because it is one of my favorite consoles. For me it would be a challenge, since you have to program at a very low level because we handle the hardware directly, even if C ++ is used you have to know its architecture. It is a great way to learn how computers work!&lt;/p&gt;

&lt;p&gt;With this in mind, I will be writing in my blog about what I am learning and also uploading games that I will create.&lt;/p&gt;

&lt;p&gt;So if you are interested in these two topics, you can follow my journey through my blog.&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://giovanni.codes/about-my-learning-of-gamedev/" rel="noopener noreferrer"&gt;About my learning of GameDev&lt;/a&gt; appeared first on &lt;a href="https://giovanni.codes" rel="noopener noreferrer"&gt;Giovanni Codes&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_0EJMwlq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/http://feeds.feedburner.com/%7Er/giovannicodes/%7E4/Df_sLp5wZYM" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_0EJMwlq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/http://feeds.feedburner.com/%7Er/giovannicodes/%7E4/Df_sLp5wZYM" width="1" height="1"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>monogame</category>
    </item>
    <item>
      <title>SFML 2.5.1 setup on macOS with CLion</title>
      <dc:creator>Giovanni Cortés</dc:creator>
      <pubDate>Tue, 29 Oct 2019 23:50:51 +0000</pubDate>
      <link>https://dev.to/gidrek/sfml-2-5-1-setup-on-macos-with-clion-505m</link>
      <guid>https://dev.to/gidrek/sfml-2-5-1-setup-on-macos-with-clion-505m</guid>
      <description>&lt;p&gt;I know that the title is very specific but that is the platform that I am doing some experiments with SFML.&lt;/p&gt;

&lt;p&gt;So, if you want to create games with SFML and you have macOS and you want to use CLion as IDE just follow the next steps:&lt;/p&gt;

&lt;h2&gt;
  
  
  Install SFML
&lt;/h2&gt;

&lt;p&gt;There are a lot ways to &lt;a href="https://www.sfml-dev.org/download.php" rel="noopener noreferrer"&gt;install SFML&lt;/a&gt; but the easiest is to install it with brew&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

brew install sfml


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;With this command, you’re going to install the version 2.5.1.&lt;/p&gt;

&lt;h2&gt;
  
  
  Create the project with CLion
&lt;/h2&gt;

&lt;p&gt;Now is time to create a new project with CLion, put the name that you want&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgiovanni.codes%2Fwp-content%2Fuploads%2F2019%2F10%2FCLion-SFML-Create-Project-1024x684.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgiovanni.codes%2Fwp-content%2Fuploads%2F2019%2F10%2FCLion-SFML-Create-Project-1024x684.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, you need to update the &lt;strong&gt;CMakeList.txt&lt;/strong&gt; to compile and link your project with the SFML libraries.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

cmake_minimum_required(VERSION 3.14)
project(HelloSFML)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

set(SOURCE_FILES main.cpp)
add_executable(HelloSFML ${SOURCE_FILES})
include_directories(/usr/local/include)

find_package(SFML 2.5 COMPONENTS system window graphics network audio REQUIRED)
include_directories(${SFML_INCLUDE_DIRS})
target_link_libraries(HelloSFML sfml-system sfml-window sfml-graphics sfml-audio sfml-network)


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;My recommendation is that you link the libraries that you are going to use, for example, only link and require  &lt;strong&gt;sfml-graphics&lt;/strong&gt; and &lt;strong&gt;sfml-audio&lt;/strong&gt; for example.&lt;/p&gt;

&lt;h2&gt;
  
  
  A simple SFML project
&lt;/h2&gt;

&lt;p&gt;Now , create a simple SFML code to check if all was installed correctly.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;

&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;SFML/Graphics.hpp&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;sf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;RenderWindow&lt;/span&gt; &lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;VideoMode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;640&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;480&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s"&gt;"SFML Application"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;sf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;CircleShape&lt;/span&gt; &lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setRadius&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;40.&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setPosition&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;100.&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;100.&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setFillColor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Color&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Cyan&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isOpen&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;sf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Event&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pollEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;sf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Event&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Closed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clear&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Run your project and you will see&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgiovanni.codes%2Fwp-content%2Fuploads%2F2019%2F10%2FSFML-Simple-Program.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgiovanni.codes%2Fwp-content%2Fuploads%2F2019%2F10%2FSFML-Simple-Program.png"&gt;&lt;/a&gt;Now you are ready to create games &lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fee02z822yt0l19fsu8k8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fee02z822yt0l19fsu8k8.png" alt="🙂"&gt;&lt;/a&gt; !&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://giovanni.codes/sfml-2-5-1-setup-on-macos-with-clion/" rel="noopener noreferrer"&gt;SFML 2.5.1 setup on macOS with CLion&lt;/a&gt; appeared first on &lt;a href="https://giovanni.codes" rel="noopener noreferrer"&gt;Giovanni Codes&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Ffeeds.feedburner.com%2F~r%2Fgiovannicodes%2F~4%2FTDttIoMqO8M" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Ffeeds.feedburner.com%2F~r%2Fgiovannicodes%2F~4%2FTDttIoMqO8M"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>clion</category>
      <category>sfml</category>
      <category>cpp</category>
    </item>
    <item>
      <title>Install Elixir in Debian/Ubuntu using precompiled packages</title>
      <dc:creator>Giovanni Cortés</dc:creator>
      <pubDate>Fri, 25 Oct 2019 18:24:17 +0000</pubDate>
      <link>https://dev.to/gidrek/install-elixir-in-debian-ubuntu-using-precompiled-packages-l99</link>
      <guid>https://dev.to/gidrek/install-elixir-in-debian-ubuntu-using-precompiled-packages-l99</guid>
      <description>&lt;p&gt;Today I had the necessity to update a production server using Debian to Elixir 1.9.2. The update from Elixir 1.6 to 1.9.2 was really easy but I will put my steps if anybody has the same requirement.&lt;/p&gt;

&lt;p&gt;We will need three packages installed in our server:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;wget&lt;/li&gt;
&lt;li&gt;unzip&lt;/li&gt;
&lt;li&gt;Erlang 20 or up&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Installing Elixir
&lt;/h2&gt;

&lt;p&gt;First, we need to go to our tmp folder to download the precompiled package, create a directory to unzip the package and then unzip it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd /tmp
wget https://github.com/elixir-lang/elixir/releases/download/v1.9.2/Precompiled.zip
mkdir elixir_precompiled
mv Precompiled.zip elixir_precompiled/
unzip Precompiled.zip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we have all the necessary stuff to get starting to install. We only need to move the bins and library from our temporal folder to &lt;strong&gt;/usr/local&lt;/strong&gt; , or another directory. Just you need to remember to add the directory where you going to put Elixir to your system &lt;strong&gt;PATH&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd bin
sudo cp elixir elixirc iex mix /usr/local/bin/
cd ..
cd lib
sudo cp -R * /usr/local/lib
cd ..
cd man
sudo cp * /usr/local/man
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With those steps, we installed Elixir and the manuals for help.&lt;/p&gt;

&lt;p&gt;As last check, we can see the elixir version in our system&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Erlang/OTP 22 [erts-10.5.2] [source] [64-bit] [smp:4:4] [ds:4:4:10] 
[async-threads:1] [hipe] [dtrace]

Elixir 1.9.2 (compiled with Erlang/OTP 22)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And that is all. We have the last version installed in our system&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://giovanni.codes/install-elixir-in-debian-ubuntu-using-precompiled-packages/" rel="noopener noreferrer"&gt;Install Elixir in Debian/Ubuntu using precompiled packages&lt;/a&gt; appeared first on &lt;a href="https://giovanni.codes" rel="noopener noreferrer"&gt;Giovanni Codes&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Ffeeds.feedburner.com%2F~r%2Fgiovannicodes%2F~4%2FVGCEKAcemt8" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Ffeeds.feedburner.com%2F~r%2Fgiovannicodes%2F~4%2FVGCEKAcemt8"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>elixir</category>
      <category>linux</category>
      <category>ubuntu</category>
    </item>
    <item>
      <title>Why C# is (one of) my favorite language?</title>
      <dc:creator>Giovanni Cortés</dc:creator>
      <pubDate>Thu, 14 Mar 2019 20:32:31 +0000</pubDate>
      <link>https://dev.to/gidrek/why-c-is-one-of-my-favorite-language-43m5</link>
      <guid>https://dev.to/gidrek/why-c-is-one-of-my-favorite-language-43m5</guid>
      <description>&lt;p&gt;My first approach with C# was when I was studying my career; a guy from Microsoft came to my school to do a chat about C# technologies and one of them was Windows Phone. So I started to learn C# and create Windows Phone apps (I won a Nokia for that :) ). &lt;/p&gt;

&lt;p&gt;After one year, I started to create C# videos on YouTube and was a popular channel in its time, now is abandoned, but I received very good comments about that course in YouTube, even of teachers that send their students to watch that videos.&lt;/p&gt;

&lt;p&gt;For some reasons, when I started my life as a professional developer I left C# and started to write apps for iOS, Python, Elixir, etc. But sometimes I had to write C# code for fixing some apps or for a job but just for 1 or 2 months. Whenever I got back to C# I feel very comfortable with the language, is like to return home. Now, that I'm doing a &lt;a href="https://dev.to/giovanni_cortes/getting-started-with-monogame-4534"&gt;tutorial of MonoGame&lt;/a&gt; I am using C# again and I am enjoying it. &lt;/p&gt;

&lt;p&gt;Today, I want to write why C# is one of my favorite languages and why I think that is a great language to work with&lt;/p&gt;

&lt;h2&gt;
  
  
  Is easy to learn
&lt;/h2&gt;

&lt;p&gt;Despite Python is the option to learn as the first language, I think that C# is better to understand the "low level" programming without the complexity of C or C++.&lt;/p&gt;

&lt;p&gt;Learn C# is not as complicated as other thinks, and because is very influenced by C and C++, once that you learned, you can change to another language very easy (I am able to read C++ code without even touched).&lt;/p&gt;

&lt;h2&gt;
  
  
  It is in a line between the old and the modern
&lt;/h2&gt;

&lt;p&gt;When you write C#, you have to deal with "old" for style or creating arrays with a fixed length. But you can create lambdas expressions, you have access to &lt;code&gt;foreach&lt;/code&gt; to go through a list, the string manipulation is very powerful etc.&lt;/p&gt;

&lt;p&gt;With C# you have the option to be traditional or write code with the more advanced features.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is very versatile
&lt;/h2&gt;

&lt;p&gt;In recent years, C# has become in an all-terrain language. You can write Windows Apps, iOS apps, Android, IoT, web sites, run in Arduino, even run in Linux.&lt;/p&gt;

&lt;p&gt;You can write games with Unity, MonoGame, Xenco and use it with Machine Learning.&lt;/p&gt;

&lt;p&gt;Thanks to its open source we can expect a lot of implementations, and if you learn C# you can use almost as you only language (I do not recommend this but is possible)&lt;/p&gt;

&lt;h2&gt;
  
  
  Microsoft Documentation
&lt;/h2&gt;

&lt;p&gt;I think that there is no better documentation than Microsoft Developer Site. Other pages like Apple Developer or Django are close but I feel that is not as extensive or comprehensive as Microsoft Docs.&lt;/p&gt;

&lt;p&gt;I learned a lot (and I still doing) only reading the Microsoft site and I found that my problem was resolved without touch StackOverflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  It is not Java
&lt;/h2&gt;

&lt;p&gt;Ok, this is not a valid reason(?)&lt;/p&gt;

&lt;p&gt;Well, that is a list of why C# is a language that I think deserve more love of the community. &lt;/p&gt;

&lt;p&gt;Do you like or dislike C#? &lt;/p&gt;

</description>
      <category>csharp</category>
    </item>
  </channel>
</rss>
