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!
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:
- Stacked Tiles
- Android Renderer prototype
- Javadocs (finally)
- (not just) Color filters for the Game Area
- Another example here
- Switching between projection modes on the fly
- Proper depreciation cycle!
- New Color Themes
- Padding support
- Performance optimization: 8x FPS!
- New Fragments:
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
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
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
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
Zircon now also supports
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.
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.
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:
- #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
- #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
- #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
We’ve covered a lot of ground in this release, but there are still things to do:
- Scrollable Components
- Floating Components
- Drag’n Drop Support
- Custom Layout Support
- Component Themes
- Custom Component Support
- Tree Component
- Table Component
- Accordion Component
- Combo Box Component
- IntelliJ Plugin
- Grid / Screen Filters
If you think that you can contribute or just have an idea feel free to join the discussion on our Discord server.