A minimal game engine for making games on and for Emacs.
This is my entry for the Lisp Jam at the Handmade Network Discord.
Watch the video here.
The engine offers functions that allows the following features
- Buffer management
- Draw canvas setup
- Basic text-based drawing functions
- Keyboard input
- Mouse input
- Audio output (Audio playing via external programs)
I made a couple of games for emacs. I had a lot of fun making those so I wanted to make a game engine that would allow me to make more.
A simple example program that detects keyboard movement and moves a player on the screen
(require 'emacs-game-engine)
;; Initialize the engine with the buffer name and number of cols and rows
(ege:init "Example Game" 80 24)
(setq player-pos-x 40)
(setq player-pos-y 12)
(ege:draw-text " Is any key pressed: " 2 1
'(:background "gray" :foreground "black"))
(ege:draw-text " Last pressed key: " 2 3
'(:background "gray" :foreground "black"))
(defun update()
"Game update function."
(if ege:key-pressed
(progn
(ege:draw-text " yes " 23 1
'(:background "red" :foreground "white"))
(ege:draw-rect 21 3 10 1 "-")
(ege:draw-text (concat " " ege:key-pressed " ")
21 3
'(:background "red" :foreground "white"))
(ege:draw-char "*" player-pos-x player-pos-y)
(cond ((or (string= ege:key-pressed "s")
(string= ege:key-pressed "<down>"))
(setq player-pos-y
(+ player-pos-y 1)))
((or (string= ege:key-pressed "w")
(string= ege:key-pressed "<up>"))
(setq player-pos-y
(- player-pos-y 1))))
(cond ((or (string= ege:key-pressed "d")
(string= ege:key-pressed "<right>"))
(setq player-pos-x
(+ player-pos-x 1)))
((or (string= ege:key-pressed "a")
(string= ege:key-pressed "<left>"))
(setq player-pos-x
(- player-pos-x 1)))))
(progn
(ege:draw-text " no " 23 1
'(:background "red" :foreground "white"))
))
(ege:draw-char "@" player-pos-x player-pos-y))
;; Registers the update function and sets the FPS to 24
(ege:register-update 'update 24)
There are more code examples in the examples folder. To run the examples, open the .el
file and run the eval-bufer
emacs command. Additionally, for the roguemacs-jam.el
example, you also need to run the roguemacs-start
command.
- coordinate.el - A separate emacs library I made that provides convenience functions for editing buffers through col and row coondinates.