faur
faur copied to clipboard
⚒️✨ My personal C games framework. 2D graphics, sound, inputs, states, ECS, and misc utils for data, files, math, memory, strings, time, and more. Builds for Linux, Windows, Web, and embedded devices...
Faur is my personal C framework for my hobby video games.
Features include software 2D graphics, abstractions for inputs and sound, application state management, entity-component-system model, and utilities to help with data, files, math, memory, strings, time, and more.
Faur builds native on Linux and cross-compiles for Web, Windows, and some embedded devices I like, including Arduino-based. The build system uses GNU Make 4.1 and Python 3.6 or later.
Dependencies & Path Setup
# Required
sudo apt install build-essential git python3
sudo apt install libsdl2-dev libsdl2-mixer-dev libpng-dev
# Optional
sudo apt install libsdl1.2-dev libsdl-mixer1.2-dev
sudo apt install ffmpeg python3-pil python3-serial python-is-python3
# Set FAUR_PATH, clone repo, and add tools to path
export FAUR_PATH="$HOME/faur"
git clone git://github.com/alxm/faur.git $FAUR_PATH
export PATH="$PATH:$FAUR_PATH/bin"
Hello, World
The sample project has two files, main.c
and Makefile
:
$ faur-new hello
$ tree hello/
hello/
├── build/
│ └── make/
│ └── Makefile
└── src/
└── main.c
$ cd hello/build/make/
$ make run
Move the square with the arrow keys or with a game controller:
hello/src/main.c
#include <faur.h>
void f_main(void)
{
static struct {
int x, y;
FButton *up, *down, *left, *right;
} context;
F_STATE_INIT
{
context.x = f_screen_sizeGetWidth() / 2;
context.y = f_screen_sizeGetHeight() / 2;
context.up = f_button_new();
f_button_bindKey(context.up, F_KEY_UP);
f_button_bindButton(context.up, NULL, F_BUTTON_UP);
context.down = f_button_new();
f_button_bindKey(context.down, F_KEY_DOWN);
f_button_bindButton(context.down, NULL, F_BUTTON_DOWN);
context.left = f_button_new();
f_button_bindKey(context.left, F_KEY_LEFT);
f_button_bindButton(context.left, NULL, F_BUTTON_LEFT);
context.right = f_button_new();
f_button_bindKey(context.right, F_KEY_RIGHT);
f_button_bindButton(context.right, NULL, F_BUTTON_RIGHT);
}
F_STATE_TICK
{
if(f_button_pressGet(context.up)) {
context.y--;
}
if(f_button_pressGet(context.down)) {
context.y++;
}
if(f_button_pressGet(context.left)) {
context.x--;
}
if(f_button_pressGet(context.right)) {
context.x++;
}
}
F_STATE_DRAW
{
f_color_colorSetHex(0xaaff88);
f_draw_fill();
f_color_colorSetHex(0xffaa44);
f_draw_rectangle(context.x - 40, context.y - 40, 80, 80);
}
F_STATE_FREE
{
f_button_free(context.up);
f_button_free(context.down);
f_button_free(context.left);
f_button_free(context.right);
}
}
hello/build/make/Makefile
F_CONFIG_APP_AUTHOR := <author>
F_CONFIG_APP_NAME := hello
include $(FAUR_PATH)/make/default.mk
Cross-Compile for Other Platforms
I started Faur by collecting my GP2X games' shared code into a library. Over time I added support for more platforms:
Platform | Toolchain | Support Libraries |
---|---|---|
Desktop | ||
Linux, FreeBSD | OS build tools | SDL 2.0, SDL_mixer 2.0, libpng 1.6 |
Windows | MinGW-w64 | SDL 2.0, SDL_mixer 2.0, libpng 1.6 |
Web (Wasm) | Emscripten | SDL 2.0, SDL_mixer 2.0, libpng 1.6 |
Embedded Linux | ||
GP2X, GP2X Wiz | Open2x SDK | SDL 1.2, SDL_mixer 1.2, libpng 1.2 |
Caanoo | GPH SDK | SDL 1.2, SDL_mixer 1.2, libpng 1.2 |
Open Pandora | Pandora SDK | SDL 1.2, SDL_mixer 1.2, libpng 1.2 |
Arduino | ||
Gamebuino META | Arduino 1.8.13, Arduino SAMD Boards 1.8.11, Gamebuino META Boards 1.2.2 | Gamebuino META 1.3 |
Odroid-GO | Arduino 1.8.13, Arduino ESP32 1.0.6 | ODROID-GO 1.0.0 |
The default toolchain paths are in make/global/sdk.mk
, and they can be overridden in a project Makefile or globally in ~/.config/faur/sdk.mk
. To build for different targets, change include $(FAUR_PATH)/make/default.mk
to use other files from $(FAUR_PATH)/make
.
License
Copyright 2010-2022 Alex Margarit ([email protected])
- Source code licensed under GNU GPL 3.0 (file
LICENSE
) - Other content licensed under CC BY-NC-ND 4.0 (file
media/CC-BY-NC-ND
)
Faur is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. The project is named after the old Romanian word faur, sometimes used in fables to mean wizard blacksmith. ⚒️✨
Contributing
This is my personal framework and test bed for ideas, and to that end it is a solo project. You are welcome to check it out and use it under the terms of the license, but I do not take pull requests to this repo.