I don’t use levelhelper or anything else to make levels - I use the game itself.
Because the terrain is just a series of points, when I run the game in edit mode, I show each of those points as a touchable sprite, and drag them to modify the terrain.
I can insert and delete points then drag them until the terrain looks right.
Then i have a menu showing all of the ‘entities’ I have designed - I can then select them and insert them into the world.
The entities are in a vector like the terrain points, so I then have a method that saves each vector as a pList in the same format that is loaded by the game when it runs.
I still do some manual tweaking to set specific values against some of the entities - and (for example) to change the friction on a particular piece of terrain - but the editor mode gives me a pretty good idea of what it is going to look like.
best of all, I can switch back to ‘play’ mode at any time and test to make sure that gap isn’t too wide, or that hill too high!
I have no intention of leaving edit mode in the app when it is finally released - but it saves me having to type in coordinates for things, running the app then changing coordinates - and I can add functionality to the editor as I see fit (for example, I recently added a switch to allow me to view the Box2d debug while editing, so that I can see some of my invisible ‘trigger’ objects that don’t have associated sprites.
for your scenario, I personally would invest the time to add an editor in the app, edit 20 levels (you can make the editor force the first and last terrain points to be at the same height, for example)
At run time, you would need to know when the end of one level is coming as you scroll toward it (a simple calculation) and adding the next level on to it.
At the same time you could remove the last-but-one level from the collection and adjust your pointers.
Alternatively, you can make the levels overlap by at least one screen width (i.e the first and last screen width of every level is identical) then, when the (length - screen width) point is reached, simply swap which level you are looking at, adjusting the pointer to 0