New Zircon Release: 2018.5.0-RELEASE

  Written by:

Highlights of this release

This release was mainly about making Zircon more robust and prepare it to be used in a multiplatform environment (jvm, browser, native). There are also some new enhancements and features added, like:

New Features

There are numerous new features in this release:

  • #100: Support all Input events on components properly.

    Now all Input events can be properly listened to on Components: InputListeners can be added or the specific listener methods can be called with a lambda like onDrag or onMouseReleased

  • #90: Add the option to enable beta features in Zircon

    Now there is a switch in AppConfig which can be used to enable beta features like Animations and the GameComponent

  • #89: Add the option to run Zircon in debug mode

    This can also be enabled now from AppConfig. It will display specific log entries and also the current FPS. This feature will be enhanced later.

  • #76: Introduce ShutdownHook in Zircon

    Now ShutdownHook can be used to notify the user before Zircon closes

  • #75: Improve Animation to return an AnimationResult

    Starting an Animation will now return a handle which can be used to interact with the Animation (like stopping it).

  • #54: Embedding images/bitmaps
  • #46: Implement “Log” Component

    The LogArea component was implemented (great thanks to coldwarrl!).

  • #8: TileColor transformations

    The following transformations were implemented:

    • tint: adding a different color to this one
    • shade: lighten or darken the color
    • invert: flip the color to its opposite (blue vs red for example)


These are the enhancements which were done in this release:

  • #112: Allow Position and Size to have negative values, and add a check in the components framework not to allow them there.
  • #107: Reconcile the usage of properties vs functions (eg: size(), position() vs size and position

    These were streamlined and the weird getters (position(), size(), etc) are now gone. Now there is a proper getter / setter for everything and mutator/transformer methods which return the object are prefixed with with*.

  • #105: Separate Modifier into tile transformer and texture transformer modifiers.

    Now there are two kinds of Modifiers. One which modifies how textures are transformed, and one which can modify a Tile before it is rendered.

  • #103: Reconcile getTileAt, setTileAt, getRelativeTileAt and setRelativeTileAt.

    These were “sanetized” now it is straightforward and well documented which is which and how to use them.

  • #102: Provide a proper Snapshot object for snapshot() instead of a Map

    Now the snapshot() method returns a proper Snapshot object instead of just a Map.

  • #84: Font to Tile refactor

    This was a rather thorough change. Previously Zircon used the Font abstraction which was now refactored to Tile and TilesetResource which streamlines and simplifies how Tiles can be loaded and used. It is now also easier to write support for new kinds of fonts, tiles, and such.

  • #83: Refactor Blink handling and Animation handling to be part of the incremental rendering

    Blink and Animation timing is now handled by the continuous renderer. This does not change how the API works, but makes the code of Zircon more robust, and less error prone.

  • #82: Continuous rendering

    Now Zircon does continuous rendering: the user will no longer have to call refresh and other such methods in order to redraw the screen. The Application class was also introduced to accommodate this change.

  • #81: Multiplatform refactor

    The majority of the code in zircon.jvm were moved to zircon.core which is a Kotlin common project. This will enable the development of javascript and native variants of Zircon. #84 made this possible. Now images can be drawn onto a DrawSurface using the ImageDictionaryTilesetResource. The related example can be found here and it looks like this.

  • #74: Streamline how Positions and Sizes work

    Previously it was not possible to create Positions with a negative component (x, or y), not it is possible, and it is only limited in specific places (like Components)

  • #73: Improve TileGraphics performance

    TileGraphics used arrays before, now it uses sparse Maps. This enhances performance, and also makes it possible to have TileGraphics with stupid size.

  • #69: CombineWith should resize new image to fit TileGraphics

    When combineWith is called on a TileGraphics it will properly be resized to accommodate the other image.

  • #67: Add word wrap to CharacterTileString

    CharacterTileString now supports word wrap!

  • #61: Proper FontTextureRegion abstraction for different backends.

    Previously Tile drawing for different backends (Swing, LibGDX, etc) was a bit convoluted. Now this is streamlined.

  • #60: Proper modularization depending on GUI backend

    Zircon was split into multiple projects (zircon.core, zircon.jvm, zircon.jvm.swing, zircon.jvm.libgdx). This makes the artifacts more lightweight, and the codebase is also separated along the GUI framework backends.

  • #59: Component wrapping refurbishment

    Component wrapping was refactored. Now ComponentDecorationRenderers can be added to any Component during creation. This makes it possible to apply any decoration to any component.

  • #55: Fix and test TextBox

    This was a bit convoluted before, now it is better and has more tests.

  • #38: Half-width Tile support

    Now it is possible to use TilesetResources which are not square, there are also some added tilesets like Acorn and Lord Nightmare.

  • #32: Tile alignment by pixel

    Now Tiles can be aligned by using AbsolutePosition. Note that this feature is still in beta.

Bug fixes

The following bugs were fixed:

  • #111: Fix to change the selection in its parent as well
  • #77: Swing terminal is not being redrawn in response to exposure event
  • #66: Adding Components to a Container which is not yet attached to a ContainerHandler will lead to positioning problems
  • #65: RadioButtonGroup throws stacktrace if you click empty space
  • #64: Minimizing a swing terminal and then restoring it causes the screen to go grey
  • #47: Adding a component to a container which has no font before attaching that container to a Screen leads to font error.


There are several things on the radar, like:

  • Refactor parallelism and concurrency to use Kotlin coroutines
  • Implement a Javascript (browser) module and finish the LibGDX implementation
  • Finish custom Component support
  • Add floating, modal and scrollable components
  • Component layout support
  • Drag’n drop support
  • Component themes
  • Simple and easy to use data binding and MVC support


If you think that you can contribute or just have an idea feel free to join the discussion on our Discord server.

Do you have questions? Ask us on our Discord Server.

If you like what we do and want to support us consider becoming a Patron.