Home

Awesome

Zaffre

A fast Clojure library for emulating a terminal

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

<img src="https://cloud.githubusercontent.com/assets/1139945/14769786/a4815352-0a15-11e6-8d01-38d650a0a212.png" alt="Screenshot using 2-bit tileset by Muziak" title="Screenshot using 2-bit tileset by Muziak" align="right" />

Features

<img src="https://cloud.githubusercontent.com/assets/1139945/14769784/a40b1aa2-0a15-11e6-9252-8d6598e697bb.png" alt="Screenshot using 16x16 Fantasy tileset by Jerom" title="Screenshot using 16x16 Fantasy tileset by Jerom" align="right" />

Not Features

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)))))))
<img src="https://cloud.githubusercontent.com/assets/1139945/14769783/a3f2141c-0a15-11e6-9103-be02a9809c8c.png" alt="Screenshot" title="" />

More Examples

Run with

lein run -m examples.basic

or

lein run -m examples.tileset

etc.

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

License

Copyright © 2016 Kelsey Sorrels

Distributed under the MIT license.

YourKit

Many thanks to YourKit for providing this project with licenses of its profiler to help us improve performance!

YourKit supports open source projects with innovative and intelligent tools for monitoring and profiling Java and .NET applications. YourKit is the creator of YourKit Java Profiler, YourKit .NET Profiler and YourKit YouMonitor, tools for profiling Java and .NET applications.