Changelog LITIengine v0.4.18-alpha


  • f3b0e52 Fixed a possible StackOverflowException in ImageFormat.isSupported(...)
  • 479e484 Fixed mapID assignment for Blueprints
  • 52f80e1 Fixed concurrency issues in TmxMap by using thread-safe containers for Tilesets and Layers
  • 9ac68d1 Removed redundant call to Creature.updateAnimationController()
  • 6bed9f1 Replaced RenderingHints.KEY_ANTIALIASING with RenderingHints.KEY_TEXT_ANTIALIASING in the TextRenderer
  • 5aa2313 Fixed Trigger to adopt changing activation conditions while relevant Entities are in the trigger area
  • #266 Fixed the way AnimationRules are added to EntityAnimationController
  • afc1997 c39d441 Fixed some graphics issues in the Camera and Environment
  • 4cfe6ed Fixed Concurrency issue in TileLayers.
  • #264 Fixed wrong tileset locations in exported maps.
  • fa573c9 Fixed possible NullPointerException when a Tileset‘s image was null
  • 217d41b Fixed UpdateLoop interruption behaviour
  • f152d52 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.
  • c53b036 Fixed potential null reference in DecimalFloatAdapter.
  • 4956e23 Fixed potential text outline bug when using certain RenderScales.
  • 65317ef Fixed entity debug rendering being cancelled when current animation frame is null.
  • 64b1de4 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.
  • 25f60bf Encoded spaces in file paths.
  • cfbe31d 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.
  • 1d4ad94 Fixed an issue when combining paths with whitespaces.

Features / Improvements

  • 8996fd4 Throw ResourceLoadExceptions when failing to load resources
  • 9bc1f2b Added renderWithLayer property to @EntityInfo
  • f93a191 Set default RenderType for TileLayer to GROUND
  • 6876143 Set default RenderType for all Layers to GROUND
  • de2c7a0 Added util method to extrude rectangles
  • eba3d49 Added getter EntityAnimationController.getAnimationRules()
  • 816715a Added method overload for EntityAnimationController.addAnimationRule(...)
  • #224 Added Appearance properties for borders
  • dc550f0 Added SpeechBubbleListener
  • 7674c6c Allow setting SpeechBubble text display time
  • 61dbc65 Allow hiding Speechbubble
  • e067ef1 63d4fb2 ca714b7 f6db03d 077b525 Minor overhaul of the Sound Engine
  • 98255f9 Allow an Entity to be removed by an EnvironmentEntityListener it triggers
  • c188504 Replaced some CopyOnWriteArrayList instances with the faster ConcurrentHashMap.newKeySet()
  • #265 Added ImageScaleMode.FIT to strech ImageComponent images with the correct aspect ratio
  • 5abf10a c5391ae Improved generic type handling in EntityAnimationController
  • 9c41b51 Overhauled version checking for TmxMaps
  • 102c48b Added Unit tests
  • a538528 #268 Implemented more performant Collections for keyboard listeners.
  • 3d41a91 Added method overload for ResourcesContainer.getAsync(...)
  • d8236a9 0d55b7a Switched to more specialized function interfaces in some places.
  • bcfc753 Made sure the miscVolume of a SoundPlayback is updated automatically.
  • 511d0b8 Instead of explicitly setting RenderingHints in the TextRenderer, toggle AntiAliasing with a boolean argument.
  • e2675a1 Removed some unnecessary wildcards in EntityAnimationController and AnimationRule.
  • 90737bb Added active flag to exclude IUpdateables from the update mechanism, where desired.
  • 9da3822 Set mouse Cursor to be visible by default.
  • e043ae5 Added multiple collision handling to PhysicsEngine.getIntersection(...)
  • b57df91 Improved logging on the entity action framework.
  • a26a993 Added attribute to CreatureAnimationState to remember its string representation. Cancelled MovementController.handleForces() if no forces are present.
  • bfa6d81 0fc383d 6f3f2dd 95bc61d Changed some SonarQube project settings.
  • c46632a Improved Resolution implementation.
  • d6c976f 7278da5 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.
  • d452fda Enabled null values in CustomProperties declared as enum.
  • 16f0929 Simplified and improved entity debug rendering.
  • eb6924b Added some additional API to allow map generation from code.
  • 24df305 Added util method to get a random point within a circle.
  • 477eddf Added overload to MapUtilities.getTile(...) with map argument.
  • 10a233f Removed redundant call of ByteArrayOutputStream.flush()
  • c0c001e Added util method to replace colors in an image according to a Map with source and target colors.
  • f62e23c Made sure the GamepadManager updates the gamepads once it is initialized.
  • 3128eb0 f124186 Enabled clearing registered event consumers from Input API.
  • 63c9b8d Added reflection util method to retrieve values of static fields.
  • 47c4ddc Added Gamepad.isPressed(...) to check if a button is pressed on a gamepad.
  • c67bf33 Enhanced Gamepad.toString().
  • 8e5ed73 Enabled gamepad polling via component name instead of JInput specific identifier.
  • 4e5a108 Added possibility to parse a given resource file into a string.
  • c4b40a9 Added mouse pressing event.
  • 44a765d 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
  • 564ea96 Stored a string attribute as lower cased so that it doesn’t always have to be converted.
  • ac0b11b Made XML format more compatible to the TMX tiled format.
  • 949be86 14175b6 Added overload method to set mouse cursor location with Align and Valign parameters instead of absolute offset values. Set default pivot to TOP LEFT
  • f12df41 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.
  • 406adc5 Slightly improved CombatEntity events.
  • 504ccd4 Added append and distinct util methods to ArrayUtilities.
  • d14fa49 Added collision event to CollisionEntity
  • 6310fd2 Improved logging for unsupported tmx version.
  • 5a13edd Improved exceptions when an XML file is not found.
  • 2cab4c6 Reset the logmanager before config to avoid redundant logs.
  • cbd947e Improved access modifiers on some internals.
  • 368ec92 Improved AbilityOrigin enum.
  • 75d16bb Added custom effect target evaluation.


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

  • ff59b0a Changed EntityAnimationController.AnimationRule visibility to public

  • 4252de5 Changed constructor visibility for MapObjectLoader implementations to public

  • 41b6047 Removed type parameters for

  • 14c712b Replaced Oracle JDK with OpenJDK.

  • #279 Separated mouse Cursor implementation from the RenderComponent.

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


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



  • a4ebf58 Don’t limit cursor rendering to when the window is focused.

  • 887d635 Attached camera to RenderLoop instead of GameLoop.

  • 7490c53 Removed sample emitter implementations from the engine.

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

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

  • bdbde7d Added Blueprints to game resources.

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

  • 2d340b7 Streamlined GamepadManager API.

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


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

  • c0c9322 Don’t evaluate collision if a particle should not be moved.

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

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

  • d14fa49 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.

  • cd75d15 Streamlined Trigger interactions.

  • a612d69 4d23378 Unified hit events for CombatEntities.

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

  • 02e7471 Removed empty child implementations of PolyShape.

  • 816d7ad 1894c98 Streamlined Attribute implementation.


  • #258 Fixed MapObjectLayers being deselected when copy-pasting entities
  • 3433362 Improved MapObject ID rendering
  • #261 Correctly refresh UI after deleting entities.
  • 15f2347 Separated Entity snapping from clamping to map. Renamed snapping presets.
  • 02d6b02 96223f9 5ad81e1 1e9d84b Added dedicated zooming handler.
  • 50d511e 7f75cfd Extracted Entity transforming logic. Separated rendering tasks into dedicated classes.
  • 940190b Added Unit test routine to Gradle script.
  • 5e4bb3f 8612f69 Added general UI scaling. Added ConfirmDialog wrapper.
  • d4cf6df Moved UserPreferences to the Editor class
  • 63ff169 Added some localizable strings.
  • c4d2115 Fixed a Font scaling issue. Minor fixes and improvements.
  • c061d8e Fixed issue that sometimes caused the map list to be blank.
  • edd0bfe Removed redundant focus update.
  • 25ef97a Declared some overrides correctly.
  • 7c9117e Fixed clamping when moving multiple selected MapObjects.
  • 2724acb 1f34a90 Improved resize operation.
  • #277 Made snapping grid size configurable by user.
  • 14fec87 Removed redundant reload from map when transforming Entities.
  • #262 Fixed the map selection being discarded when changing map properties.
  • 50b3978 Fixed positional transformation using keyboard.
  • 777ba8a Added private constructors for static handlers.
  • 213c1e5 Fixed issue that prevented new maps from being imported.
  • fc0d1bf Fixed potential null reference when no map was loaded.
  • 879cde1 Improved behaviour when trying to load non-existing projects.
  • f15177b Added Ambient Light and static shadow preview to MapPropertyPanel and enhanced the panel’s layout.
  • #292 Enabled Map property manipulation in the MapPropertyPanel
  • 64ec7b7 392bcc5
    • 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
  • 5309c6f 5964444
    • 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.
  • 04223a4 Changed the AssetPanel layout type from a GridLayout to a dynamic WrapLayout.
  • b7d464e Display the default value for CombatEntity hitpoints in the editor.
  • 3e22f1c Improved control flow via keyboard.
  • 2089445 Replaced usages of deprecated Event class.
  • d95c73a Fixed issue with save state of a map not being tracked.


  • 1e7030b Updated code of conduct link in
  • a9706fd Moved “Games made with LITIengine” showcase to docs pages.
  • 7477318 Added FUNDING.yml
  • 448b630 Whoop whoop.

Code Style


Contributors in this release


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