LITIENGINE is a free and open source Java 2D Game Engine



LITIENGINE is a free and open source Java 2D Game Engine. It provides a comprehensive Java library and a dedicated map editor to create tile-based 2D games.

Build Coverage Maven Central MIT License Discord chat Supporters

🎮 Main Features

  • Basic Game Infrastructure (GameLoop, Configuration, Resource Management, Logging, ...)
  • 2D Render Engine (GUI Components, Spritesheet Animations, Ambient Lighting, Particle System, ...)
  • 2D Sound Engine (support for .wav, .mp3 and .ogg)
  • 2D Physics Engine
  • Support for Tile Maps in .tmx format (e.g. made with Tiled Editor)
  • Player Input via Gamepad/Keyboard/Mouse
  • Entity Framework

⚙️ Installation

The library is distributed over the Maven Central Repository and you can grab the necessary .jar-file(s) from there by using your favorite build automation tool or manually download the library.


Our library is primarily hosted by the Maven Central Repository:

repositories {

Gradle (Groovy)

dependencies {
  implementation 'de.gurkenlabs:litiengine:0.5.2'

Gradle (Kotlin)

dependencies {

More Installation Instructions

🚀 Getting Started

  1. Setup the Game Project
  2. Running the Game
  3. Configuring the Game
  4. Loading a .tmx Map

📚 Documentation

The LITIENGINE documentation pages contain in-depth guides and explanations for general concepts of the engine.

⚠️ We are aware that some parts of the engine are lacking documentation. Feel free to join our Discord and discuss any open questions. Our great community is always very helpful.

✏️ If you like writing and explaining: We're looking for further contributors to enhance the official documentation. Just file an issue or create a PR on the Documentation Github Repository.

If you are searching for a particular method or class within the API or just want to further explore the engine's possiblities, the Javadocs are a good place to start.



Visit the official LITIENGINE forum for troubleshooting or to learn about the LITIENGINE community. If you encounter bugs or want to request fancy new features, you can also open an issue in our Issue Tracker.

📦 Libraries Used


Other Recommended Libraries

🤝 Contributing

🎓 Citations

If you want to cite parts of the LITIengie in your academic work, you can use the following Digital Object Identifier:


💬 Contact



Gurkenlabs is an indie game development project by two brothers from Bavaria:

Sponsors and supporters

  • Setup spotless to enforce code-style

    Setup spotless to enforce code-style

    This PR sets up the gradle spotless plugin to automatically enforce code-style during builds. It's configured to use the google code style as specified here:

    ~~Note that the github action to check code-style will currently fail and a commit fixing all style violations will have be necessary. I didn't include that commit as it would interfere with other PRs.~~

    opened by weisJ 18
  • Extra camera / multible screens

    Extra camera / multible screens

    To summarize, this pull request is indented to fix issue #71 . It adds support for multible cameras in the game world, and by necessity, also adds support for 'multible screens'. I suppose 'Screen' might need a new name for that to make sense, but I hey, up to you.

    Everything looks ok, it compiles. Not sure how to run tests, and I don't have any test assets on hand, so I can only hope it works as planned. I might try to create some assets to test tomorrow, if you don't beat me to it.

    Anyways, this update will disturb a lot of core code, but I have been careful to document as much as I could, so if it breaks, it should hopefully be easy to fix. Let me know if there are code-lines you don't understand, and I will patch in comments to explain.

    opened by KvaGram 15
  • Implement video player GUI component

    Implement video player GUI component

    Many games play more or less important videos at some point, e.g. for in-game skill showcases, cut scenes, intros, and many more. So far, we have neither Resource management nor playback capabilities for video files. With pure java, this is not exactly a trivial thing to do, so we might need to use some external libraries for this.

    Potential candidates

    JavaFX (GPL)

    It is possible to play back video in a JavaFX scene wrapped into a JPanel, but we need to consider this carefully, since JavaFX is not needed anywhere else in the engine right now and LITIengine is an AWT framework by design. Using JavaFX at one point would imply switching other internals such as rendering and UI to JavaFX as well, but that would entail completely changing LITIengine's scope...

    Xuggler (LGPL-3.0)

    While promising, Xuggler has been deprecated in favor of humble-video.

    Humble-Video (AGPL-3.0)

    The succesor to Xuggler, but Licensing may be incompatible.

    vlcj (GPL 3.0)

    A native vlc player instance to be embedded in Java applications.

    Java Media Framework (JMF)

    Truly an antiquity, the JMF may be a bit dated and lack support for many modern containers and formats. Still, it may be enough for our needs. example 1 example 2

    Freedom for Media in Java (FMJ) (LGPL-3.0)

    This library addresses some of the shortcomings of the JMF (e.g. codecs and containers), while retaining a fully JMF compatible API.

    jcodec (BSD-2-Clause)

    An implementation of the most common video and audio codecs.

    GStreamer (LGPL-3.0)

    Java bindings for GStreamer.

    The requirements

    • a video player GUI component to be used in ingame UI
    • a cut scene screen, a.k.a. a full screen video player
    • resource management for videos
    • codec support for the most common codecs
      • H.264
      • MPEG-4
      • DivX
      • MPEG-2
      • HEVC (H.265)
    • container support for the most common file containers
      • MP4
      • AVI
      • MOV
      • FLV
      • WMV
    feature MAJOR needs-discussion 
    opened by nightm4re94 15
  • Revamp the sound engine.

    Revamp the sound engine.

    The main feature of this pull request is a total rewrite of the SoundPlayback implementation. Notable changes include:

    • A resource leak in the previous implementation has been fixed (every time a sound looped, it would open a new line without closing the previous one).
    • There is now a Track interface for more complex music, such as music with an intro.
    • There is no longer an audible seam between looping sounds, as the data line is reused.

    Also included is an implementation of layer opacity that I had previously forgotten to write.

    This is currently marked as a draft pull request as there is a major bug in my implementation that makes some sounds not play. It's extremely annoying, as it's highly intermittent and I've been unable to determine the cause. It is assigned a thread, but for some reason the task exits before it can write any data to the line, but it's not being cancelled, because if it was, it would hit a breakpoint. You have implemented a sound playback before; what am I doing wrong?

    opened by TheRamenChef 13
  • New TMX overhaul breaks the ambient light sources

    New TMX overhaul breaks the ambient light sources

    From @nightm4re94, commenting on #232:

    Thank you a lot, these are some great improvements! However, I've noticed after merging the branch that the AmbientLight is not working for any of the Map orientations anymore (While there were bugs with hexagonal maps, at least it had been working for orthogonal maps previously). Please fix this as soon as possible.

    Looking at the code more closely, is there any reason it can't assume an orthogonal orientation? It’s split into tiles as bite-sized pieces to render, but it doesn't appear to have any meaningful connections to tiles.

    bug help wanted 
    opened by TheRamenChef 12
  • utiLITI windows scaling issues

    utiLITI windows scaling issues

    If I open utiLITI on my 4k monitor, the tiles of a map get scaled but the grid doesn't and weird rendering issues appear. standard behavior A workaround to get it working is to let windows handle the scaling. This is done via the compatibility settings by selecting system as a scaling mode. The downside of this workaround is that the UI gets blurry.

    bug MAJOR 
    opened by profiluefter 11
  • Build overhaul

    Build overhaul

    See #412

    This time gradle is rewired to use the old source/resource locations.

    The only thing which couldn't be avoided is to move the test resources into their own directory. This is due to the nature of the java-library package.

    Github history is preserved this time: e.g.

    opened by weisJ 9
  • Unable to launch in Windows

    Unable to launch in Windows

    The utility does not start when several different versions of the JDK are installed on the system.

    The problem is that if version 16 is found, then the utility uses this version and there is a problem with modules exports.

    Stack Trace

    Wed Jun 16 15:33:48 EEST 2021 AWT-EventQueue-0 threw an exception:
    java.lang.IllegalAccessError: class com.github.weisj.darklaf.ui.label.DarkLabelUI (in unnamed module @0x7aec35a) cannot access class sun.swing.SwingUtilities2 (in module java.desktop) because module java.desktop does not export sun.swing to unnamed module @0x7aec35a
    	at com.github.weisj.darklaf.ui.label.DarkLabelUI.paint(
    	at java.desktop/javax.swing.plaf.ComponentUI.update(
    	at java.desktop/javax.swing.JComponent.paintComponent(
    	at java.desktop/javax.swing.JComponent.paint(
    	at java.desktop/javax.swing.JComponent.paintChildren(
    	at java.desktop/javax.swing.JComponent.paint(
    	at java.desktop/javax.swing.JComponent.paintChildren(
    	at java.desktop/javax.swing.JComponent.paint(
    	at java.desktop/javax.swing.JLayeredPane.paint(

    To Reproduce

    1. Install JDK 8 and 16
    2. Launch utility
    3. See empty black screen

    Your System:

    • OS: Windows 10
    • LITIENGINE version: 0.5.1-beta
    • Java JDK/JRE version: jdk1.8, jdk16
    • Screen resolution: 1920x1080
    opened by LeonisX 9
  • JavaFX Video Player

    JavaFX Video Player

    I've been working on #291 using JavaFX.

    As a result I had to make some changes to how LitiEngine is compiled.

    If you're compiling using a JDK older than JDK11, then JavaFX must exist on the system classpath. Some JDKs older than JDK11 come with JavaFX, but some don't (most notably openjdk8). If yours doesn't you will have to upgrade to Java 11 or install OpenJFX onto your system manually.

    If you're compiling with JDK11 or newer, then you don't have to do anything. Gradle will automatically add it to the build path.

    Using gradle to add JavaFX to the build path is not possible with JDKs older than JDK11, as the OpenJFX gradle plugin required to install it is only compatible with Java 11 or higher. If you attempt to use it on an older version of Java, you will get an UnsupportedClassVersionError upon building the project.

    Travis will now build LitiEngine using both Java 8 and Java 11 to ensure it can run on both.


    • [x] Add JavaFX to classpath
    • [x] Travis builds with both Java 8 and Java 11
    • [x] Implement a VideoPlayer which is a GuiComponent
    • [x] Implement VideoRenderer to render the GuiComponent
    • [ ] Add tests
    opened by Gamebuster19901 9
  • Blank utiLITI window

    Blank utiLITI window

    Describe the bug When utility.jar is opened it just creates a blank window

    To Reproduce Simply run the jar

    Expected behavior For the utility editor to open

    Your System:

    • OS:Ubuntu
    • LITIENGINE version: 0.4.20-alpha
    opened by Vulpesx 8
  • Use URL fragments for external resources

    Use URL fragments for external resources

    This is an addition to #272.

    This pull request aims to resolve what would otherwise become an edit war on image layer rendering. Among other things, it changes the implementation of ResourceBundles to use URL fragments to reference internal images. It's somewhat backwards-compatible, but older bundles may experience problems.

    Additionally, this pull request removes the unused path property from maps, and the improper Comparable implementation from resources. The Comparable implementation has been moved to a Comparator in the same interface called BY_NAME.

    bug tool: utiLITI 
    opened by TheRamenChef 8
  • Enhance sprite dimension determination in sprite import panel

    Enhance sprite dimension determination in sprite import panel

    Instead of providing pixel dimensions for the frames, let the user simply provide column and row counts. This way, one doesn't necessarily have to know what size their image file has. Also it's less typing and slightly more intuitive. Pixelorama does this, for example: pixelorama-spritesheet-import

    opened by nightm4re94 0
  • Adjust Creature sprite naming conventions

    Adjust Creature sprite naming conventions

    Instead of creature-walk-right.png, use creature-move-right.png for automatic animationcontroller initialization. Moving is a more generic name that applies also to creatures without legs.

    Furthermore, determining the sprite states and directions by splitting spritesheet names at '-' characters is super prone to errors and doesn't allow you to deviate from the order at all. You can't, for example, call a sprite 'spaceship1-yellow-idle' because the 'yellow' part is then interpreted as sprite state. Use RegEx to determine sprite states and directions.

    opened by nightm4re94 0
  • Tiled versions 1.9.0 or higher make existing maps unusable for MapObject loading

    Tiled versions 1.9.0 or higher make existing maps unusable for MapObject loading

    Recent tests have shown us that if you save any Tiled map with Tiled version 1.9.0 or higher, the map becomes irreversibly incompatible with LITIENGINE's TMX deserializer. Tiled has removed Object types in favor of classes, converting all your type="MyMapObjectType" attributes into class="MyMapObjectType". As a consequence, our MapObjectLoader won't be able to assign any MapObjectType.

    bug tmx 
    opened by nightm4re94 0
  • Add context menu to utiLITI resources

    Add context menu to utiLITI resources

    Is your feature request related to a problem? Please describe. Managing resources in utiLITI could be improved by supporting a context menu for the resources tab that allows to access already present functionality.

    Describe the solution you'd like Functions that should be part of the context menu:

    • All resource import functions from the main navigation (e.g. "Resources -> Import -> Spritefile...") This should be context sensitive to the currently selected type of resource
    • Export functions for any type of resource (e.g. "Export Spritesheet")
    • All resource actions that are accessible when a resource has the focus
      • "Add to environment"
      • e.g. "Edit Spritesheet"
      • e.g. "Delete Spritesheet"

    Additional thoughts Also, keyboard shortcuts would be a good way to access this functionality from the resource tab

    feature tool: utiLITI 
    opened by steffen-wilke 0
  • v0.5.2-rc1(Jan 6, 2022)

    LITIENGINE v0.5.2-beta featureimage

    Just in time for making your new year's resolution of creating amazing games with LITIENGINE, we proudly present our latest update, packed with 250 commits over the last ten months!

    Let's talk about the elephant in the room: LITIENGINE is now fully running on Java 17! In the future, we plan to keep the library updated to the latest stable jdk versions for you to utilize all the juicy new features Java has to offer.

    To make building ingame UI more pleasant, the Slider, TextFieldComponent, and SpeechBubble components have seen massive updates.

    Bugfixes and UX improvements for utiLITI will ensure a more smooth experience when handling the editor.

    Apart from that, a lot has changed in our build and deployment pipeline and the repository is now utilizing GitHub actions instead of Travis CI. This goes along with a completely revised directory structure and proper separation of submodules. The way we bundle native libraries has been adapted and the dependency on steamworks4j has been removed. Please also take note of our changed contribution guidelines: it is now required to comply with the Java code style conventions we provide in the repository (see

    Finally, a huge THANK YOU is in order: To all our tireless code contributors, to the community involved in discussing issues, to everyone providing help in our forum and on Discord, and lastly: Thank you to our new Sponsors RajBet, Trust My Paper, CasinoHex Canada, and ej-technologies (in chronological order of sponsorships)!

    What are you waiting for? Start the new year the right way: making games with LITIENGINE.


    Download LITIENGINE v0.5.2-beta

    Read the full Changelog

    LITIENGINE is available through Maven Central:

    Gradle (Groovy)
    implementation 'de.gurkenlabs:litiengine:0.5.2'
    Gradle (Kotlin)
    Source code(tar.gz)
    Source code(zip)
  • v0.5.1-beta(Feb 9, 2021)

    This release brings tons of bugfixes and quality-of-life improvements. Feature-wise, the highlight of this version is the addition of a Tweening framework that lets you interpolate values over time, e.g. to let your GuiComponents bounce or your Entities wiggle. As the engine's networking code had been an unmaintained, untested, and even unsafe mess, we have decided to remove the networking package entirely.

    Our Discord server has seen some upgrades and we gladly welcome our first community moderator, Conifer! In order to give back some of your love, we have introduced some special roles for our forum and the Discord server:

    • @Supporter : Members that have supported us with donations.
    • @Contributor : Members that have contributed to our open source code repositories
    • @Early Bird : Members that have been part of our community since the Alpha days of LITIENGINE.

    We try to assign these roles to the best of our knowledge, but if we forgot you - please don't hesitate to complain. :)

    Apart from that, we've updated the sponsoring tiers in the LITIENGINE Open Collective, allowing you to support our work financially and with full transparency. We have also started a spreadshirt shop where you can buy all kinds of LITIENGINE related swag and promote the cause (feel free to suggest additional motives)!

    As always, huge thanks to all contributors and fans! This is an exciting journey for us and we are grateful to share it with you.


    Download LITIENGINE v0.5.1-beta

    Read the Changelog

    Source code(tar.gz)
    Source code(zip)
  • v0.5.0-beta(Aug 16, 2020)


    As of today, we end the four year-long LITIENGINE alpha, spanning a total of 17 feature-packed releases. Simultaneously, LITIENGINE hits its first beta release v0.5.0-beta, marking a magnificent milestone for us.

    What once started as an overly ambitious hobby project of two naive brothers seeking to create their own video game, is now one of the most successful Java 2D game engines on the market - despite being in early access! Our hearts are filled with joy seeing how popular LITIENGINE has become and we want to thank you from the bottom of our heart.

    To celebrate the prosperity of LITIENGINE and as a big thank you to our supporters, we have completely remade the LITIENGINE website from scratch. It is now a well-designed, streamlined experience that guides users to the most important points of interest more naturally. With everything designed to be maximally self-contained, we are also no longer hosting the documentation, JavaDocs, and Download page externally: The LITIENGINE website thus has become a purposeful and holistic hub for everything related to our favourite software.

    We are convinced that LITIENGINE's user base and relevance will keep growing and there are some thrilling years ahead of us. If you're not already part of the LITIENGINE family, join our lovely community and explore the exciting features of our new website and LITIENGINE's first beta release.


    Download LITIENGINE v0.5.0-beta

    Read the Changelog

    Source code(tar.gz)
    Source code(zip)
  • v0.4.20-alpha(Mar 29, 2020)


    • 0d269f4 Fixed importing map nested tile layers
    • #304 Excluded module-info.class from external lib from the LITIengine jar files
    • 204a153 Fixed bug when loading Resource bundles with Spritesheets missing the image format attribute.
    • 4be7ae1 Fixed issue with sprite sheets not being reloaded when replacing them at runtime
    • 1065757 Fixed image string serialization by returning a compatible image for the current GraphicsEnvironment
    • 019a410 Fixed issue with random point implementation in circles
    • b640d3e Don't use URLs as keys for resources (this had major performance drawbacks)

    Features / Improvements

    • Improved the visibility of APIs that are not intended to be used publically
    • Added test coverage to many utility classes
    • 470b402 Streamlined the ListField constructors.
    • bd6faeb Added explicit listeners for the GamepadManager's events
    • 368669d Added a dedicated ResolutionChangedListener for the GameWindow
    • b3b5037 Add debug option to render the sprite bounds in addition to the Entity bounds
    • 3cc9187 make shadow offset configurable in the ShadowImageEffect
    • 5af6f4d Allow custom Creature implementations to override the parents controllers
    • #322 Enhanced TextRenderer API
    • a1ea04c Implemented EntitySpawner support for providing spawn points via callback
    • d4207f8 Make use of Spawnpoint.spawn in the EntitySpawner to support events
    • 5d8a575 Added pivot support to Spawnpoint to align spawning entities
    • 8ea0151 Load CustomEmitter resources from ResourceBundles
    • 8113566 Properly support resolution scaling at runtime

    Added a unified Random API for the engine

    4217403 Previously the extension methods were spread around the utility classes. With these changes, all additions that provide pseudo-random values have been unified and aggregated into one API: Game.random() Some prominent examples of API changes:

    • ArrayUtilities.getRandom(...) -> Game.random().choose(...)
    • CollectionUtilities.random(...) -> Game.random().choose(...)
    • MathUtilities.randomSign() -> Game.random().nextSign()
    • MathUtilities.getRandomIndex(...) -> Game.random().getIndex(...)
    • ...


    • 56a123e Use java.nio.charset instead of constants strings for charsets
    • eef04d2 Consulted entity AI related namespaces under de.gurkenlabs.litiengine.entities.behavior
    • 9a78dc4 Unified some event names:
      • ICombatEntity.addHitListener -> ICombatEntity.onHit
      • ICombatEntity.addDeathListener -> ICombatEntity.onDeath


    • #314 #315 Added the possibility to export all sprite sheet information
    • #313 Added additional console feedback for common operations
    • #312 Placed status-bar directly under the map view
    • 319c32f Fixed potential exception when clearing color controls
    • 67aa299 Make components and font sizes aware of the configurable UI scale
    • #320 Fixed silent startup exception when last game file was empty
    • 7ca746f Improved the AssetPanelItem visuals


    • Added a ton of Javadoc to the public API
    • Added GitHub sponsoring button to the repository
    • Replaced deprecated Gradle configuration elements
    • 509d749 Updated Gradle wrapper 6.0.1 -> 6.2.2
    • ae8f102 Updated JUnit version 5.4.+ -> 5.6.0
    • ae8f102 Updated Mockito version 2.25.+ -> 3.3.3

    Contributors in this release

    @Phlosioneer @Gamebuster19901 @YannikSchoeberl @hyler

    Also, thanks to all the contributors to the LITIENGINE community in the forum and our discord! All your comments and thoughts help us to shape the engine towards a stable release.

    Source code(tar.gz)
    Source code(zip) MB) MB) MB)
  • v0.4.19-alpha(Feb 7, 2020)


    • bf31e15889cf18ac8a1d6e7112eb295961b77e9a Fixed ArgumentNullException that could be thrown if an entity hit event was not related to an Ability.
    • 7c25cb2b2c9db4867b67f1bdbcc2814939399320 Fixed bug that made not work for files within a jar.
    • 69afe69f4162d1c9f218b8c42eaf2b84271e238d Don't ignore minimal location updates on entities
    • 680ce0b0e1f66ab2804b80133086f5b45d9716d1 Fixed issue which caused the Camera hotfix for certain renderscales not to work.
    • ca5cfa2b19fe7f10d2890f9f980f5b65db483a4e Fixed null pointer check in TmxMap
    • 59360c453c1fca4f4c176a2bceb7a6e6c9dd0a0a Fixed issue with the GameWorld.reset overload

    Features / Improvements

    • Added and improve the Javadocs of many APIs
    • aeccaa4 Added possibility to remove timed actions.
    • #301 28f1036853750f904fe0fc111947a826765b07b3 Added entity render events for individual entities.
    • adb2bfc04e8ebdfbddf22cd180a02ee3c3ae95f1 Extend the ReflectionUtilities with a few helpful methods
    • 9fde70d4b80d5ec2422ee7a5d13cf5c67cf61386 Added events for changes on ConfigurationGroups
    • c8ca4b126b1c68fe76f2229ccb4adef04c9740d9 Added events for layer rendering on the MapRenderer
    • 70c598ac4390f8ee93327c2428cb26e4291ba29c Added onMoved event for IMobileEntity
    • 41679ed36c8549ec3c542a732c818363e3068d66 Added spawned event for Spawnpoint
    • 87c339da1f73c739bdeb7ed26711f27a022537d0 Added updatable count to the GameMetrics
    • a7a763727f093fa4b7cfe1b472effcf5c1108e7a Don't modify layer visibility when serializing maps.
    • #297 Re-Added shortcut API for finding tile bounds


    • 5ddf044ef8e433df3a720dcd34b7fd6722dd02e3 Drop the Game.loop().getUpdateRate() method in favor of Game.loop().getTickRate().
    • 30cd2c19bc3fcf88b1a3745f2afed2d2f3b3d03b Improve visibility modifies of the SoundEngine
    • 6d92e25e052a431c52bb5dd476a3dde6bb1af903 Rework the default mouse cursor behavior
      • Use the default cursor if no virtual cursor is set and the mouse is not being grabbed by the window.
      • Move the debug cursor handling to the MouseCursor implementation
      • Don't grab the mouse by default.
    • c950d551bf0067d8fe323741d3b1c9edb7d3be10 Replace some explicitly thrown exceptions by log messages.
    • d715f2fed0531dd1873fae6a96736bdc8a19e214 Drop the de.gurkenlabs.litiengine.annotation package.
    • 39f365e779261eaa277b5f1be4cc16d16c4da643 Change Entity collections from the Environment to be immutable

    Revamp of several event methods and listeners

    • 3747d8c73601f1e9f9a8e4b81b2c62aeae8dd7a9 080afea7c1d19aec9cb7bb092c4cf29f3f923265 Streamline rendering events and API
    • 59b4b3d09f57cc5d5cd84d8c8fd0e7bac7d29559 Reworked the ScreenManager events
    • 1c41e83b4e333141bc4b16af0f39bb9a91b9cb99 Reworked the Mouse events
    • 537b5d73b335b2595252199bb1b229517c401677 Reworked the Keyboard events
    • 480a259f61070bf366afd23186a2fcda5ca03d0a Reworked the Gamepad and GamepadManager events
    • 111d81da1bcd83e1b227016867683088618a17b0 Reworked the Camera events
    • 4204d8ad8883c18933374b664f4ccf0b5f469e80 Reworked the Emitter events
    • e438fc84e983369ae2160e6f12475572516b6f4f Reworked the Ability events
    • Marked many listeners as FunctionalInterface


    • 60c0466012238593e614ba18cfe5db6ce4d76f75 Fixed initial error when no game file is loaded.
    • #299 Fixed Reassigning map IDs


    • Updated SonarQube plugin 2.7 -> 2.8
    • Updated Gradle 5.3.1 -> 6.0.1
      • d4d35a7d8d91dc7d36fc6c36b17de9792af5fb96 Print Gradle warnings in the build log.
    • 7340f5bd3dcc2f97ba67d50a385c9566b6c66635 Prevent duplicated resources in the .jar files.
    • 94b46dc690f5c3b8a1269f93f8012d516701115f Exclude duplicate files from the jar.

    Contributors in this release

    @TheRamenChef @Phlosioneer

    Also, thanks to all the contributors to the LITIENGINE community in the forum and our discord! All your comments and thoughts help us to shape the engine towards a stable release.

    Source code(tar.gz)
    Source code(zip) MB) MB) MB)
  • v0.4.18-alpha(Jan 1, 2020)


    • f3b0e529d7fda0a9560db3c2481e18e509023ef3 Fixed a possible StackOverflowException in ImageFormat.isSupported(...)
    • 479e48433b45b1b4b110ef2c2c9745453bbe5ac1 Fixed mapID assignment for Blueprints
    • 52f80e187c0dee5d795044d380a9aee5210b397a Fixed concurrency issues in TmxMap by using thread-safe containers for Tilesets and Layers
    • 9ac68d1cac4cf882f0a26ae9272900481efb27b1 Removed redundant call to Creature.updateAnimationController()
    • 6bed9f1be784fcbd37acbdcb375dab6383f05647 Replaced RenderingHints.KEY_ANTIALIASING with RenderingHints.KEY_TEXT_ANTIALIASING in the TextRenderer
    • 5aa2313dc90b054041604130c4a1142b46d004e0 Fixed Trigger to adopt changing activation conditions while relevant Entities are in the trigger area
    • #266 Fixed the way AnimationRules are added to EntityAnimationController
    • afc19979d8793e63bb8809f0dd93b54a1ae7f2b7 c39d441ede813a4645d281d795725b734a17252e Fixed some graphics issues in the Camera and Environment
    • 4cfe6edddef1deafe1bf64d35bd8531b17332ea2 Fixed Concurrency issue in TileLayers.
    • #264 Fixed wrong tileset locations in exported maps.
    • fa573c917c5a53bcaf4afd356401cd53ab777787 Fixed possible NullPointerException when a Tileset's image was null
    • 217d41b04cc236b605ff3513361b91b6b0a7cd0e Fixed UpdateLoop interruption behaviour
    • f152d52add53e06dc011fba3b9358c635e128b16 Made sure Entities cannot have negative width or height.
    • #271 Fixed wrong argument in Spritesheet.setSpriteHeight(...)
    • #283 Fixed potential null reference when CustomProperty value is undefined.
    • c53b036fcb7c01623cc997d9bcea40e3f8dd552e Fixed potential null reference in DecimalFloatAdapter.
    • 4956e23f2c4f7193d290d7aca4ff94adcc5ca932 Fixed potential text outline bug when using certain RenderScales.
    • 65317ef4aea580fbc6ec66d341f637f16af5f4d1 Fixed entity debug rendering being cancelled when current animation frame is null.
    • 64b1de4572490a12b844273dae4b20d98d3dc6a6 Set default font for all ImageComponents containing text, not only the ones with a background spritesheet.
    • #295 Fixed issue with virtual mouse and grabMouse setting.
    • 25f60bf52e23da42048a8c8c833f1a2ed93b5f0c Encoded spaces in file paths.
    • cfbe31dc3b00b4fdc05e96eced397d861e602030 Prevent potential null reference when trying to scale images that are null.
    • #284 Fixed map serialization being distúrbed by handling paths as URL fragments.
    • 1d4ad94587c799df83cc07e9dc771a793f0eeecd Fixed an issue when combining paths with whitespaces.

    Features / Improvements

    • 8996fd4565f0ffc7addec6e9a0f4a6d968ed775a Throw ResourceLoadExceptions when failing to load resources
    • 9bc1f2bf82fc89f930c02dd0cd423c6dd1c047e1 Added renderWithLayer property to @EntityInfo
    • f93a191cdabe8215e1c753f99ff06fd33f6317f6 Set default RenderType for TileLayer to GROUND
    • 6876143e4682aab38781a7d6a12db18df30da594 Set default RenderType for all Layers to GROUND
    • de2c7a02a98d0e4f04b225346904de03fe18206a Added util method to extrude rectangles
    • eba3d4962bb00902f734b6246ed395f386818ef9 Added getter EntityAnimationController.getAnimationRules()
    • 816715a4299150fba9457e4e9fd593d5f27aeac3 Added method overload for EntityAnimationController.addAnimationRule(...)
    • #224 Added Appearance properties for borders
    • dc550f0b4fddf6f01d0a91dce9531082a5ecbcbb Added SpeechBubbleListener
    • 7674c6c2903d15f2d871a7621efbaaf2be393fa8 Allow setting SpeechBubble text display time
    • 61dbc657e772bd3a05e262078e13a636b60c29e9 Allow hiding Speechbubble
    • e067ef1a4e2dfc286b662e9499761fbd65802391 63d4fb23ac0240de37183f8bf3d61cbc72f25dc6 ca714b70a7a3c2603ba6cc9bf6686614369f0400 f6db03d7f12289ac3ae286c6188c7c33794b4c6b 077b52506db62a44aed8f9f17a9618ec40997f31 Minor overhaul of the Sound Engine
    • 98255f91b1c6e440422bdea614316fa0a692e1ac Allow an Entity to be removed by an EnvironmentEntityListener it triggers
    • c188504d846d61b210ba39492cf68495e28a6c8d Replaced some CopyOnWriteArrayList instances with the faster ConcurrentHashMap.newKeySet()
    • #265 Added ImageScaleMode.FIT to strech ImageComponent images with the correct aspect ratio
    • 5abf10a2e486ebe45c1ec1aa163fa46270403c67 c5391aebfa892c7daf69ee80e5cb17183392ba06 Improved generic type handling in EntityAnimationController
    • 9c41b51bd5fc044d0d243027f65f3bba308a2937 Overhauled version checking for TmxMaps
    • 102c48bac194197c0ba77f49e2ffaab25d140eae Added Unit tests
    • a538528c6843003a806e521aa5f040f43f4d5bbc #268 Implemented more performant Collections for keyboard listeners.
    • 3d41a91057547217b9148b7d1dc821974ce90c7e Added method overload for ResourcesContainer.getAsync(...)
    • d8236a9bd9e6b364e8ba3c063c273b99b54b7324 0d55b7a53bc9cacc84efc71d3473352237e815d7 Switched to more specialized function interfaces in some places.
    • bcfc753afabe8b2373704f486775ca94fd07ee60 Made sure the miscVolume of a SoundPlayback is updated automatically.
    • 511d0b8a40458a33d2b7e2d7a9a028c7a5b0ff30 Instead of explicitly setting RenderingHints in the TextRenderer, toggle AntiAliasing with a boolean argument.
    • e2675a16aecf1badb2c33d9f0eb0e5b7e111976e Removed some unnecessary wildcards in EntityAnimationController and AnimationRule.
    • 90737bb129dac8e41b07a8d0999b8adb60f0d67f Added active flag to exclude IUpdateables from the update mechanism, where desired.
    • 9da382263a5aa5d8c91bd53ea53b76eaf5d74275 Set mouse Cursor to be visible by default.
    • e043ae5e03eaf835b0854cf971d4b6fd2b68136d Added multiple collision handling to PhysicsEngine.getIntersection(...)
    • b57df91d46921e66af076aade06dce168e36f1df Improved logging on the entity action framework.
    • a26a993e4aa62b049280c09ccaae32f43537a02f Added attribute to CreatureAnimationState to remember its string representation. Cancelled MovementController.handleForces() if no forces are present.
    • bfa6d81fbd539c50c7c686fc9987f3258533414e 0fc383dbca7b78f69762e07a190ce15621f4b52d 6f3f2dd3c83e29085da10752053950278f420588 95bc61d55f363be27bed88e030cc79254499e63a Changed some SonarQube project settings.
    • c46632acbb466051c3c9b668b5c6cbd8f412e188 Improved Resolution implementation.
    • d6c976fcf42d94038649e0e6d026a34bca948202 7278da59bebcdd5c11ad141e172b11349b423888 Switched to CollectionUtilities and ArrayUtilities for random access. Switched to ThreadLocalRandom instead of individual Random objects. Added method overloads to pass random instance as argument.
    • d452fdae467288d8e5a9dcf4537216e3a1bf98d1 Enabled null values in CustomProperties declared as enum.
    • 16f0929dd33202410505434273e47a3afe5e823e Simplified and improved entity debug rendering.
    • eb6924b3ecc61208326e9b600b68a5258f7e3367 Added some additional API to allow map generation from code.
    • 24df305b8cc0e2fc084a76e6eaef1f5169dd88c7 Added util method to get a random point within a circle.
    • 477eddf1c49a436ccea662bda63fac51b8a3b66b Added overload to MapUtilities.getTile(...) with map argument.
    • 10a233fe5ec023b7246a6cb812850beab7bcf1eb Removed redundant call of ByteArrayOutputStream.flush()
    • c0c001e53c1184180431fce87f4b35e4e596aea1 Added util method to replace colors in an image according to a Map with source and target colors.
    • f62e23c334d832100231bdff46e6bfd2ae7a51c8 Made sure the GamepadManager updates the gamepads once it is initialized.
    • 3128eb078db409f3c0054e2d59a8c0c5502920d7 f1241869f8dfa4db31e7f1644fae6049f2c5e80c Enabled clearing registered event consumers from Input API.
    • 63c9b8dc96f142f22e1a89947725194a20877104 Added reflection util method to retrieve values of static fields.
    • 47c4ddc37ed7707b4068a7b0f94aa8dbe61eabf8 Added Gamepad.isPressed(...) to check if a button is pressed on a gamepad.
    • c67bf33c87b445300320721ea54dacf78c3418ab Enhanced Gamepad.toString().
    • 8e5ed731be17c665ae4dfbaaea782790fddbacf5 Enabled gamepad polling via component name instead of JInput specific identifier.
    • 4e5a108d1397caa1d7c692f2794242996ecab712 Added possibility to parse a given resource file into a string.
    • c4b40a9b0bcd217ac8eb905b6e78362ca2cd387e Added mouse pressing event.
    • 44a765d0bd7a9896603e27f8c72f93a407a75c69 Added missing setters for some Ability properties.
    • #290 Implemented borderless display mode. There are now three modes:
      • WINDOWED = Resizable Window with decoration (otherwise it would not be resizable)
      • BORDERLESS = Basically windowed but without decoration and scaled to the entire screen
      • FULLSCREEN = Native Fullscreen; locked to the framerate of the Monitor
    • 564ea9613e15ec2ccee31827354de6fb9ccfcdaa Stored a string attribute as lower cased so that it doesn't always have to be converted.
    • ac0b11bc464c89aefce1bee29cc8bca8db8d44f8 Made XML format more compatible to the TMX tiled format.
    • 949be864b5fe9884979e1bede3cc8719f9f0b668 14175b670b76eb86623901081b9c0e1d6fe0b961 Added overload method to set mouse cursor location with Align and Valign parameters instead of absolute offset values. Set default pivot to TOP LEFT
    • f12df416083af364521e4e4b852f362e93ff87da Implemented human-like alphanumeric string comparison using the Alphanum algorithm by dave koelle. Switched to alphanum comparison for IMap and Resource names ([map1, map2, map10] instead of [map1, map10, map2]).
    • #259 Made the CreatureAnimationController only display the death animation as the last fallback if no other animation is present.
    • 406adc5d0706ee2ed99f4c45dd3d5f2ef5d9d69b Slightly improved CombatEntity events.
    • 504ccd4ecce4bf38deb20b5b7e570c10ab877923 Added append and distinct util methods to ArrayUtilities.
    • d14fa493b59f886e34762131e5e13e7b197d1adb Added collision event to CollisionEntity
    • 6310fd2554adef2e430d1b9bbff6afcb9c1b56b2 Improved logging for unsupported tmx version.
    • 5a13edd5a7754d102917658af27dd4212499cd3d Improved exceptions when an XML file is not found.
    • 2cab4c6041d7f7ad28351b2af4919895dfc787b8 Reset the logmanager before config to avoid redundant logs.
    • cbd947eafa9d5e248ccb5067a585047ef82a6ef6 Improved access modifiers on some internals.
    • 368ec9271fbfa1ca870c1fbb3f35e5d7fe4581db Improved AbilityOrigin enum.
    • 75d16bbaedb31865e71a90d9449cd9d2eda461db Added custom effect target evaluation.


    • 3462f0317b7901b806e4d891544ced3157eeef3e Changed Creature.updateAnimationController() visibility to protected

    • ff59b0acfcbb59d9f6f5f0faf8469038f6e8ba89 Changed EntityAnimationController.AnimationRule visibility to public

    • 4252de5c6070d2ff1e3fc6bc67cbd5fbdb25f345 Changed constructor visibility for MapObjectLoader implementations to public

    • 41b60472cc6b9710bee7d71fd31f682b251b91da Removed type parameters for

    • 14c712b076c90ac0553683da48f77fdd9bea97b2 Replaced Oracle JDK with OpenJDK.

    • #279 Separated mouse Cursor implementation from the RenderComponent. BEFORE:

      Game.window().getRenderComponent().setCursor(Cursors.ADD, 0, 0);


      Game.window().cursor().set(Cursors.ADD, 0, 0);
    • 14c26df15351832706d0bca3c0f22c16a14d5388 Streamlined Animation API. BEFORE:



    • a4ebf58e39d8411f5049b2e0de88d2c249f261c4 Don't limit cursor rendering to when the window is focused.

    • 887d635f184bb8bc330115cff6d3a5295b6e0391 Attached camera to RenderLoop instead of GameLoop.

    • 7490c53ab1387dbff4501dffff2cbd8ae7b7ba3e Removed sample emitter implementations from the engine.

    • 9e0379191786b1cbed869e76b77a1c50bbf391f4 Removed unused overload for Spritesheets.get(...)

    • #282 #289 Updated ListField to create 2D list fields

    • bdbde7d5c3f1dff372c30f13b20077ecf647736f Added Blueprints to game resources.

    • #285 Enabled TileData serialization. Before that, TileData could only be deserialized.

    • 2d340b7e23846e39c2a85abe9cde01e5dc7273ec Streamlined GamepadManager API. BEFORE:

      Input.gamepadManager().onGamepadAdded(pad -> {});


      Input.gamepads().onGamepadAdded(pad -> {});
    • 5fee6fd63ac1d42150e9d1bda9c88b449a6e83a6 Removed background spritesheet argument from TextFieldComponent. Enabled commenting string list files using '//' at the beginning of a line.

    • c0c93223f27b8cd5c168962883e0137cea085a5d Don't evaluate collision if a particle should not be moved.

    • eaa98c7b3d7e0b385b91d2708890ebcb387bfa65 Set SpriteParticle Dimensions to the sprite dimensions by default.

    • ad5a0a4f98482066a9fe22d819cb67ebfb2d4a5c Consolidated the RenderLoop with the GameLoop to circumvent a lot of concurrency issues and to make life easier for LITIengine devs.

    • d14fa493b59f886e34762131e5e13e7b197d1adb Streamlined logging API. A default Logger instance is now added to every game and can be called with Game.log().log(...). Added ConsoleHandler and FileHandler for logging.

    • cd75d15ae5d19693aaeddbf5a5a2cd0136738d12 Streamlined Trigger interactions.

    • a612d695688b8cc0fb519d8f8f6f8ae9814f2601 4d23378caa1921dde1b6b45e302170f61cbaca1a Unified hit events for CombatEntities.

    • 695806a7b829647a847ae16cf3c9e33303ef1e2e Moved file format enums to the resources namespace.

    • 02e7471add80c091398ca42962e3c4153719b002 Removed empty child implementations of PolyShape.

    • 816d7ad69e16f5a274de5e1320174cefe80ed5aa 1894c981bfe96eab7454e4a259dc8c10ba431c63 Streamlined Attribute implementation.


    • #258 Fixed MapObjectLayers being deselected when copy-pasting entities
    • 3433362808b88999a18fb9a8e18ad44d3babe4b9 Improved MapObject ID rendering
    • #261 Correctly refresh UI after deleting entities.
    • 15f234799a00de9718a957eb8b83b32927e94eed Separated Entity snapping from clamping to map. Renamed snapping presets.
    • 02d6b02dec7ecc665b8b8924d74e1a4d90d2bdf3 96223f9cd3f1c2a1f1525b1ecb5fa75783b31b79 5ad81e1fa36ae22e9642ac505b625281c24361dd 1e9d84be8d0e85e2bf9c9b4410c7bba7a217cd83 Added dedicated zooming handler.
    • 50d511e2f48f7f9eabc1c958af8ec9ee2aa5a160 7f75cfdb5232e6236c8daaa09aceacc93c1eabb3 Extracted Entity transforming logic. Separated rendering tasks into dedicated classes.
    • 940190b78c9e4d6e465864c01348b5c81e10b77f Added Unit test routine to Gradle script.
    • 5e4bb3f0ba987f5223fc1f63aebd4216cb35b7b8 8612f692c57cb9559af33ca7cb210980dabe58e1 Added general UI scaling. Added ConfirmDialog wrapper.
    • d4cf6df21fd1d46b926958d00eee26b51254fa72 Moved UserPreferences to the Editor class
    • 63ff169a79322e3cb4f79009727fe3ec1f474966 Added some localizable strings.
    • c4d21152c4293937139cf3d9b8a362e189eef9d6 Fixed a Font scaling issue. Minor fixes and improvements.
    • c061d8e52e848f976d141338a83322b1122198ab Fixed issue that sometimes caused the map list to be blank.
    • edd0bfea29dc26095d2d6c2077a908d40aef933d Removed redundant focus update.
    • 25ef97a3e07d00630b93fca8297a6df661309dd9 Declared some overrides correctly.
    • 7c9117ec4ec9a0c2147a1a57d89335819e52dc1d Fixed clamping when moving multiple selected MapObjects.
    • 2724acb5761ab193238ed5f2fa1a9b145f156b9f 1f34a90d1e51e76272c6e76e87c9b88f1480e34c Improved resize operation.
    • #277 Made snapping grid size configurable by user.
    • 14fec8717871bd532e04250524ad7b85a29e2286 Removed redundant reload from map when transforming Entities.
    • #262 Fixed the map selection being discarded when changing map properties.
    • 50b3978c78262b3b2b658c2b4e17d66cf93a41a2 Fixed positional transformation using keyboard.
    • 777ba8a098bcaf2b1768123ce1dbcefaca36610d Added private constructors for static handlers.
    • 213c1e52a583716ac9661325576179b82d9cb402 Fixed issue that prevented new maps from being imported.
    • fc0d1bf2b99778a25e7eb533dd4d39200c1d995b Fixed potential null reference when no map was loaded.
    • 879cde1557157ccaa242b78ad21f59872c1453d5 Improved behaviour when trying to load non-existing projects.
    • f15177b570cc6a7d7786efaf83576f88e3077bb5 Added Ambient Light and static shadow preview to MapPropertyPanel and enhanced the panel's layout.
    • #292 Enabled Map property manipulation in the MapPropertyPanel
    • 64ec7b751abb480fe7af245aefb8790a3d7fdcc9 392bcc5bcefe5803bae3eaa9d260e02dca29e90a
      • Added Alpha spinner to the ColorComponent to make it more reusable.
      • Enhanced MapPropertyPanel with the streamlined ColorComponents, a scrollable Editor field for the map description, and omitted non-custom map properties from the table on the lower end.
      • Allowed complex components with varying height to be added to a PropertyPanel.
      • Fixed Label Alignment in the PropertyPanels
    • 5309c6f839dc8a06ede00e7a9c5ddefe3c1805cf 5964444d646d676c617876551f8aea9e3070d8fa
      • Switched to concrete Map objects instead of just name strings in the MapList.
      • #262 Fixed the MapList losing its selection when changing map properties.
      • Added MapListCellRenderer for further customizability of the MapList.
      • Don't rebind all Maps to the MapList when just saving the game file.
    • 04223a486ae63dcafbe23ce4e4ae07ce7332abdd Changed the AssetPanel layout type from a GridLayout to a dynamic WrapLayout.
    • b7d464e373eed25a1850cd82ced826d86011ee68 Display the default value for CombatEntity hitpoints in the editor.
    • 3e22f1c8ca8213267f8a926e01011c304b2ea9b9 Improved control flow via keyboard.
    • 2089445ae3a52c22e2cd16d0fa2af9d9b9d83a34 Replaced usages of deprecated Event class.
    • d95c73af7bac97ca3b85ad037f6f01e5dcf356db Fixed issue with save state of a map not being tracked.


    • 1e7030bd6b04b171938e723e1cfff2b005f2f7cc Updated code of conduct link in
    • a9706fdc33ff9770d09d653f17b4903f445d529b Moved "Games made with LITIengine" showcase to docs pages.
    • 747731845b43226724ef189e291b9a42d150e639 Added FUNDING.yml
    • 448b630959ab665a5b5770049feccfa50dad957f Whoop whoop.

    Code Style

    • 95f44c335a047b0ea94be7e367c66f46b6c73a1f Removed some curly brackets to match correct single statement syntax.
    • 274e8028386d3608577f9890ebe5ad3593c1f44b Removed redundant if-block
    • 8d7ddd76587aa13fc82e23a39967860f95a84481 Fixed variable name shadowing
    • 02611a3b591ae0ceccda5cd270b61ae4dd39bcae Added unused annotation to empty test method.
    • b391b16cbe124c7e5b32f98954bb80503336529a 4730c37e6b9a0eb1884fb71ac6c7ac6f2447d20f e0ca3a89e6218d39f51966cbd400e0548a90058a 5e10e26da9a3828d2c4145e0932283135e398218 9485f97481bd2884e1364394d72b014568a3326a bbd10e74b2ab759ce712747e651e72406cf4f421 Fixed minor style issues.


    Contributors in this release

    @CalvinMT @TheRamenChef

    Thank you!

    2019 has been an eventful year for us, with LITIengine seeing more than 600 commits since January. The number of stars on the LITIengine Github repository has doubled again in 2019! The interest and demand for LITIengine is out there, and we are deeply in your debt for giving us your time and patience. LITIengine Github stars powered by Thank you all so much for all your contributions, your discussions, your bug reports, your suggestions, and all the support you give us! Cheers to success and health in 2020 and beyond.

    Yours truly, Steffen and Matthias

    Source code(tar.gz)
    Source code(zip) MB) MB) MB)
  • v0.4.17-alpha(Apr 25, 2019)

    This release comes with a ton of improvements for the utiLITI editor which have been implemented in preparation for LDJAM 44.


    • #249 Fixed an issue that caused the terminating callbacks to be executed after the system was already terminated
    • 7ff40626eaf232821e8b0054adf25035aa4e6aa8 5e284be8a3f99b82d862c8b350065404ddd51b64 83e7da3e2fceab49d0eb903f23bdcdef24f37947 Fixed rendering of StaticShadows
    • 4cba2a4a742bf3da98c23e39b15ff0f71c4caa1c Fixed an issue with the SpeechBubble implementation

    Features / Improvements

    • 91a81fbcc48523c4d8a6327ac16fae37e98ee295 Improved the delay() of the loop tick by accounting for the delay error that is inevitably caused by the fact that Thread.sleep uses long instead of double values
    • 012b75d4488d5b00dc4b6321b3246e54c0f87aa2 Minor version numbers of Tiled map format releases are no longer considered when checking for version support because they are only used for bugfix releases and have no effect on the .tmx format.
    • b1ca5de3a12430978ee33127beed4eddb945a4d1 Implemented possibility to retrieve a layer by name and ID
    • c7af38a475b0c185a0786abd6d6026bd9084f715 Added methods for text and shape rendering with antialiasing


    #243 TMX Overhaul, Part 2

    • All resources except spritesheets are now cached using URLs as keys (they still work with strings)
    • Resources can now be loaded asynchronously
    • Most entities loaded from map objects are now rendered as part of their respective layers
    • Tilesets that use individual images for each tile are now supported
    • Tile types are now supported
    • File custom properties are now supported, though only tentatively
    • Light sources now use an enum for their type
    • Various refinements for several features

    Other changes

    • 4fe0e8130bad562e81bf713ebee5d35e8f4007a1 Rename collisionboxHeightFactor and collisionboxWidthFactor MapObjectProperties to collisionboxHeight and collisionboxWidth. This might require you to adjust maps created with previous versions of the engine.
    • 4fe0e8130bad562e81bf713ebee5d35e8f4007a1 Entities that have a duplicate or invalid ID now get a local map ID
    • 21d2bbc Moved some time related methods from the GameLoop class to the GameTime class (use Game.time()...)
      • 91a81fbcc48523c4d8a6327ac16fae37e98ee295 Game.loop().getDeltaTime(long tick) has been moved and is now Game.time().since(long tick)
      • 91a81fbcc48523c4d8a6327ac16fae37e98ee295 Game.loop().execute(...) has been renamed to Game.loop().perform(...) to be consistent with the EntityAction terminology
      • 91a81fbcc48523c4d8a6327ac16fae37e98ee295 The input loop is no longer a GameLoop and instead "just" a plain UpdateLoop. -> There should only be one GameLoop (that provides enhanced functionality like TimedActions)
    • 4a37838d4391edc7b6a54ad0e55476c18cd52794 Renamed the Map class to TmxMap to avoid collisions with java.util.Map
    • d2cb9ba4849dcf86c1e4d7264a981f7c32b299de Cleaned up "render entity with layer" feature



    • Fixed a potential exception in the asset tree after closing
    • #240 Fixed issue with cached states of imported maps
    • #246 Fixed issue with the cursor that stopped moving when a menu was open
    • #247 Fixed issue that caused the paste command not to be enabled.
    • #253 Fixed custom panel table cell editor issue.
    • 369056e10310746708ee8edbaba1c881ca40dc1f Fixed issue that caused inconsistent move edit mode
    • 4890d159af93aef8d3fc223726722631601abd51 Fixed an issue that caused the transform controls not to be rendered properly upon undoing a move command.
    • b6732620915afe28ec5cdb3ed6af3e234d3bd517 Fixed broken map snapshot functionality.

    a7d981d7b88eef44712a4756b83e825ff29af6e5 Improved utiLITI menus

    • #246 Replaced the AWT menu with a Swing menu.
    • Added a close button
    • Added clear history button
    • Disabled menus and entries that are not available
    • Cleared the entity tree upon closing
    • Reorganized some menu items
    • 628c9f6d1fbf23b95ac2427cca99fe486ec8957f Add menu that allows moving entities to other layers.
    • ac8451795e51beb5ae533aa3b0bc165999e71f92 Added an "edit" menu.
    • 781804700f59b31af29997efe6f0c02440140993 Added menu item to center the camera on the current focus
    • 781804700f59b31af29997efe6f0c02440140993 Added shortcuts to all "Add-Entity" commands. (CRTL-1 -CTRL-9)
    • 4890d159af93aef8d3fc223726722631601abd51 Removed the toolbar The buttons on the toolbar are not really required and can be accessed elsewhere in a more convenient way.

    Other Changes

    • Some huge internal code refactorings and improvements
    • 4890d159af93aef8d3fc223726722631601abd51 Reworked the "MOVE" edit-mode which can now be triggered by clicking the mouse button within the bound of a map object instead of having to press CTRL or manually activate it.
    • 628c9f6d1fbf23b95ac2427cca99fe486ec8957f Added option to toggle rendering of entity names.
    • b94433ad702608f4b0d76cd6bfab770729d3afa0 Improved displaying of severe log messages
    • 34582a83b5bad9fd9cd8f272e0a98e6526959f67 Added possibility to focus the map center with the camera.
    • 628c9f6d1fbf23b95ac2427cca99fe486ec8957f The entity's layer is now displayed in the UI
    • 1d9dc3480cd6ef024fdfbdea2760955b66b8a36c Implemented "selectAll" and "deselect" commands
    • 4266a76bf5a4bff9ad0c0b19c0e06c92033836df Implemented possibility to revert all changes on a project
    • f9370bc6f4d902973d1a5b4b44da63b046f614fe Update mapobject list when ids are reassigned
    • ad265eb2749bfc883f5b2ed210d40d2ecb35c72a Implemented the possibility to set the RenderType of an entity


    • The source code of the LITIengine is now citable for academic use via zenodo:


    Source code(tar.gz)
    Source code(zip) MB) MB) MB)
  • v0.4.16.1-alpha(Mar 31, 2019)


    • e5da3605e4c821e52ec856d727297cf60ef8b864 Fixed an issue that caused only fields with the same name as the TMX property to be loaded
    • 9137bdf108bfd43b10d6db1f5d04029f83efbdb9 Fixed text rendering realative to the environment
    • #162 Fixed issues with the jaxb dependencies for Java versions >= 9
    • 9e20b20db3f68cc413a091e6644155637351d464 Fixed an issue with mouse events not being forwarded after the window was resized

    Features / Improvements

    • aea88772f95f2482c8a548159081796295021192 Rendering the GameMetrics has been improved and additional information has been added.
    • 9dcd82cdc7a69f10c4514fdf44ba8aca88453680 Implemented support for TextureAtlas created with the TexturePacker tool
    • #190 Improved error message for Spritesheets.
    • #211 Introduce the concept of Entity Actions
    • #103 Cleaned up event handling of the AnimationController
    • 9d2ab2040fe235a069752652b63d923ec330557a Implemented support for web resources
    • #218 Implemented support for SoundResources
    • 8b48d728d04e19d96ed5e0c9dcb4a3b555d25ef3 The animation controller is now updated when the sprite changes
    • fc6b586d9747ba32ede420f735efd801c5eff6a3 Implemented support for rendering layers with their respective opacity


    • 68aae15cc4b2fa9b5322606f127bdad82649d249 Overhaul on the Material implementation
    • 5de362014a31823e3e7106838e6d8f358a098464 Internal overhaul of the ScreenManager
      • Extracted the GameWindow specific logic to the respective class (see Game.window())
    • #171 Resources are now being accessed with URI-based filepaths
    • 806309b14e4bbf3d6635b55aae5b32251e0e7462 Some improvements on class names
      • Renamed the static class ImageProcessing to Imaging
      • Renamed the static class SerializationHelper to Codec
      • Moved encoding/decoding of images to the Codec class
    • 17ca6fa3d1d885c16d8027b09a4483a17669de4e Moved the InputLoop to the Game class Input.loop() -> Game.inputLoop()
    • #215 113b28f9768063affb9b1816be9ce287a882df03 Overhaul on the GuiComponent framework
    • #228 Adjusted the default resolution to be based on the computer's native resolution
    • #232 Removed the IEntityProvider interface
    • a5e634be2fd8d352b824b8870f0dfcbde492a7ac Replaced the isObstacle flag by the usage of CollisionType.
    • 2e033ea0ea14d51e87b003aa0a8dadfc652fce29 Removed various "adapter" classes in favor of default methods
    • TMX Map Improvements
      • #150 Implemented support for .tx format for blueprints (tmx templates).
      • #150 74f45c162dabe25ea08bdc72b51ba16522f9d130 Added support for additional MapObject properties
      • #3 The order of image and tile layers will now be serialized in the original order
      • #150 3cd351c795b972b27b5a41389109767531475f16 Implemented support for GroupLayers
      • #232 Rewrite the map orientations
      • #230 Handle missing version tag more gracefully
    • SoundEngine API Overhaul
      • 03f3c9918b325db7362d8d166954057aea6e3afc The Sound is now always the first argument for all playback methods
      • #236 Reworked the SoundPlayback implementation


    • Various usability and stability improvements
      • 1c0bda46e865b307a715870b0214fe2a4eefe231 General rework of the layouting process
      • 83c91760a7a07afdfeedc413108f68c331ac2aec OpenSans as default font.
      • 2e207c0dcf462124ac3576eb1f89a37c99f0a805 Removed custom fonts from the editor
    • #91 e80d4ae37a50bfcb502307d859d704f02855ae7f Implemented 'Movement' and 'Combat' panel for entities
    • b9cce67a033062e4cb80f0f36113a782b1c137ac Allow rendering of MapObjects without type
    • #90 Animations are now being previewed in the Spritesheet dialog
    • #166 Enhanced the UndoManager
    • 4bec9b30523c9eeecfe28ba5bf58ad244d37567c Fixed issue where the editor size wasn't properly restored
    • #216 Fixed an issue when the system doesn't support tray icons
    • #235 Fixed an issue with copy/pasing Creatures
    • 5d697f6fcd58a93a43e8409a307570a2ca346796 Fix potential NullReference when deleting all maps from the editor
    • 20dbcc2e4b8aa627d66dc7b3c9d1407eceb71669 The Entity list is now sorted by mapIDs.


    • Improved Javadoc and external documentation
    • The max. supported TMX format is now 1.2.2.
    • acbcd49b0fbc2b8d5f16c55062023bb4d602c8a9 Removed the "Hello World" example projects from the repository
    • Updated Gradle wrapper to 5.3.1
    Source code(tar.gz)
    Source code(zip) MB) MB) MB)
  • v0.4.15-alpha(Jan 4, 2019)


    • Fixed the tile flipping implementation
    • #176 Fixed an issue with the Trigger's internal logic
    • Fixed rendering order of the ImageComponent
    • Fixed an issue that caused the game not to terminate all its threads.

    Features / Improvements

    • Implemented the possibility to register event listeners for the game initialization.
    • Introduced the new GameWindow that is used to access window specific functionality via Game.window()
    • Improved a lot of internal data structures
    • Improved the overall performance of the GameLoop
    • #188 #193 Improved the thread handling or the SoundPlayback
    • #196 Introduced the new GameWorld implementation (accessed via
    • #196 Added a reference from the Entity to its Environment
    • Added the Spawnpoint.spawn method
    • Disabled turnOnMove() when applying Forces
    • 72c9a2dcd95d30353d4fc9b565e84cab31146e52 Implemented the possiblity to provide a global or map specific gravity force
    • The camera is now centered on the map by default
    • Added a platformer specific movement controller PlatformingMovementController
    • #205 Fixed collision with the boundaries of the map
    • Made it optional to exit the game when an exception occurs: Game.config().client().exitOnError()
    • Enhanced the PhysicsEngine with additional method overloads



    • #191 Reworked the Resources API
      • Replace the ImageCache
      • Simlify the API (less to type and everything regarding resources in one place)
    • #189 Dropped subfolder for localization files
    • #194 Reworked the TMX implementation
    • #198 Reworked the Game API
    • #202 Introduced the GameWorld API and moved some methods that were previously on the Game class
    • The AccelerationMovementController has been removed and its functionality is now part of the basic MovementController


    • Fixed and handled a few potential exception in the editor


    • Since we don't expect any major changes to the API in upcoming releases anymore, we've started to document everything via the LITIengine GitBooks Page
    • We've started the new sample game project Gurk Nukem to get you started with the engine
    • Add a ton of Javadoc
    • Add a lot more unit tests
    • Update to Gradle 4.9 -> 5.0
    • Update steamworks4j 1.7.0 -> 1.8.0
    • Update mockito 2.21.0 -> 2.23.4
    • Update junit 5.2.0 -> 5.3.2
    Source code(tar.gz)
    Source code(zip) MB) MB) MB)
  • v0.4.14-alpha(Nov 17, 2018)


    • In general: Fixed a lot of exceptions and made the engine more stable.
    • Fix GeometricUtilities.translateShape() (always returned the old Shape)

    Features / Improvements

    • #157 Added new constructor overloads for the ImageComponent
    • #152 Streamlined the RenderingHints for Text
    • Added some convenience methods to improve the API of Environment and IMap
    • Added theEntityDebugRenderedListener that allows to simply attach custom debug rendering for entities
    • Added the NavigationListener that provides the functionality to access some events of the IEntityNavigator
    • Made the EntityNavigator implementation more flexible by allowing to specify the acceptable error
    • Made the Environment.getNextMapId() method actually check for present IDs instead of initializing it when loading the environment.
    • #167 Implemented support for hexagonal maps
    • Improved logging and error messages for Spritesheets
    • #163 Added the possiblity to loop Sounds
    • Allowed Spritesheets (and therefore Tilesets!) with margins and spacing between sprites
    • #150 Implement support for infinite .tmx maps
    • Various improvements to the SoundPlayback implementation


    • #162 #184 Fixed JAXB dependencies for Java versions other than Oracle JRE 8 (particularly Java 9, 10 or OpenJDK). JAXB is a custom XML implementation in the javax namespace that is not part of the default Java language specification. We now reference external libraries via Gradle instead.
    • Improved the naming of the ICustomPropertyProvider methods
    • #89 Cleaned up the CombatAttributes class
      • Removed non-general combat attributes like shield, attack speed, health-regen, vision, level
      • Removed leveling logic
      • Move velocity from the CombatAttributes to IMobileEntity
      • Move hitPoints from the CombatAttributes to ICombatEntity
    • Rename ArrayUtilities.getCommaSeparatedString to ArrayUtilities.join and add overloads that allow specifying a custom separator.


    • Fixed focus loss when pressing CTRL in utiLITI.
    • Added possibility in utiLITI to reassign all MapObject IDs consecutively
    • Made the editor grid configurable (thickness, color, ...)
    • Added Help menu
    • Editor windows will now be centered on screen


    • Removed the code climate badge.
    • Added a /docs folder that contains the LITIengine Documentation
      • Any help in creating this documentation is very welcome
    • Added Code of Conduct
    • Added Contribution Guidelines

    We are also pround to announce that @TheRamenChef is now an official collaborator of this repository (#164).

    Source code(tar.gz)
    Source code(zip) MB) MB) MB)
  • v0.4.13-alpha(Aug 6, 2018)


    • #133 Fixed the DropdownListField rendering multiple times
    • Fixed a bug that was causing duplicate map objects
    • Fixed an issue with width/height <= 0 when scaling images.

    Features / Improvements

    • Added a method that automatically adds linebreaks when rendering text
    • Streamline the IEnvironment API by adding lots of overload methods
      • Implemented possibility to get a list of entities from the environment by providing an array of mapIDs.
    • #124 Implemented support for rendering the backgroundcolor of maps
    • Added default values for MapObjectLoader.loadCollisionProperties
    • Added CustomPropertyProvider.hasCustomProperty() method
    • Named the Threads for better debugging
    • Added Exit codes
    • Improved crash report: It will produce a crash.txt with the exact exception that caused the issue
    • #151 Added Support for tile custom properties
    • #87 Introduced an option for antialiased/interpolated rendering
    • Improved the API for adding a custom configuration group.
    • #66 Implemented MapObjectSerializer -> Possibility to export IEntity as IMapObject
    • #105 Implemented possibility to use blueprints on the environment
    • Added basic events for loading/removing entities.
      • This can either be overwritten by custom implementations or one can register an EntityListener.
    • Fixed a ton of typos
    • Added a ton of unit tests
    • Lots and lots of internal improvements


    • By default, Controller Input is now disabled because it requires native libraries.
    • Controller support for x86 was dropped due to the jinput update
    • #134 The TmxMapLoader is now a static class
    • Changed the implementation for fullscreen from setExtendedState to GraphicsDevice.setFullscreenWindow
    • Made Game.terminate() private -> The application should be closed from code using System.exit(0)
    • #144 Remove the loading of system fonts by the FontLoader
      • The FontLoader is intended to load custom fonts from the game resources. If one wants to use a system font, he can just initialize the Font directly and doesn't have to register the font on the environment.
    • Reorganized namespaces:
      • Introduced new base namespace for all emitter related stuff
      • Moved some entity implementations from different namespaces to de.gurkenlabs.litiengine.entities.
    • The FontLoader class has been removed. Fonts are now loaded with the static Resources class
    • The game now crashes if an unexpected exception occurs
    • Detect an unsupported Tiled version and fail-fast (currently supported: 1.1.5)
    • Replace the IKeyObserver interface by the AWT KeyListener.
    • Remove a ton of unnecessary interfaces
    • #155 Clean up the RenderEngine by removing static methods
      • Implemented static ImageRenderer
      • Implemented static TextRenderer
      • Implemented static ShapeRenderer


    • #86 Made the editor remember the visibility of the layers
    • #95 Provided additional methods for adding entities
    • #81 Provided a default configuration for the utiliti editor.
    • #100 Implemented a deselect functionality when in multi-select-mode
    • #108 Made light focus offset configurable in the editor
    • #111 Prevent selection of all mapObjectLayers when updating the layer list
    • Added Layer control panel for Adding / Deleting / Recoloring / Duplicating / Lifting / Lowering a MapObjectLayer and one for hiding all non-selected layers.
    • Fixed ID assignment when copying objects in the editor.
    • Fixed issue with lights not to being updated when snapping


    • Added "Hello World" example projects
    • Updated Gradle to 4.9
    • Updated jinput 2.0.7 to 2.0.9
    • Updated junit to 5.2.+
    • Updated mockito to 2.21.+
    • Updated sonarqube plugin to 2.6.2
    • Updated launch4j to 2.4.4

    Shout out to @TheRamenChef for his contribution to this release.

    Source code(tar.gz)
    Source code(zip) MB) MB) MB)
  • v0.4.12-alpha(Jun 5, 2018)


    • Fixed an issue that caused the screenlocation of the ScreenManager not to be updated
    • Fixed an issue in the AStarGrid implementation.
    • Fixed an issue that causes AStarNode costs not to be reset after a path finding operation was executed.
    • Fixed a potential ArgumentNullException in the RenderComponent that could occur when switching to other applications
    • Fixed a bug with the RangeAttribute that caused the max modifier not to be applied to the max value.
    • Fixed an issue with SpeechBubbles not being removed from the active list anymore.
    • Fixed an issue that caused the IEntity bounding box not be updated when x/y or location were set.
    • Fixed an issue that caused interrupted Gamepad hotplug threads not to be stopped properly.
    • Fixed an issue with Emitters being rendered while not in the viewport
    • #116 Adjusted tileset loading to work on Unix/Linux computers
    • Fixed an issue with the Sound dataLine being opened while already opened
    • #123 Fixed an issue that caused wavy rendering when clamping to map

    Features / Improvements

    • Squeezed out a few more frames by improving the caching mechanisms for sprites.
    • Removed the parallel MapLayer rendering because it produced more overhead than it saved rendering time.
    • Affected entities of Abilities are now always sorted independent of whether multi-target is enabled.
    • Tiles now only evaluate their flipped state once when the constructor is called.
    • Slightly improved the performance of the RenderComponent.
    • Improved the performance of the UpdateLoop and RenderLoop
      • The UpdateLoop is no longer using a stream to iterate all updatables.
    • Added the possiblity to render the AstarGrid and the Path that is found by the algorithm.
    • Improved fallback path finding when the target AStarNode is not walkable
    • The AStarGrid.assignPenalty method is now protected to be able to overwrite it.
    • Extended the IMobileEntity implementation to calculate the velocity for the current tick.
    • Implemented TimeUtilities.nanoToMs method to convert nano seconds to ms.
    • Implemented Gamepad.onReleased event.
    • Make use of Gamepad default deadzones in the GamepadEntityController.
    • Extended the Environment with the possiblity to retrieve an IEntity of a particular type by its id/name .
    • Implemented the possibility to check whether a resource string is present.
    • Implemented the possibility to check whether a speechbubble is currently active for an entity.
    • Implemented methods on the RenderEngine that allow to scale an image via AffineTransform.
    • Extended the IAnimationController with the possibility to provide an AffineTransform.
    • Implemented the possibility to override MapObject loading functionality
      • Previously, a lot of logic was implemented internally within the MapObjectLoaders, so child implementations would have to re-implement some basic stuff on their own. With this change, every MapObjectLoader has a createXXX method that can be simply overwritten in case one just wants to adjust the created instance of provide a custom child implementation.
    • Implement the possibility to scale Props to the size of the IEntity.
    • Extended the ICombatEntity with a method that allows to check whether it was hit in a specified time span.
    • Add new Valign and Align values.
    • #74 Implemented the possibility to set the origin Align and Valign for Emitters.
    • Implemented the possibility to provide the CollisionType for raycasts.
    • Clean up Animation implementation to no longer use a Spritesheet that was being unloaded (either removed or updated).
      • Previously the Animation class would still have a reference to the old deprecated Spritesheet.
      • Spritesheets now have a isLoaded() flag that indicates whether they are (still) loaded in the current game instance.
    • Implemented a method that allows to check whether a specific image extension is supported by the engine. (ImageFormat.isSupported).
    • #75 Implemented the possibility to control whether particles fade.
      • Previously this was active for normal particles and it wasn't possible to disable the behavior. With this change, it is possible to define whether particles should fade out over the course of their TTL. This also works for sprite particles now.
    • Improved the Particle implementation by some collision related options.
      • With this change the particles can support continuousCollision if required. Note that this is very performance crucial and should be only used when absolutely necessary.
    • Extended SoundPlayback with method to check whether it is currently playing.
    • Improved performance for raycast collision checks.
    • #113 Implemented possibility to set a custom gain for a SoundPlayback.
    • The SoundEngine is now using the Input.getLoop() to update the sounds.
      • This was necessary to support adjusting sounds while the main GameLoop is paused.
    • Extended the IEnvironment with the possibility to search IEntiteis by multiple Tags.
    • Extended the IScreenManager with the possibility to get its center point.
    • Extended IMouse with method to set location by two double values.
    • Extended the Emitter implementation with the possiblity to specify a graphics quality that is required at minimum to render an Emitter.
    • #119 The OrthogonalMapRenderer is no longer rendering invisible MapLayers
    • Expose the setBackground(Color) method for the RenderComponent.
    • Custom MapObject properties are now serialized in alphabetical order.
    • The order of a Layer is now saved as custom property instead of an unsupported XML-attribute.
    • Implemented a Tag annotation that can be used to provide default tags for a custom IEntity implementation
    • Registering a MapObjectLoader no longer requires a type
      • The MapObjectType is already provided by the IMapObjectLoader.getMapObjectType method and therefore all MapObjectLoader implementations already have this information which makes it redundant to specify in separately when registering a new MapObjectLoader.
    • Implemented possibility to provide an AffineTransform for the CursorImage


    • Added a new namespace de.gurkenlabs.litiengine.pathfinding that contains all path finding implementations
      • Added a new sub-namespace for the AStar implementation de.gurkenlabs.litiengine.pathfinding.astar
      • Previously this was all located under de.gurkenlabs.litiengine.physics
    • Lowered the DEFAULT_MAX_DISTANCE for sounds to be heared from 250px to 150px.
    • An entity SoundPlayback now evaluates its position by the center of the entity.
    • Remove the ~~Sound.find~~ method and rename the ~~Sound.load~~ method to Sound.get for
      • For sounds, its not necessary to differentiate between the two because actually the load method just reused the find method as default and only loaded something if the sound wasn't already present.
    • Moved the Direction enum to the more general namespace de.gurkenlabs.litiengine.
    • Rename the Particle.getLocation method to Particle.getRenderLocation.
    • Setting the location on a GuiComponent now also updates its children
    • Pulled out all Font related attributes of the Appearance
      • Font information and Text alignment on a GuiComponent, for example, are strongly dependent on each other, making it necessary to have them in one place. Introduce a GuiProperty "defaultFont" to facilitate Font setup.

    Major overhaul on the AmbientLight and Shadow Rendering

    We now basically create an additional dynamically created tile layer and render the individual tiles. When a light/shadow is added/removed/moved or changed only the affected tiles are updated on the dynamic layer.

    Previously an image of the size of the entire map had to be redrawn which resulted in a major performance issue and made actually dynamic lighting almost impossible.

    The Game is now processing command line arguments when being initialized

    The Game.init(String...args) now optionally takes in command line arguments from the applications main method. There are two default command line arguments at the moment that are being processed:

    • -release : If set, this argument disables all debugging functionality. This is particularly useful for deployment
    • -nogui: If set, this argument will not spawn a JFrame. This can be usesful for e.g. a gameserver or unit tests

    Major refactoring on the whole event management

    With the previous implementation, it wasn't possible to remove listeners from the event handling because we only provided a lambda implementation. With this change, large parts of the engine were refactored to provide proper add/remove methods.

    Also, this changed reuses EventListener class as base class for all custom engine listeners. We've provided either adapter implementations or more fine granular listeners that only provide certain callbacks to allow the user of the API to decide what he actually wants to listen to.

    There are still some events in the engine that need to be refactored in the future.

    #118 Change MapObject position and size from int to float.

    Add a custom XmlAdapter that makes sure that the float values are serialized like integers (without decimal digits) when they are technically integers. This was necessary to keep the format consistent with the tiled map format.

    #125 Overhaul of the GameInfo

    This change takes care of the inconsistencies of the GameInfo class. It not only provided information about the game but also the defaultRenderScale and even some unused fields.

    We've also extended the GameInfo with more detailed information about the game (e.g. publisher or website) and additionally provided the possibility to add custom properties for even more project specific information.

    #129 Overhaul on the EntityController management

    Problem Previously, the whole management of controllers that are related to entities was really inconsistent. They were also managed globally, although an entity instance always had to be present in order to retrieve them. There were also some issues with the EntityControllerManager returning wildcard types whilst this essentially added no value. The basic interfaces for the controllers were all generic as well which required such an implementation.

    Goal Make the basic controller interfaces non-generic while keeping the syntactic sugar to have a generic implementation for the actual classes. With this change, the controllers are managed similar to a component-based system and can be directly used/set/retrieved from an IEntity.

    Also, this refactoring adds a method that allows to simply scale the sprite for an IEntity with a simple method on the IEntityAnimationController.

    #130 Refactoring on the Environment rendering pipeline

    Re-work the whole implementation of the Environment's rendering pipeline.

    It is now more straight forward and less confusing to understand:

    BACKGROUND-> GROUND-> SURFACE-> NORMAL -> (static shadows) -> OVERLAY-> (ambient light) -> UI

    We still keep the named RenderType enum because it makes it easier to understand compared to e.g. an alternative approach with just numbers. Also it transfers the original design idea for the rendering pipeline.

    IRenderable implementations can now be registered for any of the RenderType values.

    Internally, the Environment.render method does the following for every RenderType (besides RenderType.NONE):

    1. Render all Map Layers of that type
    2. Render all registered IRenderable implementations of that type
    3. Render all added IEntities of that type
    4. Call-back on the EnvironmentRenderListener.rendered listeners for that type
    5. If dbg_logDetailedRenderTimes = true: track the time it took to execute the rendering

    Regarding issue #128: It's now possible to render something behind GROUND layers using RenderType.BACKGROUND or the related call-back:

    Game.getEnvironment().addRenderListener(RenderType.BACKGROUND, (g, t) -> {
      // render something on the graphics object g


    • Fixed an issue with collision spinners not working properly
    • Added type prompt to the search box.
    • #102 Adjusted entity counter in Layer Toolbar when adding / deleting entities on a layer
    • #110 Adjusted map selection properly when (re)importing maps
    • Dragging entities no longer reloads them from the environment and instead just sets the location on the already present entity.
    • #112 Extended the editor with Drag&Drop support for resources
    • #99 The FileDialog is now reusedto keep the configuration for importing resources.


    • A ton of SonarQube fixes
    • Improved source code documentation
    • Added a CodeClimate badge
    Source code(tar.gz)
    Source code(zip) MB)
    utiliti-v0.4.12-alpha.exe(2.55 MB)
    utiliti-v0.4.12-alpha.jar(2.43 MB)
  • v0.4.11-alpha(Mar 13, 2018)


    • Fixed an issue with the movement delta not being calculated properly.
    • Fixed an issue with the SpeechBubble flickering.
    • Fixed an issue with the cache not firing the clear event.

    Features / Improvements

    • Provided a static method to evaluate the default sprite name for a custom Creature implementation.
    • Implemented a reflection based logic that allows registering custom Creature implementation without having to implement a custom MapObjectLoader.
    • It is now possible to provide multiple spritePrefixes for a class.
    • Provided a method that gets a random element from a collection.
    • Added missing getter for ground and overlay renderables.
    • Improve toString for Creature and Prop to display the spritePrefix/spritesheetName.
    • The PropMapObjectLoader now also supports to register custom prop implementations.
    • Implemented a mechanism that allows to annotate custom mapobject properties on a custom entity implementation.
      • It is possible to define multiple properties.
      • The property key must now be equal to the memberName.
    • Tilesets that are located in subfolders are now considered.
    • Implemented new methods that help to combine paths, respecting windows and linux path separators.
    • The Trigger implementation now exposes all the customProperties of its MapObject.
    • Implemented the possibility to load a simple list of string from a game resource file.
    • Extended the AnimationInfo annotation by allowing to specify custom death sprite names.
    • Extended the CreatureAnimationController to support custom death animations.
    • Implemented a functionality that flips all sprites of a Spritesheet vertically.
    • Added method that allows getting all map Layers, including overlays, from the OrthogonalMapRenderer.
    • Implemented a debug option that tracks details about the duration of the different rendering steps.


    • Breaking change: Change the file extension for game resource files from .env to .litidata (No automatic backward compatibility).
    • Renamed getEntitiesByType to getByType similar to the getByTag method.
    • Added missing Environment events for unloading and clear action.
    • The currently initializing Environment is now passed to the MapObjectLoaders.
    • Removed Decormob from the engine.
    • Extracted a ton of reflection logic to a separate ReflectionUtilities class.
    • The absolut path for MapImages of Tilesets are now set relative to the tileset
    • Removed rendering/rendered callbacks from the AnimationControllerbecause they caused major performance leaks and didn't work properly.
    • Renamed Entity.getDimensionCenter() to Entity.getCenter()`.
    • Replaced some unnecessary MessageFormats because they're not very fast.
    • Cached the graphicsConfig to improve performance.


    • Fixed snapping behavior when dragging multiple mapobjects.
    • Fixed issue that caused sprite files to be added multiple times upon import.
    • Fixed issue with the selection getting lost when pasting elements.
    • Fixed issue with the selection not being cleared properly.
    • #104 Fixed an issue that caused the map import not to work properly
      • #96 All mapobjects are now snapped in a way that they keep their distance to the other selected objects, i.e. relative to the top-most, left-most x and y coordinates.
    • #96 Implemented the possibility to move all selected map objects with the keyboard.
    • Implemented an import for non-embedded tilesets.
    • Gave selection outlines a pulsating look for better identification during multi-selection.
    • Gamefiles are no longer compressed by default.
    Source code(tar.gz)
    Source code(zip) MB)
    utiliti-v0.4.11-alpha.exe(2.51 MB)
  • v0.4.10-alpha(Feb 27, 2018)


    • Fixed a potential null reference exception in the Particle implementation.
    • Fixed an issue with the EntityAnimationController overwriting an animation from the CreatureAnimationController
      • Animation rules now dynamically evaluate the animation name instead of providing a static string.

    Features / Improvements

    • Improved performance of the AmbientLight implementation.
    • The MapComponent is now only reloading the mapobject while dragging, in case it has actually been moved.
    • #80 Implement the possibility to add and remove tags to map objects.
      • Rewrote the MapObjectLoaders to properly load the tags to the Entity
      • Extended IEnvironment with the possibility to get strongly typed entities by a tag.
    • Made CustomPropertyProvider implementation thread safe
    • Improved the performance of the GeometricUtilities.shapeIntersects test.
    • Added method to get x and y coordinates directly from the IEntity.
    • Extended IEntity with methods to directly set x and y coordinates.
    • Removed unnecessary crop out of lights from static shadows (it actually never worked that way).
    • Improved the performance of the UpdateLoop by using a concurrent HashSet instead of a CopyOnWriteArrayList.
    • Improved the Environment performance by using a set from a ConcurrentHashMap instead of a CopyOnWriteArrayList.
    • Extended the AnimationController to allow setting the default animation.
    • Add missing setters to ICollisionEntity and ICombatEntity.
    • Improve MapObjectLoaders to reuse a base implementation for setting collision properties.
    • Extended the IImageEffect interface with a priority that determines in which order effects get applied.
    • Refined the entity rendering process to take the actual sprite size into account -> image effects might resize the sprite.
    • Implemented the possibility to remove image effects from an AnimationController.
    • Improved the borderAlpha image effect implementation by actually only returning the border.
    • Provided a helper method in the ArrayUtilities that checks whether an array of Strings contains a specific argument.
    • Added a version to the GameFile XML


    • Entities are no longer adding themselves to the environment.
    • Removed deprecated IEnvironment.getTriggers method.
    • Relocated the StaticShadow class to the graphics namespace
    • Removed WeatherType from the engine.
    • Extracted the shadow area creation from the StaticShadowLaye to the StaticShadow class.
    • Renamed IMovableEntity to IMobileEntity
    • Replaced the IMobileCombatEntity interface by the Creature class
    • Added a creature collection to the IEnvironment and added a new MapObjectType.
    • Updated the CreatureAnimationController to not use the entity name as sprite prefix.
      • Major refactoring and clean up on the way, the CreatureAnimationController works: It is now possible to define a spritePrefix for a creature which will be used to determine the spritesheets for the animation controller.
      • Implemented the possibility to provide the sprite prefix for creatures as Annotation.
    • Removed the DecorMobAnimationController because it basically just did the same thing as the CreatureAnimationController.
    • Moved configuration and "core" stuff to the engine namespace.
    • Moved state machine implementation to the engine namespace.
    • Moved de.gurkenlabs.util namespace to de.gurkenlabs.litiengine.util
    • Changed the Game.DEBUG flag: For distribution, it is recommended to call Game.allowDebug(false) now, which will disable debugging functionality.


    • Fixed an issue that causes the UndoManager to not work properly with shortcuts.
    • Fixed a few issues that occurred when subsequently loading different game files.
    • Fixed issue with trigger targets/activators being displayed multiple times.
    • Fixed an issue that caused only the first selected sprite sheet to be imported
    • The MapComponent is now only reloading the mapobject while dragging, in case it has actually been moved.
    • Improved editor performance for dragging mapobjects and especially lights.
    • Unsaved maps are now visualized in the list.
    • #80 Implemented auto-completion for the tag input.
      • Added rendering for tags to the editor MapComponent.
      • Improved the new tag UI by hover and focus effects.
    • Improved emitter UI and added the possibility to add emitters from emitter assets.
    • Improved the performance of the PropPanel
    • #82 Wrapped moving of objects with the keyboard by BeginUpdate/EndUpdate
    • Improved the process of updating the maps list.
    • Majorly improved the loading performance for game files
    • Improved the performance of JCheckBoxList by reusing the GUI components.
    • Made the MapComponent reuse environment instances.
    • Added a cache for layer color indicator.
    • #85 Swapping game files now provides a save prompt
    • Added support for adding creatures in the editor
    • Made use of the LabelListCellRenderer for the DecorMobPanel.
    • Once again: improved the icons of the editor.
    • Added an icons class to unify access to icons.


    Source code(tar.gz)
    Source code(zip) MB)
    utiliti-v0.4.10-alpha.exe(2.51 MB)
  • v0.4.9-alpha(Feb 13, 2018)


    • Fixed issue with the SoundPlayback not being properly closed
    • Fixed the hover sound event of a GuiComponent to not be hooked up every time the component is prepared
    • The ScreenManager is now updating the size when the render component gets resized
    • The PropAnimationController now properly passes in the keyframe durations for a prop
    • Fixed a possible null reference exception in the TextParticle

    Features / Improvements

    • Implemented methods that allow getting strongly typed custom properties from ICustomPropertyProvider
      • Provide methods to directly get enum and color values from ICustomPropertyProvider
    • Extended and improved IEnvironment interface
      • Implemented an event for when an entity gets removed from the environment
      • Extended the IEnvironment with methods to easily access props.
      • Entities with RenderType.NONE are now also contained by the environment
      • Extended the environment with getters for emitters.
    • #47 Implemented support for external .tsx tilesets.
    • Provided a default toString for entities
    • Extended IMap to allow retrieving a map object by id.
    • Added a size() method to the ImageCache.
    • The SoundSource implementation is now using a cached thread pool to handle the sound playbacks instead of spawning a new thread for every single sound playback
    • Improved performance of MouseEvent handling: The ScreenManager now saves its location on screen because evaluating this every time is actually fairly resource consuming
    • Improved performance of rendering Particles: No need to create new Point2D instances
    • Extended the mouse to provide direct access to the current tile.
    • Implemented an ImageFormat enum and made the engine independent of .png
    • Extended the ImageCache with a clearAll method.
    • #45 Implemented the possibility to block lights with a collision box.
    • Extended the CustomPropertyProvider to allow specifying default values for retrieving string properties
    • #61 Implemented possibility to rotate and flip prop spritesheetName
    • #49 Replace GameLoop that was used for supporting controller hot-plug by a thread
    • #40 Implemented support to register message actions on an Entity
    • #43 Unified update loop implementations
    • #46 Extended Trigger implementation by an internal cooldown.
    • Introduced a new graphics option to control whether the frames should be reduced when the game window has lost focus
    • Extended the Resources implementation to support args for MessageFormat
    • Extracted static shadow logic from the environment
    • Improved the general process of creating and loading a game project
    • #44 Implemented callbacks for SoundPlayback
    • Implemented the possibility to cancel/pause and resume the SoundPlayback
    • Improved the disposing of the SoundEngine


    • Refactored the SoundSource implementation to implement Runnable itself instead of having the PlayRunnable implementation
    • The SpriteSheet file is no longer the default way to manage sprite resources
    • #33 Refactored MapArea and StaticShadow to inherit from Entity
    • Renamed MapObjectType.LANE to MapObjectType.PATH because this is a more general term for it
    • #55 Removed support for MapObjectType.CUSTOM and replace it by MapObjectType.AREA
    • Major overhaul on the resource management : It is no longer necessary to have a file; It is still possible though to import sprites from such a file. Spritesheets can now just be imported to the editor and will be serialized in the game file. The spritesheet files are no longer kept in the game file. You need to re-import the file in case, you've been using it
    • MapObjectLoaders now provide a collection of entities instead of just one IEntity object.
    • #54 Moved RenderEngine.getImage to Resources.getImage
    • #18 Removed unnecessary noise from configuration file
    • Cleaned up static shadow implementation
      • It is now possible to set the offset for a static shadow
      • It is now possible to set the color for static shadows on the map
    • Unified MapObjectProperty naming and clean up unused constants
    • Reused JAXB class contexts because they're performance crucial
    • Removed unused and meanwhile deprecated GameDirectories.
    • Removed the concept of IVision from the engine because the implementation is very specific for certain types of games (like rts/moba).
      • Replaced the logic on the RenderEngine by the possibility to provide a render clip for the rendering process
    • Cleaned up IRenderEngine interface
      • All methods that depend on the current camera (render the respective object relative to the viewport) are now provided directly on the IRenderEngine interface instead of being static methods on the RenderEngine class.This way, it is easier to determine which methods take the camera into account internally and which don't.


    • Updated the editor project to gradle
    • Added split panels to allow individual positioning of panels
      • All splitter positions are now saved in the configuration file
    • The editor now only synchronizes maps that were actually modified
    • Replaced System.out calls by logger calls
    • Implemented an entity tree
    • Implemented an entity search box that allows to search by id/name
    • Extended the editor by a console.
    • Extended the editor with a view that displays the assets of a project
    • Extended the editor with a dialog that allows to edit emitters
    • Extended the editor with a dialog to edit a SpriteSheet
    • Reorganized the namespaces of the utiliti editor.
    • Improved the editor by providing a parent component for all modal dialogs
    • Updated editor icons by new modern icons.
    • Added popup menu to the render canvas.
    • #65 Implemented general possibility to select multiple mapobjects
      • Allow multi-selection of MapObjects for positioning / deleting
      • Extended the UndoManager to support reverting/restoring operations with multiple MapObjects
      • Implemented possibility to move multiple objects via drag & drop
      • Implemented possibility to delete multiple objects
      • #70 Implement the possibility to copy/cut & paste multiple objects
    • Implemented the possibility to define and add Blueprints that consist of multiple MapObjects
    • Added marching ants for the focused MapObject
    • Improved usability of transform cursors and updated cursor images
    • Fixed an issue with the default rendering scale
    • Fixed performance for the tile grid (Drawing dashed lines just has a very poor performance in java)
    • Fixed an issue with mouse/keyboard controls being set up every time when the environment was loaded
    • Fixed an issue with the editor closing when using escape on the confirm dialog
    • Fixed an issue with the UndoManager not restoring deleted elements properly.
    • Fixed an issue with the enabled state of the paste command


    • #36 Added the utiLITI editor to the repository
    • #79 Migrated to JUnit 5.1.+
    • Updated steamworks version to 1.7.0
    • Provided a ton more unit tests (mostly for the environment)
    • Add the utiLITI editor to sonarqube
    Source code(tar.gz)
    Source code(zip) MB)
    utiliti-v0.4.9-alpha.exe(2.46 MB)
  • v0.4.8-alpha(Dec 10, 2017)


    • Fixed static initialization of GuiComponent ICON_FONT.
    • Fixed issue with the Gamepad producing nullreference exceptions.
    • Fixed possible ArgumentNullException if Gamepad support was disabled.
    • Fixed an issue that caused collision not to be checked if no entity was specified.
    • Fixed trigger to properly evaluate the activated entities
    • Fixed size for collisionboxes.
    • Fixed a possible nullreference exception when removing entities from the Environment.
    • Fixed an issue with the size not being set for spawnpoints.
    • Fixed a possible nullreference exception for CustomPropertyProvider.
    • Fixed issue with randomInRange not working for negative numbers for integers.
    • Fixed an issue with the Menu that caused elements to be added twice.
    • Fixed an issue with competing META-INF content
    • Fixed an issue with volume not being applied to looping music.
    • Fixed an issue that caused particles to flicker (BE DAMNED LITI!!!!!)
    • Fixed an issue with entities traveling a long distance in case of a lag.
    • Fixed an issue with enum values not being serialized properly in the configuration
    • Fixed an issue with a gamepad not being properly detected if it was already connected from the beginning.

    Features / Improvements

    • Improved the loading of a game file.
    • Reduced cognitive complexity of entity loading
    • Reduced cognitive complexity of the textfied keyboard typed handling.
    • Added equals overwrite for AttributeModifier class.
    • Provide some base unit tests for GuiComponents
    • Removed the isDragged method from the GuiComponent because it was never used and didn't work.
    • Extended the test sfor GuiComponents to ensure default flags.
    • Cleaned up the cognitive complexity of the AStarGrid.getNeighbours method.
    • Extended the ITileset implementation with a method that evaluates if a specified tile is part of the tileset.
    • Extended the environment by a method to retrieve colliders by id.
    • Issue #32 Implemented IMapObjectLoader interface and the default loader implementation for props, collisionboxes, triggers, decormobs, emitters and lightsources, spawnpoints
    • MapObjectLoaders are registered statically because they are designed to be independent from the environment.
    • Improved performance of the physics engine by only collecting all collisionboxes once per update
    • Extended ILayer with the getRenderType method which retrieves the rendertype from the custom properties of the layer.
    • Extended the Environment with an event that notifies consumers when an entity gets added to the Environment.
    • Implemented a general AnimationController that uses naming convention to provide Animations for a movable combat entity.
    • Issue #37 Replace deprecated XML tile layer serialization by data serialization that supports CSV and Base64 (including compression to GZIP/ZLIB).
    • Extended the MovableCombatEntityAnimationController to allow flipping left/right sprites to provide the opposite.
    • Extended ArrayUtilities with a method that gets a random element from a specified array.
    • Added a getter for the environmentBounds.
    • Added steamworks support to the engine
    • Implemented support for RenderType on particle level
    • Extended Props with the possibility to change the sprite during runtime.
    • If there are no static shadows to render, the static shadow image is no longer rendered.


    • Changed messagehandler provider to abstract because it is designed to be used as base implementation.
    • LightSource no longer keeps a reference to the static environment
    • Changed default updaterate to match the framerate.
    • There's no more static lib folder (see changes under Misc)
    • RenderLoop no longer catches and ignores all exceptions (they will be tracked by the UncaughtExceptionHandler)
    • Cleaned up the input loops to be started upon game start and not on game init.
    • Renamed the collider to CollisionBox for the sake of consistency.
    • Refactored the GameTime implementation: It is now part of the Game itself instead of the GameLoop.
    • The singleton instances of Game.getLoop is no longer passed in the update method
    • ImageCache no longer supports persistent cache. This was actually very unperformant.
    • Ambient light is now only rendered with graphics quality of Medium or more.


    • Updated build script to distinguish between usual dev build and full build that includes javadocs and jacoco test reports
    • Issue #35 Fixed litiengine dependencies on maven release
    • Update litiengine to use maven repository to get jinput and sound libraries.
    • Updated native jinput runtime dependencies to the latest version.
    • Issue #28 Create a distribution zip file with the gradle build.
    • Update gradle build by making use of the Gradle Natives Plugin in order to retrieve the native references required for jinput.
    • A lot of improvements on the general build script and process
    Source code(tar.gz)
    Source code(zip) MB)
    utiliti-v0.4.8-alpha.exe(2.28 MB)
  • v0.4.7-alpha(Oct 1, 2017)


    • A ton of code smells and maintainability issues were fixed in this release (LITIengine quality gate)
    • Fixed an issue with the SoundEngine causing a ArgumentNullException when music was stopped while no music was set
    • Fixed an issue with the focused entity of the camera requiring an individual handling when calculating its viewport location -> this was only a result of the the gameloop having a lower updaterate than the renderloop which causes flickering because the position of entities was not updated as often as it was rendered
    • Fix issue with looping sounds -> Sounds are now properly restarted after the initial playback if they need to be looped
    • Fixed an issue that was caused when setting entity locations without the game being initialized.
    • Fixed an issue with inactive Lights being considered when building the ambient light

    Features / Improvements

    • Adjusted the Mouse to also throw the mouse moved event when manually adjusting the mouse
    • Added overload to get custom keyframes by Spritesheet
    • Added restart method for an animation which just sets the frame to the start frame
    • The default AnimationController implementation is now using the memory cache when retrieving the current sprite
    • Extended the AnimationController by some overload constructors that allow to create an simple AnimationController for a spritesheet
    • Extended the string resource to support language files that are encoded in UTF-8
    • Added a flag to the game that allow to check whether the game has been started
    • Improved the ScreenManager by only applying the screen switch delay when the game has already been started (and therefore allow to define which screen to display first)
    • Extended the Camera with the possibility to clamp the camera to the boundaries of the map
    • Extended the Map to allow iterating all Mapobjects
    • Extended the SoundEngine to allow setting a callback for the listener location
    • Implemented the possibility to toggle Lightsources without the need for any additional programming: it is possible to just send a "toggle" message to any light and set the lights map-id in the target list of a trigger
    • Issue #9 Implemented propert support for resolutions
    • Implemented support for a animation based emitter
    • Extended the CollisionEntity interface to provide the center point of the entity's collision box
    • Extended the Emitter class to provide a finished event
    • Extended the IMovementController to provide a moved event
    • Implement the possibility to properly set and retrieve the active state of a Light
    • Introduced a new method that allows to get the mapobjects of a certain type from a MapObjectLayer
    • Issue #30 Extended the IKeyboard interface to allow registering for individual keyboard events
    • Issue #22 Implemented enabled property for GuiComponent
    • Issue #20 Implement support for horizontal and vertical alignment of image components
    • Issue #21 Implement support for image scaling for the ImageComponent


    • Improved the particle constructor by removing some parameters and changing the setters such that they return the particle instance to allow chaining the them
    • Introduce a new constant class GameDirectories that holds all the static game directories because they are not intended to be changed and were part of the GameInfo which was a bit weired
    • The Camera can now be directly accessed via Game.getCamera() instead of Game.getScreenManager().getCamera() because actually it is more convenient that way
    • Issue #29 Implement Appearance objects to collect all visual properties of GuiComponents ->With this change, it is also possible to globally set default properties for the appearance with the static GuiProperties class
    • Refactored the multiple redundant Valign and Align implementations


    Source code(tar.gz)
    Source code(zip) MB)
  • v0.4.6-alpha(Sep 9, 2017)


    • Issue #11 Ensure that font styles are set recursively to gui components and their childs.
    • Issue #15 Fix issue that caused props to flicker when first being rendered.
    • A lot of general bug fixes and improvements
    • Fix an issue with the collision entity not updating its collison box when height or width were adjusted seperately.
    • Fix issue with the KeyboardEntityController's strange behavior on different update rates.
    • Fixed around 400 style issues that were detected after first installing sonar qube

    Features / Improvements

    • Issue #5 Enhance the usage of custom keyframes from the
    • Issue #8 Support for Spawnpoints is now consistent
    • Issue #13 Improve map and gamefile serialization by removing elements that hold no information.
    • Issue #14 Improve the ScreenManager by reducing FPS when the main jframe gets iconified or lost the focus to save system resources.
    • Issue #16 Change the indentation of the output xml for GameFile and Map serialization.
    • Issue #19 Display debug bounding boxes for GUI components
    • OffensiveAbility is now part of the engine
    • Implement possiblitly to remove images from the cache by regex.
    • Implement the possibility to define props as obstacles which adds their collision boxes to the static collision boxes in the physics engine.
    • Extends the TriggerEvent to allow access to the actual Trigger.
    • Add missing getters for width and height for IMapObject
    • Extend the map with the possiblitly to retrieve the mapobjectlayer for a specified map object.
    • Added string localization support
    • Gamepads and KeyBoard now use the same update loop.


    • Issue #17 Improve the intercompatibility of the litiengine map xml output with the original mapeditor xml output. -> Adjusting some fields from double to int
    • AIController has been renamed to AIBehavior
    • Inventory system is no longer part of the engine
    • Reorganize util namespace
    • GameConfiguation interface has been changed from static fields to methods
    • Input interface has been changed from static fields to methods


    • Source code quality is now enforced by sonarqube
    • Started to add unit tests to the project
    Source code(tar.gz)
    Source code(zip) MB)
  • v0.4.5-alpha(May 28, 2017)


    • Issue #1 Fixed issue with emitters not restarting properly
    • Issue #4 Moving around lights in the editor caused Memory leak
    • Fixed issue that entities get sometimes stuck even when they cannot collide with each other
    • Fixed issue with ArrayOutOfBound Exception that periodically occured while rendering the map
    • Fixed bugs that caused caused games not to run properly from a jar file
    • Fixed issue with non available font "Arial" on Mac and Linux systems


    • Issue #6 Re-introduced cache for static tiles during map rendering process
    • Extended environment to allow retrieving entities by class type
    • Maps now properly support the name property
    • Implemented support to remove multiple entities at once from the environment
    • Added possibility to adjust OvalOutlineParticles' Stroke
    • Added support for additional buttons to control an an entity with the keyboard controller
    • Made gamepad support optional in order to prevent unnecessary threads and calls
    • Implemented the possibility to adjust the execution time of registered timed actions on the game loop


    • static shadows are no longer calculated through collision boxes. new MapObjectType "STATICSHADOW" is responsible for this
    • Changed the game version to be a string instead of a float value
    Source code(tar.gz)
    Source code(zip) MB)
  • v0.4-alpha(Apr 11, 2017)

    This release is the initial LITIengine release available to the public after the port to GitHub. Still a lot of implementation and documentation (!) to do.

    The environment builder tool utiLITI is currently not included but the engine itself is functioning and can already be used to make some games.

    Get information on how to get started with the engine HERE

    Source code(tar.gz)
    Source code(zip) MB)
Two Bavarian brothers, one goal: Create the purest, most comprehensible Java 2D game engine out there.
My Game Engine tested via my Cubecraft Game

My Game Engine tested via my Cubecraft Game Install: mvn -P {your OS name} clean install mvn -P mac clean install mvn -P linux clean install mvn -P wi

null 30 Oct 3, 2022
A simple puzzle game made with Unity to practice the game engine

A simple puzzle game made with Unity to practice the game engine.

Eyüb Salih Özdemir 1 Mar 30, 2022
The Lezard Client is a new, open-source, minecraft client for the newer versions of the game.

The Lezard Client is a new, open-source, minecraft client for the newer versions of the game. It is oriented not for PvP, but for the Vanilla and the Survival experience. It is not a hack client for Minecraft and do not ask for it. 1 I hate hacked client and 2 it is not fun for other people. Also, I misspelled the word lizard in English and decided to leave it like that.

Michel-Ange 4 Jul 5, 2022
A Java Game Engine created in Java with LWJGL!

?? Suffler Engine Suffler Game Engine is an engine created in java using OpenGL to Graphics. Currently being developed at Eclipse, and Visual Studio C

Suffler Engine 2 Jul 23, 2022
Java / JavaFX / Kotlin Game Library (Engine)

About JavaFX Game Development Framework Why FXGL? No installation or setup required "Out of the box": Java 8-15, Win/Mac/Linux/Android 8+/iOS 11.0+/We

Almas Baimagambetov 3k Jan 2, 2023
A Java Swing based game engine

faypixelengine A Java Swing based game engine What is it? A Java game engine that uses swing and can be used to develop interactive games. The idea fo

null 9 Aug 26, 2022
Orbital a java 2D game engine

Orbital Orbital is a under-development 2D game engine. Installation Orbital is avaliable on Jitpack. See below for the installation: Gradle allproject

null 22 Dec 12, 2022
Othello PvP (2-Player) Game Application created in Java using Swing and AWT, for playing the Othello game

Othello PvP (2-Player) Game Application created in Java using Swing and AWT, for playing the Othello game, a simple game that played on an 8 by 8 checkered board with 64 double-sided black and white discs. The game is easy to learn, but it takes time to master and develop winning strategies.

Soumyadeep Pal 1 Feb 28, 2022
BattleShip-Game - This repository contains the code of the BattleShip (Bataille Navale) game programmed in Java.

Bataille Navale Auteur : SABIL Mohamed Amine Comment générer la documentation ? Placez vous dans le sous-dossier src : pour générer la documentation d

Mohamed Amine SABIL 1 Jan 4, 2022
Snake-Game - A simple snake game written in java.

What's this? A simple snake game written in java. How to play Download the latest release. Ensure that a compatible java runtime is installed (optimal

Patrick260 4 Oct 31, 2022
The game is a 2D side scrolling system, where a player moves left, right, vertically or diagonally to traverse the game.

The game is a 2D side scrolling system, where a player moves left, right, vertically or diagonally to traverse the game.

Ravi Mandal 7 Sep 11, 2022
A basic representation of the 0-player game, "Game-of-Life", a simple example of basic cellular automata

Game-Of-Life-Basic A basic representation of the 0-player game, "Game-of-Life", a simple example of basic cellular automata. A cellular automaton is a

Nikhil Narayanan 5 Oct 27, 2022
A fast, customizable and compatible open source server for Minecraft: Java Edition

Glowstone A fast, customizable and compatible open source server for Minecraft: Java Edition. Introduction Glowstone is a lightweight, from scratch, o

Glowstone Project 1.7k Dec 31, 2022
Tribal Trouble GNU 2 Tribal Trouble - Tribal Trouble is a realtime strategy game released by Oddlabs in 2004. In 2014 the source was released under GPL2 license. License: GNU 2, .

Tribal Trouble Tribal Trouble is a realtime strategy game released by Oddlabs in 2004. In 2014 the source was released under GPL2 license, and can be

Sune Hagen Nielsen 147 Dec 8, 2022
Open source Minecraft client with Replay Mod and more.

Sol Client Simple and easy to use Minecraft client for 1.8.9 (and in future™, newer versions). Update: Yes, I know, it has been seven months since I w

Sol Client 166 Jan 5, 2023
A free mixin-based injection hacked-client for Minecraft using Minecraft Forge.

Custom LiquidBounce 1.8.9 build that aims to improve original visuals and bypasses, along with built-in ViaVersion to help you change from 1.8 to 1.17.1 without creating any other version branch.

epic group of paster 123 Jan 2, 2023
An free online poker HUD/tracker -> poker GTO solver automation tool

GTOHelper An online poker HUD/tracker (PokerTracker4) -> poker GTO solver (PioSolver) automation tool The initial purpose of the tool was to alleviate

null 10 Jan 3, 2023
A free mixin-based injection hacked client for Minecraft 1.8.9

LiquidCat is a free and open source mixin-based injection hacked client using Forge for Minecraft 1.8.9

null 27 Nov 18, 2022
A 2d Java physics engine, native java port of the C++ physics engines Box2D and LiquidFun

jbox2d Please see the project's BountySource page to vote on issues that matter to you. Commenting/voting on issues helps me prioritize the small amou

jbox2d 1k Dec 27, 2022