Skip to content
A fast clojure console library
Clojure GLSL Shell
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
doc
images
resources
src
test/zaffre
.gitignore
.travis.yml
CHANGELOG.md
LICENSE
README.md README example missing arg Dec 17, 2018
jar-run.sh
lein-form.clj
lein-run.sh
project.clj

README.md

Zaffre

A fast Clojure library for emulating a terminal

Zaffre is fast console library for drawing characters to a screen.

Screenshot using 2-bit tileset by Muziak

Features

  • It's fast. Zaffre uses LWJGL and OpenGL to render characters as fast as possible.
  • Unicode support (minus CJK code points)
  • CP437 tileset support (eg: loading Dwarf Fortress Wiki: Tileset repository)
  • Cross-platform codebase
  • Thread safe
  • Multiple fonts
  • Glyph stacking
  • Non-character tiles ie: sprites
  • Mix different font sizes

Screenshot using 16x16 Fantasy tileset by Jerom

Not Features

  • Effects
  • Animation
  • GUI control emulation

Usage

Add the dependency to your project:

[zaffre "0.4.0-SNAPSHOT"]

Quickstart

Runs a little hello world terminal

(ns examples.basic
  (:require [zaffre.terminal :as zat]
            [zaffre.glterminal :as zgl]
            [zaffre.events :as zevents]
            [zaffre.font :as zfont]
            [zaffre.tilesets :as ztiles]
            [zaffre.util :as zutil]
            [clojure.core.async :as async :refer [<! <!! go-loop]]))

(defn -main [& _]
   (zgl/create-terminal
     {:app {           ;; Setup a layer group `:app`
       :layers [:text] ;; With one layer `:text`
       :columns 16     ;; 16 characters wide
       :rows 16        ;; 16 characters tall
       :pos [0 0]      ;; With no position offset
       :font (constantly ztiles/pastiche-16x16)}} ;; Give the group a nice font
     {:title "Zaffre demo"     ;; Set the window title
      :screen-width (* 16 16)  ;; Screen dimentions in pixels
      :screen-height (* 16 16)} ;; Since our font is 16x16 and our layer group
                                ;; is also 16x16
     (fn [terminal]     ;; Receive the terminal in a callback
       (let [last-key (atom nil)]   ;; Save the last key press in an atom
             ;; Every 33ms, draw a full frame
         (zat/do-frame terminal 33
           (let [key-in (or @last-key \?)]
             ;; For each frame
             (zat/clear! terminal) ;; Clear the terminal
             ;; Draw strings
             (zutil/put-string terminal :text 0 0 "Hello world")
             (zutil/put-string terminal :text 12 0 (str key-in))))
         ;; Receive key presses
         (zevents/add-event-listener terminal :keypress
           (fn [new-key]
             ;; Save last key
             (reset! last-key new-key)
             ;; Make the `q` key quit the application
             (case new-key
               \q (zat/destroy! terminal)
               nil)))))))

Screenshot

More Examples

Run with

lein run -m examples.basic

or

lein run -m examples.tileset

etc.

Got to https://github.com/aaron-santos/zaffre/tree/master/src/examples for more.

License

Copyright © 2016 Aaron Santos

Distributed under the MIT license.

You can’t perform that action at this time.