Die Suche nach frischen Game Engines ist bei mir so etwas wie ein Hobby - oder vielleicht sogar schon zu einer Sucht geworden! Ich schaue öfter nach, ob es etwas neues zu diesem Thema gibt. Ich bin eben gern informiert. Bei meiner letzen Suche fand ich ein echtes Schätzchen!

![](/content/images/2016/09/logo.png)

Amulet is a free Lua-based audio/visual toolkit suitable for small games and experimentation. It runs on Windows, Mac, Linux, HTML5 and iOS.

Der Entwickler Ian MacLarty beschreibt seine Engine als ein kleines Toolkit, das man für kleinere Games und visuelle Experimente nutzen kann. Wenn man die Website des Entwicklers betrachtet, scheint die Engine, auf den ersten Blick, tatsächlich etwas experimentell zu sein. Es gibt weder grafisch anspruchsvolle Beispiele, noch komplette Spiele zu betrachten. Aber nach meinen persönlichen Tests, kann ich sagen, dass diese Engine zu mehr fähig ist! Amulet ist eine komplette 3D Lua Game Engine, die problemlos auf fünf Plattformen veröffentlichen kann. Programmieren kann man sie auf Windows, Linux und macOS und exportierte Projekte laufen ohne Mühe auf Windows, Linux, macOS, iOS und im Web (HTML5). Support für Android ist ebenfalls geplant.

Aber was unterscheidet diese Engine von anderen? Nun, es sind die kleinen Details, die dieser Engine einen entscheidenden Vorteil verschaffen. Zum einen ist man nicht nur auf 2D beschränkt, was die meisten Lua Engines gemeinsam haben, sondern hat volle 3D Unterstützung (inkl. Shader). Zum anderen, gibt es einen Unterschied bei dem Game-Loop. Engines wie Codea oder LÖVE2D nutzen globale Funktionen wie setup(), draw(), keypressed(), die bei entsprechenden Events gefeuert werden - nicht so in Amulet. Amulet verfolgt einen anderen Ansatz: Nodes. Nodes sind Objekte oder Knoten, die miteinander verbunden werden können um eine Szene aufzubauen. Jeder Knoten ist anders, es gibt Nodes die eine Transformation oder Rotation ausdrücken, und andere, die eine Form, zum Beispiel ein Sprite, zeichnen können. Man kombiniert diese Nodes, damit sie einander beeinflussen und verändern. Hier ein Hello-World-Beispiel in Amulet.

![](/content/images/2016/09/amulet_hello-world.gif)
-- Create native window
local window = am.window{width = 128, height = 128}

-- Build scene with nodes
window.scene =  am.rotate(math.rad(45)) ^ am.text("Hello World!")

-- Update node rotation on action event
window.scene:action(function(node)
	node"rotate".angle = am.frame_time
end)

Wir erstellen also ein Fenster mit festen Dimensionen. Die Szene wird mittels Nodes aufgebaut. Dabei wird der Reihenfolge nach geerbt (am.text erbt vom am.rotate Knoten). Die Nodes werden mittels ^ Operators verbunden. Unser Text wird also 45° geneigt angezeigt. Wollen wir unseren Text aber rotieren lassen, müssen wir den Winkel stetig updaten. In Codea oder LÖVE würden wir dies in der update() bzw. draw() Funktion tun. In Amulet gibt es dafür action's! Wir greifen auf den window.scene Baum zu (ein Lua table) und suchen uns den "rotate" Knoten heraus, dann aktualisieren wir den Winkel (angle), in dem wir die Delta Zeit hinzuaddieren.

So einfach ist das ganze! Keine draw() oder update() loops. Nodes werden automatisch gezeichnet und aktualisiert. Während meiner Annäherungsversuche an Amulet, habe ich die Arbeit mit Nodes wirklich schätzen gelernt.

Das nächste coole Feature, sind Sprites. In vielen Game Engines muss man diese Assets vorher vorbereiten, in dem man fertige PNG oder JPEG Dateien generiert, die man in der Engine hinzulädt. In Amulet können Sprites aber sehr viel mehr - wie wäre es zum Beispiel mit Ascii Strings, die zur Laufzeit zu Bildern werden? Leicht!

![](/content/images/2016/09/Bildschirmfoto-2016-09-27-um-14.06.52.png)
local win = am.window{
    title = "Sprites On Steroids",
    width = 100,
    height = 100,
    clear_color = vec4(0.6, 0.8, 1, 1)
}

local img = [[
...cc.ccc.
.cccccccc.
.cYYcYYYc.
YYgWYYgWcY
YYYYYYYYYY
.YRYYYYRY.
.YYRRRRY..
....YY....
.MmMYYmMm.
.MmMmMmMm.
]]

win.scene = am.scale(10) ^ am.sprite(img)

Das sollte einem, nicht nur für Prototypes, viel Zeit ersparen, oder wenn man sehr einfache Game Assets schnell benötigt. Zudem bleibt der Code immer veränderbar. Man kann diese Sprites zur Laufzeit modifizieren, indem man einfach den String verändert! Echt cool, oder? Hier ein weiteres Beispiel aus dem Online Editor von Amulet, das die Nutzung der Maustasten und Ascii Sprites veranschaulicht.

![](/content/images/2016/09/amulet_ascii_sprites.gif)

Und das ist nicht alles! Das Framework ist mit vielen weiteren solcher netten Features gespickt. Eines davon sind Swizzle Fields. Besonders wenn man mit Vektoren arbeitet, muss man die Komponenten (x,y,z) oft einzeln ansprechen oder in anderer Variable, in umgekehrter Reihenfolge, zwischenspeichern. Oder aus einem Vektor einen ganz neuen machen. Swizzle Fields erlauben einem die einzelnen Komponenten eines Vektors beliebig neu zu kombinieren. Hier ein Beispiel.

local dir1 = vec3(1, 2, 3)
local dir2 = dir.zyxx

print(dir1, dir2)
print(dir1.xy)
print(dir1.rggb)
print(dir1.zzys)

Die Installation dieses Frameworks könnte übrigens nicht einfacher sein! Es gibt fertige Binaries, also One-Click-Installer, für jede Plattform. Danach führt man die Lua Dateien einfach per Befehl in der Konsole aus: amulet datei.lua, und diesen kann man sich, im Editor seiner Wahl, auch auf einen Shortcut legen!

Es gibt noch ein Tonne solcher netter Unterschiede zu anderen Game Engines. Bei meinem Testdrive mit Amulet, hatte ich stets das Gefühl mit einem wirklich gut durchdachten, grund-soliden und bequemen Framework zu arbeiten - und das sage ich nicht oft. Es ist eine wirklich sehr schöne 'kleine' Game Engine, mit der ich mich sicherlich noch weiter beschäftigen werde! Schaut euch Amulet doch einfach selbst an und bildet euch eine eigene Meinung dazu. Vielleicht werdet ihr sogar, vom derzeitigen Framework euerer Wahl, auf Amulet umsteigen.