MyNixOS website logo
Description

A lightweight, cross-platform, OpenGL-based game engine.

FunGEn (Functional Game Engine) is a BSD-licensed, cross-platform, OpenGL-based, non-FRP game engine written in Haskell. Created by Andre Furtado in 2002, it's the oldest Haskell game engine, and with very few dependencies and two example games, it's one of the easiest ways to get started with Haskell game development.

The FunGEn library provides:

  • Initialization, updating, removing, rendering and grouping routines for game objects

  • Definition of a game background (or map), including texture-based maps and tile maps

  • Reading and intepretation of the player's keyboard and mouse input

  • Collision detection

  • Time-based functions and pre-defined game actions

  • Loading and displaying of 24-bit bitmap files

  • Some debugging and game performance evaluation facilities

This package receives only basic maintenance (see home page).

FunGEn (Functional Game Engine)

<a href="https://github.com/haskell-game/fungen/blob/master/examples/hello.hs#L1"

FunGEn is a BSD-licensed, cross-platform, OpenGL-based game engine written in Haskell. Created by Andre Furtado in 2002, it's the oldest Haskell game engine, and with very few dependencies and two example games, it's one of the easiest ways to get started with Haskell game development.

FunGEn provides:

  • Initialization, updating, removing, rendering and grouping routines for game objects
  • Definition of a game background (or map), including texture-based maps and tile maps
  • Reading and intepretation of the player's keyboard and mouse input
  • Collision detection
  • Time-based functions and pre-defined game actions
  • Loading and displaying of 24-bit bitmap files
  • Some debugging and game performance evaluation facilities

Limitations:

Simon Michael provides infrequent maintenance for this package, and chat support in #haskell-game on Matrix or Libera IRC (nick: sm). There is no issue tracker and no email support.

I don't have time to do more with it, but this package is still useful and could attract users, given a little TLC and a slick home page. Would you like to take it over ? Maintainers or co-maintainers wanted!

<a href="https://github.com/haskell-game/fungen/blob/master/examples/pong/pong.hs#L1"

<a href="https://github.com/haskell-game/fungen/blob/master/examples/worms/worms.hs#L1"

Install

Install the OpenGL C libraries, if not already installed on your system. Eg on Ubuntu/Debian:

$ sudo apt install freeglut3-dev

If you don't know whether they are already installed, try the next step and watch for "missing C library" errors.

Latest released:

(changes)

$ stack install FunGEn    # or cabal install

Make sure ~/.local/bin (stack) or ~/.cabal/bin (cabal) or the windows equivalent are in your shell PATH, then run the example games:

$ fungen-hello
$ fungen-pong
$ fungen-worms

Latest unreleased:

(changes)

$ git clone https://github.com/haskell-game/fungen
$ cd fungen
$ stack build    # or cabal build
$ stack exec fungen-hello
$ stack exec fungen-pong
$ stack exec fungen-worms

Docs

History

Excerpts from Andre's website in 2002:

What is a game engine?

A game engine can be considered as a library that provides game facilities to a game programmer. When using a game engine, the programmer must specify when the game events happen, rather than how they are implemented. A same functionality may have its implementation varying from platform to platform, in the case the engine is platform-independent. The main advantage of a game engine is that it can be reused to the development of many different kind of games, in an automated way, saving a lot of programming time.

Why Haskell?

We believe that Haskell is a great language to develop games, because of its high level of abstraction and the generation of a more concise, elegant and shorter code. This is great for code maintenance and understanding. Combining the power of Haskell with the facilities provided by game engines seems a promising project. You can find more info on Haskell in its official site.

What is HOpenGL?

HOpenGL stands for Haskell Open Graphics Library. Actually, it is a binding to one of the most famous graphics libraries around the world (OpenGL) and its auxiliary toolkit (GLUT). In other words, it makes possible to call OpenGL/GLUT routines (which were written in the C language) when programming in Haskell. You can find more info on HOpenGL in my HOpenGL Tutorial site, or in its official site.

Current 2002 Status

Some feedback indicated that the first version of FunGEn was not as "functional" as it was desired: some game issues were still being dealt through an imperative fashion. This way, the authors of this project decided to change the game engine philosophy: programmers should describe a game as a set of "specifications" rather than defining its behavior imperatively. One plausible alternative for accomplishing this task is porting the Clean Game Library (CGL) to Haskell, adding some FunGEn specific features. Hence, this is the actual status of the FunGEn project: it is being rebuilt in order to provide game programming mechanisms following the CGL concepts. This really demands some time, but the authors expect a new version to be released soon.

... PLEASE NOTE: this is the very first version of FunGEn, and it was released just to get some feedback from game programmers. You are strongly invited to tell your game programming experiences with FunGEn, helping us to release a definitive, stable version). Ok, after this disclaimer, please fell yourself free to take a quick tour in the site; it contains a lot of useful information for those who are really interested in trying a new game programming experience. Nice coding...

Todo

Here you have a list of some upcoming FunGEn features, and some other desired features (but with no implementation prevision yet).

  • Support map scrolling (coming soon);
  • Support mouse input management (coming soon);
  • Make a polygon map definition avaiable (coming soon);
  • Make sound avaible to non-Win32 platforms;
  • Create, if possible, some operators to avoid the excessive (x <- ...) syntax;
  • Support auto-animated objects;
  • Create a GLUT independent font support (or perhaps extend it);
  • Improve the installation process;
  • Upgrade FunGEn to be both a 2D (bidimensional) and 2D 1/2 (bi and a half dimensional) engine;
  • Create a map editor/generator (possibly in other language, or using the brand new Haskell GUI...);
  • Take courage to start thinking about the 3D world...

Would you like to suggest a feature? Feel free to do it. Would you like to implement a feature? Please do it! Keep in touch.

Credits

FunGEn was created by Andre Furtado, Computation Science graduation student at the Informatics Center (CIn) of the Federal University of Pernambuco (UFPE), as part of a Scientific Iniciation (PIBIC/CNPq) research project (Creating a Game Platform Using Haskell), oriented by lecturer Andre Santos (PhD, 1995, University of Glasgow), who was responsible for figuring out a lot of FunGEn implementation details.

I would like to thank also the following people who contributed for the development of FunGEn:

  • Sven Panne
  • Jay Cox
  • Geber Ramalho
  • Carlos Andre Pessoa
  • Charles Madeira
  • Monique Monteiro
  • The people at the Haskell mailing lists

FunGEn can be distributed freely, 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. I would thank you if you cite my name and this site if you are going to use FunGEn for other things besides home programming.

Metadata

Version

1.2

Executables (3)

  • bin/fungen-worms
  • bin/fungen-hello
  • bin/fungen-pong

Platforms (75)

    Darwin
    FreeBSD
    Genode
    GHCJS
    Linux
    MMIXware
    NetBSD
    none
    OpenBSD
    Redox
    Solaris
    WASI
    Windows
Show all
  • aarch64-darwin
  • aarch64-genode
  • aarch64-linux
  • aarch64-netbsd
  • aarch64-none
  • aarch64_be-none
  • arm-none
  • armv5tel-linux
  • armv6l-linux
  • armv6l-netbsd
  • armv6l-none
  • armv7a-darwin
  • armv7a-linux
  • armv7a-netbsd
  • armv7l-linux
  • armv7l-netbsd
  • avr-none
  • i686-cygwin
  • i686-darwin
  • i686-freebsd
  • i686-genode
  • i686-linux
  • i686-netbsd
  • i686-none
  • i686-openbsd
  • i686-windows
  • javascript-ghcjs
  • loongarch64-linux
  • m68k-linux
  • m68k-netbsd
  • m68k-none
  • microblaze-linux
  • microblaze-none
  • microblazeel-linux
  • microblazeel-none
  • mips-linux
  • mips-none
  • mips64-linux
  • mips64-none
  • mips64el-linux
  • mipsel-linux
  • mipsel-netbsd
  • mmix-mmixware
  • msp430-none
  • or1k-none
  • powerpc-netbsd
  • powerpc-none
  • powerpc64-linux
  • powerpc64le-linux
  • powerpcle-none
  • riscv32-linux
  • riscv32-netbsd
  • riscv32-none
  • riscv64-linux
  • riscv64-netbsd
  • riscv64-none
  • rx-none
  • s390-linux
  • s390-none
  • s390x-linux
  • s390x-none
  • vc4-none
  • wasm32-wasi
  • wasm64-wasi
  • x86_64-cygwin
  • x86_64-darwin
  • x86_64-freebsd
  • x86_64-genode
  • x86_64-linux
  • x86_64-netbsd
  • x86_64-none
  • x86_64-openbsd
  • x86_64-redox
  • x86_64-solaris
  • x86_64-windows