Ludumdare 33

sign up sign in

Ludumdare 33 is this coming weekend - Here's what you need to know!

Join the LD community

Watch the keynote, post about your games, vote for a theme! Use the #LDJAM hashtag as always.

All of that right here

As with the last ludumdare and LD31, we've prepared some stuff for the jam to help those that will be entering. This post is going to cover a couple of notes about the changes but as always - I tried not to change or break anything right before the jam. You should use the latest version of luxe, as the improvements and features added will probably help you out during the jam.

new sample

Usually I make a sample for each alpha, but since alpha-3.0 is still being phased in, I decided to make a new sample that was more of an encompassing example of some concepts, more of a fleshed out example in isolation than usual. It was also a good excuse for me to do some fun pixel art!

The example is for a basic platformer, and shows how to use luxe.Physics for simple movement updates, luxe.collision for collision and triggers, and the property for automatically scaling to the window among others.

This sample was largely implemented by Tilman and myself helping out/testing and readying the code for the repo. It's not yet done, and will still get some tweaks and fixes and clean up going forward! But you can learn from it and play around with it in the mean time.


  • move with AD/Arrows
  • jump with Z/space/up/W

Remember: You have to click once it's loaded to give the game focus.

Click to run example

The above example can be found inside the repo at samples/examples/platformer.

(If for some reason the above doesn't work, this is what it looks like) example

new features

Tilemap bounds fitted helper
@KeyMaster- and @EduardoLopes added a new feature to the tilemaps, which looks a bit like this:

tilemap bounds fitted

What it does is return a list of combined rectangles for a specific layer - such that a collision layer can be made more efficient when creating collider shapes with Nape physics or for use with luxe.collision. Of course, they are just rectangles, which means they can be used for anything you can imagine for them.

It's called bounds_fitted, and is a function on the tilemap layer class. See the example here.

Eduardo used this same approach for a GBJAM entry:

Tiled importer additions

Tilman also added support for importing Flipped/Rotated tiles from Tiled, and while we were at it I added Image Layers to the importer (image layer data becomes easily accessible, but you have to use it yourself to create sprites, if you want them).

Now the tests/features/tiles example includes both, the clouds are from an image layer, and a bunch of tiles are flipped and rotated. It looks like this:

flipped rotated and image layers


Added the missing destroy function for easily cleaning up tilemaps.

Luxe.draw.poly added

I added a draw.poly helper for drawing solid and outline polygons. tests/features/draw has an example if needed.


Nape collider components

@whuop made these and sent them my way to have a look, and wrap them up - so I did, and we merged them into the repo at luxe/components/physics/nape.

You can see them in use in tests/features/physics_napecomponents, they simplify the code quite a lot and handle the positions and rotations of the entity for you. This makes it a lot quicker to play with ideas:

var circle = new luxe.Sprite({  

var box = new luxe.Sprite({  

var circle_col = new CircleCollider({  
    x:100, y:100, r:64

var box_col = new BoxCollider({  
    x:140, y:100, w:128, h:128

The sample looks like this (with horribly compressed colors):

Bug fixes and Performance

Aside from some underlying rendering improvements I've been adding short term to phoenix, there were quite a few improvements that are user facing that I wanted to mention.

The full list of fixes and issues closed for LD33 prep can be found on the repo.

Tilemap load times
I improved the loading time of the tilemaps a lot by cleaning up some stuff in QuadGeometry, which is used by luxe.Sprite and Luxe.draw as well, so there should be a bit quicker in general.

While testing this, I loaded a large tilemap and measured before and after, as you can see it's a useful improvement when they are stacked on top of each other like a tilemap.

created ortho:   0.038033766999 s  
created iso:     8.360474015004 s  
created ortho:   0.019493075997 s  
created iso:     0.724802497003 s  

Debug console rendered last-last

I moved the debug console out of the render loop, so that when people do full screen shaders with "everything" it doesn't include the console.

Rendering performance

I've been making some performance focused changes on phoenix in the interim (while waiting on the new renderer to show it's face) that should speed things up nicely. This doesn't mean that phoenix is suddenly infinitely faster - it still has the same considerations as before - it's just faster at handling things now.

I also added things like batcher.destroy() and have made some larger improvements that unfortunately were buggy, and had to be reverted. (If I can be certain they are stable, I will see if they can be in the repo well ahead of the jam).

Windows WebGL fix for performance
One thing that got caught and fixed too was a major slowdown in Windows when running WebGL content. Because of how I was rendering to OpenGL, and because Windows browsers don't use OpenGL to handle WebGL (They use DirectX under the hood, via a library called ANGLE), there was a large performance impact the more draw calls that were made. For most smaller games not drawing much this wasn't as noticeable, but for others it makes severe slowdowns happen.

Basically OpenGL drivers on all platforms we target have some affordance for the way it was being drawn, where it would quietly handle it under the hood. On DirectX(/ANGLE) the pattern isn't handled that way so the performance impact became real.

Since then, I fixed the way the rendering happens so it doesn't cause this, and Windows builds of previously not-meant-to-be-sluggish builds are back at 60fps.

Other news

Flash Develop

If you were using Flash Develop and encountered an error like this one

--macro:1: character 0 : Class<snow.modules.interfaces.Audio> should be String
--macro:1: character 0 : { } should be String
--macro:1: character 0 : For function argument 'module'

Be sure to update to the latest development build, as Philippe has helped us track down and fix that!


All the documentation should be up to date! In fact, I actually automated this now so it's always up to date, whenever changes are pushed to the repo. That saves me a lot of time and you a lot of headaches!

EDIT: mint alpha released!

Kenton and I were working on porting the work on this particle tool to mint, it's pretty usable! Be sure to try it out.


There's been a lot of cool stuff going as always.
Be sure to check out the crazy packed dev log #6 if you haven't.

Briefly, it's good to mention that The Westport Independent developers are heading to PAX Prime, and will be a part of the excellent Indie MEGABOOTH. It's really great to see the game doing well out in the wild!

They posted a picture of their banner for the booth, I am actually jealous, it's so neat.

westport banner

And (with my help) Jonathan got a luxe logo vinyl sticker printed! (I am looking toward official merch stuff by the way, this was just a special case).

Don't forget, use the #luxeengine hashtag to help others find your posts/games or questions during LD.

Join the community chat, too.


Lastly, watch out for important posts from @snowkitorg, and on, as there are other things I gotta share :}

luxeludumdaregame jamjamld33