User Tools

Site Tools


Table of Contents



  • Collision detection has been overhauled. In general, collisions on a sprite are resolved in order of overlap area, so a sprite that majorly overlaps another will get first shot, before one that overlaps a little. You should always perform collision checking via collide(), and in the onCollide handler of your sprites call displace() to move sprites around. This will prevent sprites from sticking to each other.
  • Event handling is now guaranteed to bubble up, so that sprites at the end of the display list now react to all events before their parent group, view, or app do.
  • Maps no longer have subcollide() and subdisplace() methods – you can now just write collide() and displace() like any other sprite.
  • Maps now have a spriteAtMap() and spriteAtPixel() methods that locate a sprite at a particular position, either in pixel or map coordinates.
  • The onDraw handler has been removed in preparation for mobile support. If you need its functionality, you can simulate it by writing a draw() method on your sprite that, in its first line, calls Sprite.draw(self, x, y).
  • The loadLayers() method has been moved from the View class to the Group class, and you can now specify a class to use when loading tile layers.
  • The debug console now displays the source file and line number where a print statement is coming from, where possible.


  • Bugfixes for collision detection, particularly displacement by a map or group of sprites. This should eliminate behavior where sprites seem to stick on a wall of sprites.
  • Buttons now have a enabled property that allows them to be disabled.
  • Fix a bug with loading Tiled maps where sprites would appear at the wrong position.
  • When a timer completes, its promise is now fulfilled with the results of the timer's function call.
  • Add more helpful assertion messages related to strict checking of function binds, promises, and view panning.


  • This release will break existing code, see below.
  • Added a new core class, Promise, that manages asynchronous operations. Its design implements the Promises/A spec.
  • The Timer class's start method has been replaced with two methods: after and every. after makes a function call after a certain amount of time; every calls it periodically. example: the.view.timer:after(2, myFunc) after() will return a promise that is fulfilled after the timer runs out; every() returns nothing.
  • The Tween class's start method has been simplified to the.view.tween:start(target, 'property name', duration, [easing]). The force argument is now implied to be true – if you want to check to see if a tween is already occurring on an object, you can use Tween.status(). This method now returns a promise that is fulfilled when the tween is finished.
  • View.fade() and View.flash() now return promises that are fulfilled after the effects complete.
  • Added a bind() function to make binding function calls to object easier. example: bind(object, 'method name')


  • Added a new utility class, Subview, to better handle temporary views like pause overlays or inventory screens.
  • You can now set pixel effects (LÖVE's take on GLSL shaders) per group.
  • Views now have a panTo() method that scrolls the view so a particular point is centered.
  • Sprites now have a distanceTo() method that measures distance to another sprite or point, and flipX and flipY properties that mirror the sprite when drawing.
  • You no longer need to write a love.load() handler. Instead, you can just write = App:new{…} in main.lua and it will be automatically started.
  • The debug console now accepts = as a shortcut for printing values, e.g. =2+2 will print 4 to the console. It also supports Control-A to skip to the start of the command entered, Control-E to jump to the end, and Control-K to erase the command being entered.
  • Most classes now have __tostring() methods, so entering a debug command like =the.view will give more useful information.
  • Fixed the FPS tracking so that Zoetrope apps will always stay exactly to their set FPS, and not run any faster.


  • Overhauled the collision system to be much faster. Groups can now displace() as well as collide(). Sprites now have an intersects() method that checks whether any point or rectangle overlaps it.
  • Switched the default debug console key to the tab key.
  • Sprites are less annoying about forcing you to specify all of their physics properties, e.g. you can write sprite.velocity = { x = 10 } instead of sprite.velocity = { x = 10, y = 0, rotation = 0 }.
  • Assorted bugfixes.


  • Assorted bugfixes.
changelog.txt · Last modified: 2013/03/18 21:47 by Chris Klimas