
Show HN: XMoto.js - MichaelHoste
https://github.com/MichaelHoste/xmoto.js
======
jozan
Looks really cool! Have you thought about adding multiplayer?

I really wish someone would do the same for Elma/Elastomania. I feel like it
has much more funnier physics with it's elastic suspensions etc. Even the
third party extension which added multiplayer support was amazing ten years
back.

Btw, is this project still active? Last commit was nine months ago.

~~~
MichaelHoste
Yes of course I had multiplayer in mind the whole time. I even started a Rails
application here for that purpose:
[https://github.com/michaelhoste/xmoto.io](https://github.com/michaelhoste/xmoto.io)
(it was more of a proof-of-concept)

But I'm afraid of the tweaking of the physics once the multiplayer game is
started (and replays are created). Do I need to freeze them once-for-all and
only work on supporting more levels or create an editor?

I still have plans for this project, but this is a side-project and like
always, life happens and free time disappears...

EDIT : the work-in-progress is in fact in the "pixijs" branch, I almost
finished the rendering engine switch to
[http://www.pixijs.com/](http://www.pixijs.com/) (higher level of abstraction,
more cool 2D effects)

------
andreynering
This is so awesome! I couldn't play yet because I am on mobile, but I will
definitely do it later. I always liked this game.

As someone who never coded a game (a part from one that don't use any
graphics:
[https://github.com/andreynering/sudoku](https://github.com/andreynering/sudoku)
), I always ask myself how hard is to code a 2d/3d graphic game. I say this
because a game seems much more impressive than other kind of (boring) coding
projects.

~~~
MichaelHoste
I tried to start a blog to talk about the project's creation:
[http://xmoto.io](http://xmoto.io) But as always, I prefer to spend my time
working on the code than writing blog posts... So they are not up-to-date (and
will never be).

Games are not my branch of work and I was like you. What I can tell you is
that learning to deal with the game loop is the hardest part. The
synchronization between the physics, the drawing and the game logic is not
very intuitive for a web application developer :-)

------
ycmbntrthrwaway
Looks like controls are completely different from
[https://xmoto.tuxfamily.org/](https://xmoto.tuxfamily.org/). In Elastomania
and original XMoto left/right just adds momentum, and in XMoto.js it just
tilts the player forward or backward, which is more realistic. Is this
behaviour intended? Compatibility with original XMoto is not planned, right?

~~~
MichaelHoste
The keyboard controls are the same as XMoto (up for acceleration, down for
brake, left/right for rotation) but they are applied differently. The smallest
difference in physical value (torque, acceleration, grip, weight, etc.)
changes everything and it's very difficult (if not impossible) to have
_exactly_ the same behavior as original XMoto. So I just recreated some
physics that are fun to play with and works well with the existing levels.

If you want to play with the physics, you can try to change some values here
by clicking on them:
[http://js.xmoto.io/?level=1010&debug=true](http://js.xmoto.io/?level=1010&debug=true)
It's fun to do and I'm open to new modes :-)

If you are interested, the input code is here. As you can see, acceleration
and brake are only applied on the wheels, like in real-life. But for the moto
rotation, I cheat by applying some torque on the moto body because the driver
was not heavy enough to make it rotate quicky:
[https://github.com/MichaelHoste/xmoto.js/blob/pixijs/src/mot...](https://github.com/MichaelHoste/xmoto.js/blob/pixijs/src/moto/moto.coffee#L81)

------
asynchronous13
Very nice work!

I noticed a pretty significant bug (i think). The ghost character actually
clears the checkpoints for the current rider! As an example, on level two, the
rider must go right for checkpoint A, then left for checkpoint B, back to
center for the finish. After finishing once, the rider only needs to go left
to checkpoint B, then back to the finish. (Checkpoint A is cleared by the
ghost rider).

Very impressive all that you've done!

~~~
MichaelHoste
Thanks for the compliment!

Nice catch for the bug! I fixed it on the wip branch here:
[https://github.com/MichaelHoste/xmoto.js/commit/24855d191a43...](https://github.com/MichaelHoste/xmoto.js/commit/24855d191a4393369de22f6e66897ced2b0976dd)

There is an abstraction between player physics and ghost physics and I think I
need to refactor the collision system to avoid this kind of behavior.

------
petetnt
Neat! I have loved Elasto Mania, Action SuperCross, XMoto and the likes for
years and now I can play it on the browser! Apparently this project is 2 years
old now, shame that I didn't know about this before hand (or was it not
available?)

My favorite thing back in the day was making autorunner levels, where your
wheels would be lodged against two tracks (of ground) and proceed to do all
kinds of tricks.

------
fiatjaf
I thought I was the only one who had played this.

------
KTamasEnty
oh my this is wonderful. I spent so much time playing this in high school.

------
brudgers
Curious as to how hard it was to port the game to HTML5.

~~~
MichaelHoste
There were 3 difficult parts:

* The most difficult one was recreating the physics with a modern physics engine (box2D) to make them feel like the original ones. The smallest difference was making some levels impossible. It's not perfect but I tried to tweak them the best I could. And I created a debug mode to help me (and others) achieve this: [http://js.xmoto.io/?level=1010&debug=true](http://js.xmoto.io/?level=1010&debug=true) (I had way too much fun with this mode!)

* Levels: the level format was documented but not everything was "well"-documented. So I had sometimes to reverse engineer things. Like you could see, there are thousands of levels and they added layers of logics with time. So the first levels are usually compatible, but not the latests. And when I tried to add some logics (parallax, checkpoints, etc.), sometimes, the first levels broke (it's difficult to write tests for this). I wrote a blog post about it here: [http://xmoto.io/2013/08/20/level-parsing.html](http://xmoto.io/2013/08/20/level-parsing.html)

* Replays: I tried to find the smallest possible format to save all player's replays on a database. The original purpose was to create a kind of online community where people could challenge themselves and replay size matters. I first tried to save the replays as "keyboard inputs" but it wasn't reproductible as physics engine are not deterministic between browsers (I learned it the hard way). So I had to save both keyboard inputs and physics "checkpoints" (every x seconds) to adjust the replays. I'm quite happy with the results because it's about 20ko for 1 minute of replay. Here is a big monologue about my reasoning: [https://github.com/MichaelHoste/xmoto.js/issues/8](https://github.com/MichaelHoste/xmoto.js/issues/8)

It was fun because I'm a full-time Ruby on Rails developer and I was way out
of my confort zone :-)

------
royletron
That is fantastic, great job!

------
eecks
Fun game

