Assets 5

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 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

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 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 de.gurkenlabs.litiengine.graphics.emitters
    • 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

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.

@gurkenlabs gurkenlabs released this Jun 5, 2018 · 212 commits to master since this release

Assets 5

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 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

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
  • 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
 });

utiLITI

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

Misc

  • A ton of SonarQube fixes
  • Improved source code documentation
  • Added a CodeClimate badge

@gurkenlabs gurkenlabs released this Mar 13, 2018 · 406 commits to master since this release

Assets 4

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

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

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.

@gurkenlabs gurkenlabs released this Feb 27, 2018 · 482 commits to master since this release

Assets 4

Fixes

  • 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

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

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

@gurkenlabs gurkenlabs released this Feb 13, 2018 · 556 commits to master since this release

Assets 4

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

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

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

Misc

  • #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

@gurkenlabs gurkenlabs released this Dec 10, 2017 · 795 commits to master since this release

Assets 4

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

@gurkenlabs gurkenlabs released this Oct 1, 2017 · 960 commits to master since this release

Assets 3

Fixes

  • 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

Changes

  • 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

Misc

Assets 3

Fixes

  • 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 sprites.info.
  • 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.

Changes

  • 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

Misc

  • Source code quality is now enforced by sonarqube
  • Started to add unit tests to the project

@gurkenlabs gurkenlabs released this May 28, 2017 · 1120 commits to master since this release

Assets 3

Fixes

  • 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

Features

  • 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

Changes

  • 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

@gurkenlabs gurkenlabs released this Apr 11, 2017 · 1192 commits to master since this release

Assets 3

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