New Zircon Release: 2020.1.0-RELEASE

  Written by:

Zircon is an extensible, multiplatform and user-friendly tile engine.

If you are not yet familiar with the project take a look at our Project Page.

You can grab this release from Maven Central. More on how to add Zircon as a dependency to your project can be found here.

Highlights of this release

With the tutorial project Caves of Zircon finished we had a lot of time to work on new features since the last major release and we’ve also improved the documentation and the examples.

The Documentation Page was overhauled and retrofitted with the recent changes in Zircon so now you can all enjoy the new content. What was missing for quite some time is a thorough explanation of the Component System which is now detailed here.

We also worked on the examples which now encompass all features of Zircon. Component examples now also have a tileset/color theme selector. You can take a look here.

The internals of Zircon were refactored to use persistent data structures so we now have stable snapshots for rendering. In practice this means that there are no more flickering or visual artifacts when you use Zircon.

All Components in Zircon were retrofitted with data binding features. What this means is that properties like the disabled state of a component or their colors can be bound to each other with a single line of code. This example showcases some Labels and Buttons being bound to another Labels textual content.

Group was added which is not a component itself but it takes advantage of the new data binding features of Zircon to synchronize components with each other even if they are not in a parent/child relationship. Group has its own ColorTheme for example which when updated will update all components in it. The RadioButtonGroup was also retrofitted to use this abstraction so now you no longer have to put RadioButtons in the same container.

We also implemented a bunch of new components:

  • HBox and VBox were requested by a lot of our uses so we implemented them. They automatically align their child components either horizontally or vertically. They can also be nested into each other to create complex UIs and layouts. This is an example for a combination of the two, this is a VBox with some interactions.
  • Number inputs can be used to input only numbers.
  • Scroll bars enable you to scroll content in a component.
  • With Sliders you can easily pick values from a range.
  • Toggle buttons were retrofitted to look more intuitive and visually appealing.
  • With Progress bars you can display the progress of a process.
  • Component decorations were retrofitted to have an INTERACTIVE/NON_INTERACTIVE mode to better align with specific needs. Example here.
  • We also implemented a post-rendering feature for Components.

A new feature was added to TileColor for color interpolation. This can be handy if you want to create color gradients.

Zircon now also supports event bubbling. This topic is detailed in the docs.

We also have an image -> ASCII converter in the works: click.

Here is a full list of issues we finished for this release:

New Features

  • #144: Add slider widget.
  • #123: Implement the Group component.
  • #123: Implement the NumberInput component.
  • #257: Add the transform function from TileImage to TileGraphics and Layer.
  • #181: Feature: H/V Boxes.
  • #126: Introduce event bubbling for Input events.
  • #190: Simple Progress Bar.
  • #193: Implement FadeIn/Out modifiers.
  • #291: Implement the NumberInput component.
  • #292: New Component: ScrollBar.
  • #95: Add option for post-component rendering decorations.
  • #288: Add interactive and non-interactive rendering mode for decorations.
  • #289: Add a way to interpolate between colors.


  • #286: Refurbish documentation on the website.
  • #253: Improve the visual appearance of component states .
  • #282: Make the ToggleButton have better UX .
  • #245: A component shall have a property hasFocus.
  • #283: Add copy functions to TileColor.
  • #161: Move requestFocus to its own interface: FocusableComponent.
  • #219: Deploy to Maven Central.
  • #261: Refactor RadioButtonGroup to be a logical Group instead of a Component.
  • #264: Enable all Components to be Disablable, Hideable, Themeable and have TilesetOverride.
  • #94: Check API for concurrency issues.
  • #263: Make ColorTheme a property of Component.
  • #251: Make components inherit properties.
  • #110: GameComponent should be a container.
  • #258: Only modify a TileGraphics if the operation would lead to a change.
  • #256: Add the option to hide/show Layers.
  • #255: Properly implement the disabled state for CheckBox and Button.
  • #254: Modify Component bounds check to be only relaxed in debug mode.
  • #242: Migrate gradle build scripts to use Kotlin DSL + buildSrc.
  • #202: Make Blocks mutable.
  • #200: Use databinding for mutable component states (selected, checked, text, etc).
  • #196: Allow Icons to use any Tile.
  • #199: Allow editing the items in a RadioButtonGroup.
  • #203: Add support for Focus and Activation events to Components.
  • #210: Component: Visibilty Property.

Bug fixes

  • #287: HBox and VBox won’t accept a Component which would fill up the space completely.
  • #278: StaticEffectMarkovChainExample is not working.
  • #276: GlitchEffectMarkovChainExample is not working.
  • #284: Adding a disabled Component to a container will re-enable it.
  • #222: LibGDXApplications is not swappable for SwingApplications.
  • #50: Input does not catch keystroke +Z on Windows 10 and Ubuntu 17.10.
  • #231: Fullscreen doesn’t work if all the tiles can’t fit on screen.
  • #218: LogArea does not scroll to last line when line is wordwrapped.
  • #247: Event RequestCursorAt does not work as expected in a text area.
  • #139: If text area is enabled and receives the focus programatically, it does not receive the first key event.
  • #246: Keycode TAB is always propagated to the default handler.
  • #160: Multiple screens handling Input regardless of which one is active.
  • #209: Panel: changes of TitleProperty get not reflected.
  • #119: Screen.setCursorVisibility(true) does not work.
  • #274: Activating a component doesn’t always use the correct style.
  • #221: Log Area text appears in other panels for a single frame.
  • #252: Transparent background is not working when using TileTransformModifier.
  • #281: Pressing Tab repeatedly doesn’t keep traversing the focus.
  • #280: Removing a focused component will sometimes isolate the previous and next components.
  • #279: Adding or removing a focusable component doesn’t retain focus of currently focused component.
  • #275: Visual style applied by focus is taken away when component is hovered.
  • #272: GameComponent doesn’t use decorations.
  • #233: Pressing shift while editing a TextArea moves the cursor.
  • #227: Buttons within modals can be misaligned.
  • #92: Implement the snapshot function in DrawSurface properly.
  • #232: Border decoration renderer is not working for Components.
  • #175: Black bar appears in LibgdxApplication.
  • #194: Libgdx renderer prints a warning on macOS and doesn’t display tiles.
  • #201 : Fix CircleCI parallelism problem.
  • #198: TextArea accepts huge sizes which leads to memory leaks.
  • #197: Fix TextBox division by zero problem when creating a TextBox.
  • #195: Fix LogArea positioning when it has wrappers.
  • #180: Window titles don’t work.
  • #151: Drawable.drawOnto(DrawSurface) implementation in DefaultLayer does not seem to work.
  • #187: ToggleButtonBuilder ignores the isSelected(Boolean) function.
  • #186: TextArea blows up on forward delete if there’s no character after the cursor.

Road Map

We’ve covered a lot of ground in this release, but there are still things to do:


Thank you for all of you out there who helped with this release! Special thanks to Baret, Bergin, Coldwarrl, Luke and Seveen for their contributions!


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.