LITIENGINE 🕹 The pure 2D java game engine.
ArgumentNullException
that could be thrown if an entity hit event was not related to an Ability
.XmlUtilities.read
not work for files within a jar.TmxMap
ConfigurationGroups
MapRenderer
onMoved
event for IMobileEntity
spawned
event for Spawnpoint
GameMetrics
Game.loop().getUpdateRate()
method in favor of Game.loop().getTickRate()
.SoundEngine
de.gurkenlabs.litiengine.annotation
package.Environment
to be immutableScreenManager
eventsMouse
eventsKeyboard
eventsGamepad
and GamepadManager
eventsCamera
eventsEmitter
eventsAbility
eventsFunctionalInterface
2.7
-> 2.8
5.3.1
-> 6.0.1
@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.
ArgumentNullException
that could be thrown if an entity hit event was not related to an Ability
.XmlUtilities.read
not work for files within a jar.TmxMap
ConfigurationGroups
MapRenderer
onMoved
event for IMobileEntity
spawned
event for Spawnpoint
GameMetrics
Game.loop().getUpdateRate()
method in favor of Game.loop().getTickRate()
.SoundEngine
de.gurkenlabs.litiengine.annotation
package.Environment
to be immutableScreenManager
eventsMouse
eventsKeyboard
eventsGamepad
and GamepadManager
eventsCamera
eventsEmitter
eventsAbility
eventsFunctionalInterface
2.7
-> 2.8
5.3.1
-> 6.0.1
@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.
StackOverflowException
in ImageFormat.isSupported(...)
Blueprints
TmxMap
by using thread-safe containers for Tilesets
and Layers
Creature.updateAnimationController()
RenderingHints.KEY_ANTIALIASING
with RenderingHints.KEY_TEXT_ANTIALIASING
in the TextRenderer
Trigger
to adopt changing activation conditions while relevant Entities
are in the trigger areaAnimationRule
s are added to EntityAnimationController
Camera
and Environment
TileLayer
s.NullPointerException
when a Tileset
's image was null
UpdateLoop
interruption behaviourEntities
cannot have negative width or height.Spritesheet.setSpriteHeight(...)
CustomProperty
value is undefined.DecimalFloatAdapter
.ResourceLoadExceptions
when failing to load resources@EntityInfo
RenderType
for TileLayer
to GROUND
RenderType
for all Layers to GROUND
EntityAnimationController.getAnimationRules()
EntityAnimationController.addAnimationRule(...)
Appearance
properties for bordersSpeechBubbleListener
SpeechBubble
text display timeSpeechbubble
Entity
to be removed by an EnvironmentEntityListener
it triggersCopyOnWriteArrayList
instances with the faster ConcurrentHashMap.newKeySet()
ImageScaleMode.FIT
to strech ImageComponent
images with the correct aspect ratioEntityAnimationController
TmxMap
sResourcesContainer.getAsync(...)
miscVolume
of a SoundPlayback
is updated automatically.RenderingHints
in the TextRenderer
, toggle AntiAliasing with a boolean argument.EntityAnimationController
and AnimationRule
.IUpdateable
s from the update mechanism, where desired.Cursor
to be visible by default.PhysicsEngine.getIntersection(...)
CreatureAnimationState
to remember its string representation. Cancelled MovementController.handleForces()
if no forces are present.Resolution
implementation.CollectionUtilities
and ArrayUtilities
for random access. Switched to ThreadLocalRandom
instead of individual Random objects. Added method overloads to pass random instance as argument.CustomProperties
declared as enum.MapUtilities.getTile(...)
with map argument.ByteArrayOutputStream.flush()
GamepadManager
updates the gamepads once it is initialized.Gamepad.isPressed(...)
to check if a button is pressed on a gamepad.Gamepad.toString()
.Ability
properties.Align
and Valign
parameters instead of absolute offset values. Set default pivot to TOP LEFT
IMap
and Resource
names ([map1, map2, map10] instead of [map1, map10, map2]).CreatureAnimationController
only display the death animation as the last fallback if no other animation is present.CombatEntity
events.append
and distinct
util methods to ArrayUtilities
.CollisionEntity
AbilityOrigin
enum.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 XmlUtilities.save(...)
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().getRenderComponent().setCursorOffsetX(0);
Game.window().getRenderComponent().setCursorOffsetY(0);
AFTER:
Game.window().cursor().set(Cursors.ADD, 0, 0);
Game.window().cursor().setOffsetX(0);
Game.window().cursor().setOffsetY(0);
14c26df15351832706d0bca3c0f22c16a14d5388 Streamlined Animation
API.
BEFORE:
entity.getAnimationController().getCurrentSprite();
entity.getAnimationController().getCurrentAnimation();
entity.getAnimationController().getAnimations();
AFTER:
entity.animations().getCurrentSprite();
entity.animations().getCurrent();
entity.animations().getAll();
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 Blueprint
s to game resources.
#285 Enabled TileData
serialization.
Before that, TileData
could only be deserialized.
2d340b7e23846e39c2a85abe9cde01e5dc7273ec Streamlined GamepadManager
API.
BEFORE:
Input.getGamepad();
Input.getGamepad(gamePadIndex);
Input.gamepadManager().onGamepadAdded(pad -> {});
AFTER:
Input.gamepads().current();
Input.gamepads().get(gamePadIndex);
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.
MapObjectLayer
s being deselected when copy-pasting entitiesMapObject
ID renderingEntity
snapping from clamping to map. Renamed snapping presets.Entity
transforming logic. Separated rendering tasks into dedicated classes.ConfirmDialog
wrapper.UserPreferences
to the Editor
classMapObjects
.Entities
.MapPropertyPanel
and enhanced the panel's layout.MapPropertyPanel
Map
objects instead of just name strings in the MapList
.MapList
losing its selection when changing map properties.MapListCellRenderer
for further customizability of the MapList.MapList
when just saving the game file.AssetPanel
layout type from a GridLayout
to a dynamic WrapLayout
.CombatEntity
hitpoints in the editor.Event
class.@CalvinMT @TheRamenChef
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. 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
StackOverflowException
in ImageFormat.isSupported(...)
Blueprints
TmxMap
by using thread-safe containers for Tilesets
and Layers
Creature.updateAnimationController()
RenderingHints.KEY_ANTIALIASING
with RenderingHints.KEY_TEXT_ANTIALIASING
in the TextRenderer
Trigger
to adopt changing activation conditions while relevant Entities
are in the trigger areaAnimationRule
s are added to EntityAnimationController
Camera
and Environment
TileLayer
s.NullPointerException
when a Tileset
's image was null
UpdateLoop
interruption behaviourEntities
cannot have negative width or height.Spritesheet.setSpriteHeight(...)
CustomProperty
value is undefined.DecimalFloatAdapter
.ResourceLoadExceptions
when failing to load resources@EntityInfo
RenderType
for TileLayer
to GROUND
RenderType
for all Layers to GROUND
EntityAnimationController.getAnimationRules()
EntityAnimationController.addAnimationRule(...)
Appearance
properties for bordersSpeechBubbleListener
SpeechBubble
text display timeSpeechbubble
Entity
to be removed by an EnvironmentEntityListener
it triggersCopyOnWriteArrayList
instances with the faster ConcurrentHashMap.newKeySet()
ImageScaleMode.FIT
to strech ImageComponent
images with the correct aspect ratioEntityAnimationController
TmxMap
sResourcesContainer.getAsync(...)
miscVolume
of a SoundPlayback
is updated automatically.RenderingHints
in the TextRenderer
, toggle AntiAliasing with a boolean argument.EntityAnimationController
and AnimationRule
.IUpdateable
s from the update mechanism, where desired.Cursor
to be visible by default.PhysicsEngine.getIntersection(...)
CreatureAnimationState
to remember its string representation. Cancelled MovementController.handleForces()
if no forces are present.Resolution
implementation.CollectionUtilities
and ArrayUtilities
for random access. Switched to ThreadLocalRandom
instead of individual Random objects. Added method overloads to pass random instance as argument.CustomProperties
declared as enum.MapUtilities.getTile(...)
with map argument.ByteArrayOutputStream.flush()
GamepadManager
updates the gamepads once it is initialized.Gamepad.isPressed(...)
to check if a button is pressed on a gamepad.Gamepad.toString()
.Ability
properties.Align
and Valign
parameters instead of absolute offset values. Set default pivot to TOP LEFT
IMap
and Resource
names ([map1, map2, map10] instead of [map1, map10, map2]).CreatureAnimationController
only display the death animation as the last fallback if no other animation is present.CombatEntity
events.append
and distinct
util methods to ArrayUtilities
.CollisionEntity
AbilityOrigin
enum.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 XmlUtilities.save(...)
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().getRenderComponent().setCursorOffsetX(0);
Game.window().getRenderComponent().setCursorOffsetY(0);
AFTER:
Game.window().cursor().set(Cursors.ADD, 0, 0);
Game.window().cursor().setOffsetX(0);
Game.window().cursor().setOffsetY(0);
14c26df15351832706d0bca3c0f22c16a14d5388 Streamlined Animation
API.
BEFORE:
entity.getAnimationController().getCurrentSprite();
entity.getAnimationController().getCurrentAnimation();
entity.getAnimationController().getAnimations();
AFTER:
entity.animations().getCurrentSprite();
entity.animations().getCurrent();
entity.animations().getAll();
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 Blueprint
s to game resources.
#285 Enabled TileData
serialization.
Before that, TileData
could only be deserialized.
2d340b7e23846e39c2a85abe9cde01e5dc7273ec Streamlined GamepadManager
API.
BEFORE:
Input.getGamepad();
Input.getGamepad(gamePadIndex);
Input.gamepadManager().onGamepadAdded(pad -> {});
AFTER:
Input.gamepads().current();
Input.gamepads().get(gamePadIndex);
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.
MapObjectLayer
s being deselected when copy-pasting entitiesMapObject
ID renderingEntity
snapping from clamping to map. Renamed snapping presets.Entity
transforming logic. Separated rendering tasks into dedicated classes.ConfirmDialog
wrapper.UserPreferences
to the Editor
classMapObjects
.Entities
.MapPropertyPanel
and enhanced the panel's layout.MapPropertyPanel
Map
objects instead of just name strings in the MapList
.MapList
losing its selection when changing map properties.MapListCellRenderer
for further customizability of the MapList.MapList
when just saving the game file.AssetPanel
layout type from a GridLayout
to a dynamic WrapLayout
.CombatEntity
hitpoints in the editor.Event
class.@CalvinMT @TheRamenChef
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. 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
This release comes with a ton of improvements for the utiLITI editor which have been implemented in preparation for LDJAM 44.
StaticShadows
SpeechBubble
implementationThread.sleep
uses long instead of double values.tmx
format.collisionboxHeightFactor
and collisionboxWidthFactor
MapObjectProperties to collisionboxHeight
and collisionboxWidth
. This might require you to adjust maps created with previous versions of the engine.
GameLoop
class to the GameTime
class (use Game.time()...
)
Game.loop().getDeltaTime(long tick)
has been moved and is now Game.time().since(long tick)
Game.loop().execute(...)
has been renamed to Game.loop().perform(...)
to be consistent with the EntityAction
terminologyGameLoop
and instead "just" a plain UpdateLoop
. -> There should only be one GameLoop (that provides enhanced functionality like TimedActions
)Map
class to TmxMap
to avoid collisions with java.util.Map
RenderType
of an entityThis release comes with a ton of improvements for the utiLITI editor which have been implemented in preparation for LDJAM 44.
StaticShadows
SpeechBubble
implementationThread.sleep
uses long instead of double values.tmx
format.collisionboxHeightFactor
and collisionboxWidthFactor
MapObjectProperties to collisionboxHeight
and collisionboxWidth
. This might require you to adjust maps created with previous versions of the engine.
GameLoop
class to the GameTime
class (use Game.time()...
)
Game.loop().getDeltaTime(long tick)
has been moved and is now Game.time().since(long tick)
Game.loop().execute(...)
has been renamed to Game.loop().perform(...)
to be consistent with the EntityAction
terminologyGameLoop
and instead "just" a plain UpdateLoop
. -> There should only be one GameLoop (that provides enhanced functionality like TimedActions
)Map
class to TmxMap
to avoid collisions with java.util.Map
RenderType
of an entityGameMetrics
has been improved and additional information has been added.TextureAtlas
created with the TexturePacker toolSoundResources
Material
implementationScreenManager
GameWindow
specific logic to the respective class (see Game.window()
)ImageProcessing
to Imaging
SerializationHelper
to Codec
InputLoop
to the Game class Input.loop()
-> Game.inputLoop()
GuiComponent
frameworkIEntityProvider
interfaceisObstacle
flag by the usage of CollisionType
.GroupLayers
SoundPlayback
implementationMapObjects
without typeSpritesheet
dialogUndoManager
Creatures
Entity
list is now sorted by mapIDs.1.2.2.
5.3.1
GameMetrics
has been improved and additional information has been added.TextureAtlas
created with the TexturePacker toolSoundResources
Material
implementationScreenManager
GameWindow
specific logic to the respective class (see Game.window()
)ImageProcessing
to Imaging
SerializationHelper
to Codec
InputLoop
to the Game class Input.loop()
-> Game.inputLoop()
GuiComponent
frameworkIEntityProvider
interfaceisObstacle
flag by the usage of CollisionType
.GroupLayers
SoundPlayback
implementationMapObjects
without typeSpritesheet
dialogUndoManager
Creatures
Entity
list is now sorted by mapIDs.1.2.2.
5.3.1
Trigger's
internal logicImageComponent
GameWindow
that is used to access window specific functionality via Game.window()
GameLoop
SoundPlayback
GameWorld
implementation (accessed via Game.world()
)Entity
to its Environment
Spawnpoint.spawn
methodturnOnMove()
when applying Forces
PlatformingMovementController
Game.config().client().exitOnError()
PhysicsEngine
with additional method overloadsTHIS RELEASE CONTAINS A LOT OF CHANGES TO CORE APIS OF THE ENGINE. THESE CHANGES MOSTLY DON'T AFFECT THE FUNCTIONALITY AND ARE MAINLY CAUSED DUE TO RESTRUCTURING OF THE ENGINE. PLEASE SEE THE ATTACHED PULL REQUESTS FOR DETAILLED INFORMATION ON HOW TO MIGRATE YOUR EXISTING GAME TO THE NEW VERSION OF THE ENGINE.
ImageCache
GameWorld
API and moved some methods that were previously on the Game
class
AccelerationMovementController
has been removed and its functionality is now part of the basic MovementController
Trigger's
internal logicImageComponent
GameWindow
that is used to access window specific functionality via Game.window()
GameLoop
SoundPlayback
GameWorld
implementation (accessed via Game.world()
)Entity
to its Environment
Spawnpoint.spawn
methodturnOnMove()
when applying Forces
PlatformingMovementController
Game.config().client().exitOnError()
PhysicsEngine
with additional method overloadsTHIS RELEASE CONTAINS A LOT OF CHANGES TO CORE APIS OF THE ENGINE. THESE CHANGES MOSTLY DON'T AFFECT THE FUNCTIONALITY AND ARE MAINLY CAUSED DUE TO RESTRUCTURING OF THE ENGINE. PLEASE SEE THE ATTACHED PULL REQUESTS FOR DETAILLED INFORMATION ON HOW TO MIGRATE YOUR EXISTING GAME TO THE NEW VERSION OF THE ENGINE.
ImageCache
GameWorld
API and moved some methods that were previously on the Game
class
AccelerationMovementController
has been removed and its functionality is now part of the basic MovementController