libGDX 1.9.5 released

libGDX 1.9.5

Christmas is almost here. Have a libGDX release. Here’s what’s new (plus a ton of bug fixes, see the commit logs on GitHub).

[1.9.5]
- Upgraded to MobiDevelop's RoboVM fork version 2.3.0, update your 
- Upgraded to GWT 2.8.0 for faster compiles and better compile output
- Fix NPE swallowing "video driver unsupported" error on LWJGL 2 backend.
- Allow window icons to be set in Lwjgl3ApplicationConfiguration or Lwjgl3WindowConfiguration.
- Allow window icon and title to be changed in Lwjgl3Window
- API Addition: ApplicationLogger interface, allowing easier access to custom logging
- DefaultRenderableSorter accounts for center of Renderable mesh, see https://github.com/libgdx/libgdx/pull/4319
- Bullet: added FilterableVehicleRaycaster, see https://github.com/libgdx/libgdx/pull/4361
- Bullet: updated to 2.85, see: http://bulletphysics.org/wordpress/?p=456
- Updated iOS native build scripts to iOS 10.1 and TVOS 10.0
- API Addition: BitmapFont#blankLineScale.
- Fixed rounding of Drawables in ProgressBar. Allow rounding to be disabled with setRound().
- Updated LWJGL3 backend to LWJGL 3.1.0, see https://blog.lwjgl.org/lwjgl-3-1-0-released/
- LWJGL3 backend now supports non-continuous rendering, see https://github.com/libgdx/libgdx/pull/3772
- API Change: Lwjgl3WindowListener.refreshRequested() is called when the windowing system (GLFW) reports contents of a window are dirty and need to be redrawn.
- API Change: Lwjgl3WindowListener.maximized() is called when a window enters or exits a maximized state.
- API Change: Lwjgl3WindowListener.deiconified() removed, combined with .iconified().
- API Change: Lwjgl3Window.deiconify() renamed to .restore() since it can also be used to de-maximize a window.
- Lwjgl3Window now has a maximize() method, and windows can be started maximized using the window or app configuration's setMaximized() method.
- NinePatch can now be drawn rotated or scaled.
- NinepatchDrawable is now a TransformDrawable.
- API Change: Group add* methods no longer remove and re-add the actor if it is already in the group, instead they do nothing.
- API Change: g2d.Animation is now generic so it can support Drawables, PolygonRegions, NinePatches, etc. To fix existing code, specify the TextureRegion type in animation declarations (and instantiations in Java 6), i.e. Animation myAnimation = new Animation(...);
- TiledDrawable throws unsupported operation if trying to draw rotated/scaled. #4005
- API Change: DragAndDrop now puts default position of drag actor at pointer location. The original default offset from the pointer was (14, -20).
- Added ShaderProgramLoader for AssetManager.
- BoundingBox#isValid now returns also true when min==max, see: https://github.com/libgdx/libgdx/pull/4460

Please update your projects as usual.

If you use MobiDevelop’s RoboVM fork make sure to update your Eclipse/IntelliJ IDEA/Android Studio plugin to version 2.3.0.

If you use the GWT plugin in Eclipse and don’t run your GWT project via Gradle, make sure you update your GWT plugin to version 2.8.0.

Happy coding,
The libGDX team

Source code for Quantum, an RTS with massive unit counts


Download Quantum

Many moons ago (7 years ago), i wrote a little RTS inspired by Dyson/Eufloria. I actually contacted the Eufloria guys before doing so and offered them to write a multiplayer mode for them. They politely declined and allowed me to write a clone with MP support. So that’s what i did.

After 2 months of work, Quantum was complete. We played it a lot at work. It got around 20k downloads from around the web after making my rounds on a few websites (TIG, JGO, etc.). Eventually, interest faded away and i forgot about it.

Fast forward to today. I was thinking about writing an RTS again. I remembered Quantum and started searching for traces of it on the web. I found a video and shortly after that a fork of the original source.

I forked the fork and started reviving it. A few hours later, it’s ready for you to shame my code from 7 years ago 😀 Here are features that might interest you:

  • Multiplayer via a latency-adaptive lock-step simulation, with thousands of units, inspired by the old 1500 Archers article
  • Scripting via BeanShell, a very old but super lightweight scripting language for the JVM. Here’s the complete AI.
  • A map editor

You should NOT take the code structure as a big inspiration! Code style, architecture and especially the graphics part (mixing fixed function and programmable pipeline) are NOT good. However, there’s a lack of fully open-source games out there that are more than a simple 2D plattformer, so i thought i’d share.

If someone opens a server, let me know 🙂

Font metrics changes

For bitmap fonts, padding can be added when the bitmap font is created to give more space around the glyphs for effects like a glow or drop shadow. BitmapFont has so far ignored padding, as reported in #3074. This means the font metrics change depending on the padding used, which makes it difficult to draw text where you want it. This PR has now been fixed, so the metrics are the same no matter how much padding is used around the glyphs.

Font metrics

Unfortunately this means that if you had been using a font that used padding, all of your carefully placed text may change size or position. You can go and fix this up everywhere, but for existing apps it is likely easier to just use this code to go back to the old behavior: