Implementation of the Yepi mobile API

Favourite 10 favourites
Tutorial written by PixelRebirthOriginally published on 30th, November 2013 - 3 revisions


Developing any game to completion certainly is no small task. If you have come this far, your next step might very well be looking for ways to monetize your creation. In case your game is fit for the mobile HTML5 market (touch controls!), licensing it is one of the most attractive options.

One of the companies looking for good quality mobile HTML5 games is If you sold a license to them, part of the agreement will be the implementation of their API in your game.

Now this might pose an intimidating hurdle at first, since Construct 2 developers aren't necessarily versed in actual coding. It's the beauty of C2 that you don't need to be. But now you will be confronted with some Javascript in their API documentation. What to do?

I created a little plugin to make the implementation easier. This tutorial will guide you through the process of adding full API functionality to your C2 game.

Download Yepi plugin

Obviously the first step is to download the Yepi plugin and add it to your project.

Taking a look at the Yepi documentation again you will realize that there are two types of events that are needed for the API (speaking generally of "events" here, not in the C2 sense).
Namely those are Game Sending Events and Game Receiving Events.

Game Sending Events

Game Sending Events require the call of a javascript function. This may also be done by other means, for example the CallJS plugin. With this plugin you will simply have to apply four actions to support all of the Game Sending Events.

1. Game Loading Complete
Simply have an "On Start of Layout"-event in your first layout with the action "Loading complete". Done.

2. Level Complete
When a level is completed, you will likey have events to display the overall score or something else before you go to the next level. Be sure to use the action "Level Complete" there.

3. Game Over
The player ran out of lives or the game is finished? Add the action "Game Over" to your event.

4. Level end/Game Over (send score)
It is usually at the end of a level or the game when the player's score is determined. Use the action "Send Score" with your score variable.

Game Receiving Events

Game Receiving Events require to listen to requests by the API. This includes turning the audio on and off, pausing and unpausing, restarting the game and lastly resizing it. For the Game Receiving Events you will be able to use conditions.

1. Sound On
You can use the action "Set silent" of the audio object.

2. Sound Off
Same here. Use "Set silent" and set it to active.

3. Pause game
Here's it's just a matter of adding an action which pauses your game. Setting the timescale to 0 might just do it, however I recommend using rexrainbow's Pause plugin.

4. Unpause game
You might have guessed how this should look:

5. Game Restart
Simply use this condition with an action that goes back to the title or rather the level selection layout, if there happens to be one.

6. Game Resize
The most complex API feature your game needs to support is certainly the resizing on request. This means you cannot use any of the fullscreen modes, as you need full control over the canvas size at all times. Set fullscreen to off in the project properties.

The Yepi API might want to scale your game to sizes with pretty wild aspect ratios. There may be games that are designed to support almost any size, showing more or less of the level area. Endless runners for example can work this way.

But I go out on a limb here and assume that your game is much more likely to be designed for a certain aspect ratio. With that in mind, you need to find the scale that fits best into the by the API requested size.

I recommend making a new event sheet handling the resizing (and possibly other Game Receiving Events as well) which you include with any other relevant event sheet. If you didn't add the function object to your project yet, I'd also suggest to do so now, as it makes things a lot handier.

It's also not a bad idea to create two global variables for the native width and height of your game. If all of your layouts have exactly the native size, which is likely in case your game doesn't scroll, then you don't need these (use the expressions LayoutWidth and LayoutHeight instead).

Add another global variable to hold the currently desired scale.

Make a new function, call it "findScale" or some other unused function name. To create a new function add an event with an "On function"-condition of the Function object.

Two parameters will be passed to this function. The first for the requested width and a second one for the height.

Add an action setting the scale variable like the following:


This finds the maximum scale by checking how often your native width fits into the requested width.

Now this would only be correct if your game still fit vertically into the browser window. To test for this add a sub-event with a "Compare two values"-condition of the System object.
Here you enter some math again:

    scale*natHeight > Browser.ExecJS("window.innerHeight")

Pair this with the action

    set global variable scale to Function.param(1)/natHeight

to base the scale on the height instead.

And to complete this add a new event with an action calling the yet undefined function "applyScale".

Now create the function called "applyScale". We need it to execute two actions. First it should set the canvas size and then change the layout scale. Both actions are again of the System object.

    set canvas size to natWidth*scale and natHeight*scale
    set layout scale to scale

To have the just created functions work with the API, simply create an event with the "On resize request"-condition calling the function "findScale". The plugin provides two expressions Yepi.Width and Yepi.Height. Add those as function parameters.

Another thing you shouldn't forget is setting the scale on start of every layout. You can add the following event to your Yepi event sheet:

    On start of layout -> call "applyScale"

Okay, there is still the special case of the first layout. This should by default be sized to fit the browser window, like letterbox fullscreen would. So for your first layout, create this event:

    On start of layout -> call "findScale" Browser.ExecJS("window.innerWidth"),Browser.ExecJS("window.innerHeight")

Note that if the player is able to return to the first layout, this event shouldn't be executed again. You can use a global variable to check for this.

Congratulations, you just completed the hardest part of the implementation! But there is still more to learn.

The kinks

The Yepi API depends on two javascript files: mYepiAPI.js and mYepiAPI_Local.js. Both are included in the plugin folder. Unfortunately you can only define one dependency in C2 plugins, which is a little inconvienent here.

This means that you will get javascript errors when previewing your game which is making use of the Game Receiving Events. To test your creation you should export it instead and try it on your localhost.

Copy mYepiAPI_Local.js and mYepiAPI_Tester.js manually to your game folder.

To prevent you from having to edit the exported index.html file all the time, there is an adjusted one in the plugin folder. It's called index2.html so it doesn't get overwritten when you export. Also copy this file to your game folder. You might want to rename the title in the html file to the name of your game.

Now you can run your game from the url localhost/yourgame/index2.html.

The mYepiAPI_Tester.js enables API testing control and status shown above your game in the browser window. To make use of it you have to uncomment a line in index2.html.

Before you zip your game and upload it to the Yepi online API tester you need to comment out the mYepiAPI_Tester line again and also remember to use index2.html, but rename it to index.html in the archive.

And this concludes the tutorial. I hope this will help out a few folks trying to make a buck from their C2 games. Feel free to ask additional questions in the comments. Thanks for reading!

Unlock your full gamedev potential

Upgrade to the Personal Edition of Construct 2, it has way more features and won't holding back from making money and using your full creativity like the free edition does. It's a one off payment and all Construct 2 editor updates are free for life!

View deals

Plus, it's got a lot of additional features that will help you save time and make more impressive games!

Congratulations on finishing this tutorial!

Did you learn a lot from it? Share it now with your friends!

Share and Copy this Tutorial

You are free to copy, distribute, transmit and adapt this work with correct attribution. Click for more info.


producermark11 8,073 rep

Awesome, my daughter loves Yepi.

Saturday, November 30, 2013 at 4:53:06 PM
AbelaNET 14.9k rep

Thanks. Very interesting since I didn't know about it :(

Saturday, November 30, 2013 at 7:52:43 PM
Lordshiva1948 44.3k rep

Hey nice one thank you for sharing this stuff is wonderbar

Sunday, December 01, 2013 at 1:09:36 PM
Joannesalfa 28.4k rep

How did you get a way to sell your game in Yepi website?

Wednesday, December 04, 2013 at 12:49:58 PM
PixelRebirth 8,175 rep
How did you get a way to sell your game in Yepi website?
quoted from Joannesalfa

Oh, must have missed this comment. Sorry. Actually I simply got contacted by the company about licensing my game. I did have it up on some platforms like marketjs, FGL and though.

Tuesday, January 07, 2014 at 3:43:41 PM
Cipriux 19.2k rep

Thanks man, you saved my day (hole week actualy). When my client asked me to implement Yepi API I certainly felt depressed until I found your plugin.

Monday, May 19, 2014 at 11:55:14 AM

Leave a comment

Everyone is welcome to leave their thoughts! Register a new account or login.