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
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>
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);
}
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:
- macros for logging and debugging
- macros to wrap library functions and check for errors
- 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);
}
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
Top comments (0)