I had a difficult-to-spot logic error in JS. There is a sprite class, and code to update its position and deactivate/stop it if it is off-screen. It was working, but I had duplicate code in different places, so I decided to consolidate it in one place. It made sense to move the function to a method, so that's what I did. But then the sprites refused to move. I found that they would deactivate/stop every tick of the timer function. I realized that the error stems from these lines: tempX = sprites[i].floatX + sprites[i].DX; tempY = sprites[i].floatY + sprites[i].DY; The reason is simple and dumb: since this code is within a method, i.e. called by sprites[i].Update(), the "sprites[i]." does not have the same meaning inside it. The fix is easy: tempX = this.floatX + this.DX; tempY = this.floatY + this.DY;