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:
- 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 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 Layer
s and Component
s render
themselves. This also means
that internal state is no longer stored in Component
s, 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 StackedTile
s. a StackedTile
is a composite that has a stack of Tile
s 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 ColorTheme
s 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 Component
s. 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 Fragment
s 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:
- Scrollable Components
- Floating Components
- Drag’n Drop Support
- Custom Layout Support
- Component Themes
- Custom Component Support
- Menus
- Tree Component
- Table Component
- Accordion Component
- Combo Box Component
- IntelliJ Plugin
- Grid / Screen Filters
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.