alxm / faur

⚒️✨ 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.

Home Page:https://www.alxm.org

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Faur

Faur is my personal C framework for my hobby video games.

Features include software or accelerated 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 like the GP2X and Gamebuino handhelds. The build system uses GNU Make 4.1 and Python 3.6 or later.

Install on Debian-based Linux

$ sudo apt install build-essential git python3 python3-pil
$ sudo apt install libsdl2-dev libsdl2-mixer-dev libpng-dev
$ git clone https://github.com/alxm/faur.git

Create New Project

$ faur/bin/faur-new --name hello
$ cd hello/build/make
$ make run FAUR_PATH=../../../faur

Hello, World screenshot

Move the square with the arrow keys or with a game controller.

Project Files

$ tree hello/

hello/
├── build/
│   └── make/
│       └── Makefile
└── src/
    └── main.c

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, F_BUTTON_UP);

        context.down = f_button_new();
        f_button_bindKey(context.down, F_KEY_DOWN);
        f_button_bindButton(context.down, F_BUTTON_DOWN);

        context.left = f_button_new();
        f_button_bindKey(context.left, F_KEY_LEFT);
        f_button_bindButton(context.left, F_BUTTON_LEFT);

        context.right = f_button_new();
        f_button_bindKey(context.right, F_KEY_RIGHT);
        f_button_bindButton(context.right, 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 := <name>
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 static library. Over time I added support for more platforms:

Target Host Toolchain Dependencies More Info
Desktop
Linux (SDL 2) Linux OS build tools Debian: libsdl2-dev libsdl2-mixer-dev libpng-dev valgrind

Fedora: SDL2-devel SDL2_mixer-devel libpng-devel libubsan valgrind
Linux (SDL 1.2) Linux OS build tools Debian: libsdl1.2-dev libsdl-mixer1.2-dev libpng-dev valgrind

Fedora: sdl12-compat-devel SDL_mixer-devel libpng-devel libubsan valgrind
FreeBSD FreeBSD OS build tools gmake devel/sdl20 audio/sdl2_mixer Building on FreeBSD
Windows Linux MinGW-w64 Debian: mingw-w64 libz-mingw-w64-dev and local builds of SDL2 SDL2_mixer libpng

Fedora: mingw64-gcc mingw64-gcc-c++ mingw64-SDL2 mingw64-SDL2_mixer mingw64-libpng mingw64-zlib
Cross-compiling with MinGW
Web (Wasm) Linux Emscripten Emscripten Notes
Embedded Linux
GP2X, GP2X Wiz Linux Open2x SDK Debian: ia32-libs Open2x Project
Caanoo Linux GPH SDK Debian: ia32-libs Caanoo SDK for Linux
Open Pandora Linux Pandora SDK Debian: ia32-libs libxml2-utils Open Pandora Forums
Arduino
Gamebuino META Linux Arduino 1.8.13, Arduino SAMD Boards 1.8.11, Gamebuino META Boards 1.2.2 Arduino: Gamebuino META 1.3

Debian: ffmpeg

Fedora: ffmpeg-free
Gamebuino META Makefile
ODROID-GO Linux Arduino 1.8.13, Arduino-ESP32 1.0.6 Arduino: ODROID-GO 1.0.0

Debian: python3-serial python-is-python3

Fedora: python3-pyserial
ODROID Wiki

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-2024 Alex Margarit (alex@alxm.org)

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 ideas playground, 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.

About

⚒️✨ 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.

https://www.alxm.org

License:GNU General Public License v3.0


Languages

Language:C 90.2%Language:Python 3.7%Language:Makefile 3.4%Language:C++ 1.7%Language:HTML 0.9%Language:Shell 0.0%