DEV Community

Sam Watkins for Game Dev From Scratch

Posted on • Edited on

2 2

kisskit: Simplifying Game Dev in C

I grew up programming in BASIC in the 1980s, and enjoyed a very simple API for graphics and sound. For example, this draws a line and a circle:

MOVE 100, 100
DRAW 300, 200
CIRCLE 300, 200, 50
Enter fullscreen mode Exit fullscreen mode

Image description

To do the same in modern JavaScript with HTML in the browser, without any helper functions, we would have to write:

<canvas id="myCanvas" width="800" height="600"
 style="width: 800px; height: 600px; background: black;"></canvas>
<script>
const canvas = document.getElementById('myCanvas');
const context = canvas.getContext('2d');

context.strokeStyle = 'white';

context.beginPath();
context.moveTo(100, 100);
context.lineTo(300, 200);
context.stroke();

context.beginPath();
context.arc(300, 200, 50, 0, 2 * Math.PI, false);
context.stroke();
</script>
Enter fullscreen mode Exit fullscreen mode

And in C with SDL2_gfx, we would need something like this:

#include <SDL.h>
#include <SDL2/SDL2_gfxPrimitives.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>

int main(void)
{
        int exit_status = EXIT_FAILURE;
        char *title = "SDL Demo";
        SDL_Window *window;
        SDL_Renderer *renderer;
        bool quit = 0;
        SDL_Event e;

        SDL_Init(SDL_INIT_VIDEO);
        window = SDL_CreateWindow(title, 50, 50, 800, 600, 0);
        renderer = SDL_CreateRenderer(window, -1,
                SDL_RENDERER_ACCELERATED |
                SDL_RENDERER_PRESENTVSYNC);
        if (!renderer)
                goto error;

        SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
        SDL_RenderClear(renderer);
        lineRGBA(renderer, 100, 100, 300, 200,
                 255, 255, 255, 255);
        circleRGBA(renderer, 300, 200, 50,
                   255, 255, 255, 255);

        SDL_RenderPresent(renderer);

        while (!quit) {
                SDL_WaitEvent(&e);
                if (e.type == SDL_QUIT)
                        quit = 1;
        }

        exit_status = EXIT_SUCCESS;
error:
        SDL_DestroyWindow(window);
        SDL_Quit();
        exit(exit_status);
}
Enter fullscreen mode Exit fullscreen mode

I don't want my kids to suffer so very much more than I did, so I'm putting together kisskit, a set of tools to help simplify C programming and game dev as much as possible.

KISS stands for "Keep it simple, stupid!" and this is very good advice for programming.

Kisskit is a work in progress. So far, it includes three main features:

  1. macros for logging and debugging
  2. macros to wrap library functions and check for errors
  3. a library called "basic" to enable writing simple games using SDL behind the scenes

Here is a comparison of a simple program written with and without our kiss.h macros for logging and error handling.

Returning to our original graphics challenge, here is the same program to draw a line and a circle using our basic library. All of the SDL boilerplate code is hidden behind the scenes, and our main program is simple enough that a child could write it.

The library uses a linking trick so that we can override only the functions that we need. In this case, just draw():

#include "basic.h"

void draw(void)
{
        line(100, 100, 300, 200);
        circle0(300, 200, 50);
}
Enter fullscreen mode Exit fullscreen mode

We are able to write simple code similar to BASIC, the Processing language, or p5.js, but in plain C.

In the next few posts, we'll show how we can draw pictures and make a simple game using this library.

Next post: Creating Drawings, by Thalia
Previous post: Basic Programming in C, by Sam
Contents: Game Dev From Scratch

Image of AssemblyAI tool

Challenge Submission: SpeechCraft - AI-Powered Speech Analysis for Better Communication

SpeechCraft is an advanced real-time speech analytics platform that transforms spoken words into actionable insights. Using cutting-edge AI technology from AssemblyAI, it provides instant transcription while analyzing multiple dimensions of speech performance.

Read full post

Top comments (0)

AWS Security LIVE!

Tune in for AWS Security LIVE!

Join AWS Security LIVE! for expert insights and actionable tips to protect your organization and keep security teams prepared.

Learn More

👋 Kindness is contagious

Immerse yourself in a wealth of knowledge with this piece, supported by the inclusive DEV Community—every developer, no matter where they are in their journey, is invited to contribute to our collective wisdom.

A simple “thank you” goes a long way—express your gratitude below in the comments!

Gathering insights enriches our journey on DEV and fortifies our community ties. Did you find this article valuable? Taking a moment to thank the author can have a significant impact.

Okay