New Zircon Release: 2020.2.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.

The kdocs can be found here. Javadocs are also coming soon!

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

Also if you have any questions about this release, feel free to come up to our Discord Server and ask them!

TL;DR For the Impatient:

Highlights of this release

This was a very busy year for us. After the previous release we started focusing on the internals of Zircon. Previously we didn’t have an FPS goal nor performance optimizations in the code. The Swing benchmark was running with ~60 FPS with a 80x24 grid and 16x16 tiles. If someone used a full HD screen it was significantly slower, so we added some optimizations. Right now with a full HD screen and 16x16 tiles (that’s a size of 120x67) Zircon runs with ~100 FPS in the benchmarks. This means that we achieved a ~8x speedup! The goal for the next release is to have 100 FPS with 8x8 tiles.

This performance optimization was made possible by some internal refactorings. The rendering model was modified in a way that the renderer no longer queries the state of the TileGrid, but lets all individual Layers and Components render themselves. This also means that internal state is no longer stored in Components, they are rendered whenever it is necessary instead.

There is also a FastTileGraphics implementation that enables this optimization. It uses an Array internally and it is significantly faster than the old TileGraphics that was using a PersistentList.

Zircon now also supports StackedTiles. a StackedTile is a composite that has a stack of Tiles within it. This is very useful to create composite tile objects and also for rendering. It also enables the Component system (and the GameArea) to be significantly easier to implement. It is is not yet clear what stacking means take a look at this screenshot!

There are some new prototypes as well. One of them is an Android renderer!

Many of you were looking for Javadocs so we also added this to the project! You can find it here. This is kdocs (Kotlin Docs) for now, but soon we’ll add proper Javadocs as well! We also started to add code samples within the docs, so you’ll be able to see what’s what without having to navigate away.

We also started a proper depreciation cycle now, that Zircon has a significant userbase. When we deprecate something it will be annotated with the @Deprecated annotation, and these things will get removed in the next release. We also documented (in the source code) what to use instead of the things we’re going to remove.

The GameArea received some refurbishments as well. Now the GameArea is rendered using a simple ComponentRenderer which means that you can use any Component for rendering a GameArea. This also means that this component can be a Container and can have additional children! Another addition to the GameArea is filtering. Now you can add filters to a GameArea that looks similar to a Modifier, but it has more parameters including the Position3D of the Block that’s being modified in the GameArea. One useful example for this is to implement depth and distance filters. In this example there is a depth filter. The pyramid’s colors are all the same, but the filter changes front and top tiles to add a visual effect, and also makes blocks that have a lower z level appear darker. This is how a building looks like with a filter applied.

Another thing you might have noticed fromt he GIF is that now you can switch between projections on the fly. You can also see it in action in this map generation example.

We usually refurbish the ColorThemes with each release and this one is no different. There are some now ones as you can see in this example. You can also use them in your games.

You can now add padding to your Components. Padding is implemented with a ComponentDecoration so it can be added to any component, and it looks like this.

With this release now we have almost everything in place to implement the rest of the backlog! Here are some prototypes for what’s going to be added to the next release including some Fragments that you were waiting for a while now!

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

New Features

  • #360: Enable the ModalComponentContainer to try dispatching UIEvents to multiple containers if a container returns Pass
  • #357: Add the option to add padding to a component
  • #355: Add the option to keep the Component’s properties when it is attached.
  • #350: Create a filtering mechanism for the GameArea that would enable adding effects to individual Blocks.
  • #359: Enable multiple Fragments to be added to a Container in one go.
  • #91: Add frame rate limiting capability
  • #348: Add a function that will create a TileBuilder out of a Tile
  • #349: Add a function that will create a BlockBuilder out of a Block
  • #339: Create a Tile implementation that’s composed of multiple Tiles.
  • #297: Set application icon
  • #299: Create matchers for UIEvents
  • #315: New Fragment: TilesetSelector and ColorThemeSelector
  • #300: Enable the user to set default keyboard shortcuts
  • #296: Add callbacks for Rendering

Enhancements

  • #345: Document all the API classes properly
  • #325: Create docs pages for each release using Dokka
  • #329: Make Layer implement Layerable
  • #328: Refactor Components to be Layers
  • #353: Use fun interfaces where applicable
  • #352: Refactor builders to use prototypes with defaults.
  • #146: Generate javadoc (Dokka) during build and deploy it to a site
  • #344: Harmonize mutable and accessor mixin names.
  • #338: Optimize Rendering Performance
  • #327: Use a push model instead of a pull one for rendering
  • #332: Checkbox - Alignment & Text
  • #319: Size3d#containsPosition(position: Position3D) should also check for negative values
  • #318: Add new Color Themes
  • #308: Refactor Internal State handling to use Properties
  • #87: Review tint, shade and tone in TileColor

Bug fixes

  • #336: Moving a Component with anything other than moveTo can lead to failed bounds check
  • #316: RectangleFactory (possibly others, too) ignores shape position
  • #321: MouseEventType.MOUSE_WHEEL_ROTATED_UP not getting triggered
  • #311: Components are not visible in AllComponentsExampleJava
  • #307: Clean up tilesets
  • #305: Libgdx not working in 2020.0.2-PREVIEW
  • #304: Clearing a TileGrid breaks draw operations
  • #230: Occassional incorrect window size
  • #341: Fix the rendering logic in GameArea
  • #302: Blocks are not rendered properly in a GameArea when tiles are not opaque.
  • #277: Hiding with transforming is leaving black background in LayerTransformerExample
  • #301: Component remains activated when space is pressed and focus is lost (pressing Tab)
  • #298: Focus handling keys don’t work when using LibGDX

Road Map

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

Credits

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!

Contribute

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.