Releases: gurkenlabs/litiengine
"LDJAM 44" Release v0.4.17-alpha
This release comes with a ton of improvements for the utiLITI editor which have been implemented in preparation for LDJAM 44.
Fixes
- #249 Fixed an issue that caused the terminating callbacks to be executed after the system was already terminated
- 7ff4062 5e284be 83e7da3 Fixed rendering of
StaticShadows
- 4cba2a4 Fixed an issue with the
SpeechBubble
implementation
Features / Improvements
- 91a81fb 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 - 012b75d 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. - b1ca5de Implemented possibility to retrieve a layer by name and ID
- c7af38a Added methods for text and shape rendering with antialiasing
Changes
#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
- 4fe0e81 Rename
collisionboxHeightFactor
andcollisionboxWidthFactor
MapObjectProperties tocollisionboxHeight
andcollisionboxWidth
. This might require you to adjust maps created with previous versions of the engine. - 4fe0e81 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 theGameTime
class (useGame.time()...
)- 91a81fb
Game.loop().getDeltaTime(long tick)
has been moved and is nowGame.time().since(long tick)
- 91a81fb
Game.loop().execute(...)
has been renamed toGame.loop().perform(...)
to be consistent with theEntityAction
terminology - 91a81fb The input loop is no longer a
GameLoop
and instead "just" a plainUpdateLoop
. -> There should only be one GameLoop (that provides enhanced functionality likeTimedActions
)
- 91a81fb
- 4a37838 Renamed the
Map
class toTmxMap
to avoid collisions withjava.util.Map
- d2cb9ba Cleaned up "render entity with layer" feature
utiLITI
Fixes
- 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.
- 369056e Fixed issue that caused inconsistent move edit mode
- 4890d15 Fixed an issue that caused the transform controls not to be rendered properly upon undoing a move command.
- b673262 Fixed broken map snapshot functionality.
a7d981d 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
- 628c9f6 Add menu that allows moving entities to other layers.
- ac84517 Added an "edit" menu.
- 7818047 Added menu item to center the camera on the current focus
- 7818047 Added shortcuts to all "Add-Entity" commands. (CRTL-1 -CTRL-9)
- 4890d15 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
- 4890d15 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.
- 628c9f6 Added option to toggle rendering of entity names.
- b94433a Improved displaying of severe log messages
- 34582a8 Added possibility to focus the map center with the camera.
- 628c9f6 The entity's layer is now displayed in the UI
- 1d9dc34 Implemented "selectAll" and "deselect" commands
- 4266a76 Implemented possibility to revert all changes on a project
- f9370bc Update mapobject list when ids are reassigned
- ad265eb Implemented the possibility to set the
RenderType
of an entity
Misc
- The source code of the LITIengine is now citable for academic use via zenodo:
"Spring" Release v0.4.16.1-alpha
Fixes
- e5da360 Fixed an issue that caused only fields with the same name as the TMX property to be loaded
- 9137bdf Fixed text rendering realative to the environment
- #162 Fixed issues with the jaxb dependencies for Java versions >= 9
- 9e20b20 Fixed an issue with mouse events not being forwarded after the window was resized
Features / Improvements
- aea8877 Rendering the
GameMetrics
has been improved and additional information has been added. - 9dcd82c 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
- 9d2ab20 Implemented support for web resources
- #218 Implemented support for
SoundResources
- 8b48d72 The animation controller is now updated when the sprite changes
- fc6b586 Implemented support for rendering layers with their respective opacity
Changes
- 68aae15 Overhaul on the
Material
implementation - 5de3620 Internal overhaul of the
ScreenManager
- Extracted the
GameWindow
specific logic to the respective class (seeGame.window()
)
- Extracted the
- #171 Resources are now being accessed with URI-based filepaths
- 806309b Some improvements on class names
- Renamed the static class
ImageProcessing
toImaging
- Renamed the static class
SerializationHelper
toCodec
- Moved encoding/decoding of images to the Codec class
- Renamed the static class
- 17ca6fa Moved the
InputLoop
to the Game classInput.loop()
->Game.inputLoop()
- #215 113b28f Overhaul on the
GuiComponent
framework - #228 Adjusted the default resolution to be based on the computer's native resolution
- #232 Removed the
IEntityProvider
interface - a5e634b Replaced the
isObstacle
flag by the usage ofCollisionType
. - 2e033ea Removed various "adapter" classes in favor of default methods
- TMX Map Improvements
- #150 Implemented support for .tx format for blueprints (tmx templates).
- #150 74f45c1 Added support for additional MapObject properties
- #3 The order of image and tile layers will now be serialized in the original order
- #150 3cd351c Implemented support for
GroupLayers
- #232 Rewrite the map orientations
- #230 Handle missing version tag more gracefully
- SoundEngine API Overhaul
utiLITI
- Various usability and stability improvements
- #91 e80d4ae Implemented 'Movement' and 'Combat' panel for entities
- b9cce67 Allow rendering of
MapObjects
without type - #90 Animations are now being previewed in the
Spritesheet
dialog - #166 Enhanced the
UndoManager
- 4bec9b3 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
- 5d697f6 Fix potential NullReference when deleting all maps from the editor
- 20dbcc2 The
Entity
list is now sorted by mapIDs.
Misc
- Improved Javadoc and external documentation
- The max. supported TMX format is now
1.2.2.
- acbcd49 Removed the "Hello World" example projects from the repository
- Updated Gradle wrapper to
5.3.1
"Nukem"-Release v0.4.15-alpha
Fixes
- 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 viaGame.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 viaGame.world()
) - #196 Added a reference from the
Entity
to itsEnvironment
- Added the
Spawnpoint.spawn
method - Disabled
turnOnMove()
when applyingForces
- 72c9a2d 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
Changes
THIS 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.
- #191 Reworked the Resources API
- Replace the
ImageCache
- Simlify the API (less to type and everything regarding resources in one place)
- Replace the
- #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 theGame
class - The
AccelerationMovementController
has been removed and its functionality is now part of the basicMovementController
utiLITI
- Fixed and handled a few potential exception in the editor
Misc
- 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
"Bye Santa!" Release v0.4.14-alpha
Fixes
- 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
andIMap
- Added the
EntityDebugRenderedListener
that allows to simply attach custom debug rendering for entities - Added the
NavigationListener
that provides the functionality to access some events of theIEntityNavigator
- 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 thereforeTilesets
!) with margins and spacing between sprites - #150 Implement support for infinite
.tmx
maps - Various improvements to the
SoundPlayback
implementation
Changes
- #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 thejavax
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 theCombatAttributes
toIMobileEntity
- Move
hitPoints
from theCombatAttributes
toICombatEntity
- Removed non-general combat attributes like
- Rename
ArrayUtilities.getCommaSeparatedString
toArrayUtilities.join
and add overloads that allow specifying a custom separator.
utiLITI
- 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
Misc
- 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).
"LDJAM 42" Release v0.4.13-alpha
Fixes
- #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 exportIEntity
asIMapObject
- #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
.
- This can either be overwritten by custom implementations or one can register an
- Fixed a ton of typos
- Added a ton of unit tests
- Lots and lots of internal improvements
Changes
- 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
toGraphicsDevice.setFullscreenWindow
- Made
Game.terminate()
private -> The application should be closed from code usingSystem.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
de.gurkenlabs.litiengine.graphics.emitters
- Moved some entity implementations from different namespaces to
de.gurkenlabs.litiengine.entities
.
- Introduced new base namespace for all emitter related stuff
- The
FontLoader
class has been removed. Fonts are now loaded with the staticResources
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 AWTKeyListener
. - Remove a ton of unnecessary interfaces
- #155 Clean up the
RenderEngine
by removing static methods- Implemented static
ImageRenderer
- Implemented static
TextRenderer
- Implemented static
ShapeRenderer
- Implemented static
utiLITI
- #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
Misc
- 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.
The "Ramen" Release v0.4.12-alpha
Fixes
- 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 theRenderComponent
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 thePath
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 theGamepadEntityController
. - Extended the
Environment
with the possiblity to retrieve anIEntity
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 viaAffineTransform
. - Extended the
IAnimationController
with the possibility to provide anAffineTransform
. - 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.
- 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.
- Implement the possibility to scale
Props
to the size of theIEntity
. - Extended the
ICombatEntity
with a method that allows to check whether it was hit in a specified time span. - Add new
Valign
andAlign
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 aSpritesheet
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 aisLoaded()
flag that indicates whether they are (still) loaded in the current game instance.
- Previously the
- 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.
- Previously this was active for normal particles and it wasn't possible to disable the behavior.
- 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 theInput.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 searchIEntiteis
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 anEmitter
. - #119 The
OrthogonalMapRenderer
is no longer rendering invisibleMapLayers
- Expose the
setBackground(Color)
method for theRenderComponent
. - 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 customIEntity
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 theCursorImage
Changes
- 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
- Added a new sub-namespace for the AStar implementation
- 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
method and rename theSound.find
method toSound.load
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 namespacede.gurkenlabs.litiengine
. - Rename the
Particle.getLocation
method toParticle.getRenderLocation
. - Setting the location on a
GuiComponent
now also updates its children - Pulled out all
Font
related attributes of theAppearance
Font
information and Text alignment on aGuiComponent
, for example, are strongly dependent on each other, making it necessary to have them in one place.
Introduce aGuiProperty
"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 aJFrame
. 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 EntityCont...
"Working on the LEPUS" Release v0.4.11-alpha
Fixes
- 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 customMapObjectLoader
. - 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 itsMapObject
. - 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.
Changes
- Breaking change: Change the file extension for game resource files from
.env
to.litidata
(No automatic backward compatibility). - Renamed getEntitiesByType to
getByType
similar to thegetByTag
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
AnimationController
because 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.
utiLITI
- 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.
"Ready for the LEPUS" Release v0.4.10-alpha
Fixes
- Fixed a potential null reference exception in the Particle implementation.
- Fixed an issue with the
EntityAnimationController
overwriting an animation from theCreatureAnimationController
- 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 aCopyOnWriteArrayList
. - Improved the
Environment
performance by using a set from aConcurrentHashMap
instead of aCopyOnWriteArrayList
. - Extended the
AnimationController
to allow setting the default animation. - Add missing setters to
ICollisionEntity
andICombatEntity
. - 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
Changes
- 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 theStaticShadow
class. - Renamed IMovableEntity to IMobileEntity
- Replaced the IMobileCombatEntity interface by the Creature class
- Added a creature collection to the
IEnvironment
and added a newMapObjectType
. - 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.
- Major refactoring and clean up on the way, the
- Removed the
DecorMobAnimationController
because it basically just did the same thing as theCreatureAnimationController
. - 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.
utiLITI
- 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.
Misc
"Prepare for the LEPUS" Release v0.4.9-alpha
Fixes
- 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
- Provide methods to directly get enum and color values from
- 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 newPoint2D
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
Changes
- Refactored the
SoundSource
implementation to implement Runnable itself instead of having the PlayRunnable implementation - The sprites.info SpriteSheet file is no longer the default way to manage sprite resources
- #33 Refactored MapArea and StaticShadow to inherit from Entity
- Renamed
MapObjectType.LANE
toMapObjectType.PATH
because this is a more general term for it - #55 Removed support for
MapObjectType.CUSTOM
and replace it byMapObjectType.AREA
- Major overhaul on the resource management : It is no longer necessary to have a sprites.info 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 oneIEntity
object.- #54 Moved
RenderEngine.getImage
toResources.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
- Replaced the logic on the
- 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.
- All methods that depend on the current camera (render the respective object relative to the viewport) are now provided directly on the
utiLITI
- 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
- Allow multi-selection of
- Implemented the possibility to define and add
Blueprints
that consist of multipleMapObjects
- 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
Misc
Naughty Elves Release v0.4.8-alpha
Fixes
- 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.
Changes
- 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.
Misc
- 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