[Official, paid] Plugin contract: Sprite Font

  • Due to popular request, we'd like to create an official version of the third-party Sprite Font plugin by Mipey. We always have too much to work on at Scirra, so we're offering to contract this work to a third party developer at a fair rate. Since official plugins require occasional maintenance, we intend for this contract to cover small amounts of future work in order to keep up with changes and bug fixes, which we are also happy to pay for.

    Specification

    The Sprite Font plugin is effectively the Text object, but drawing each character from an image. The image contains a grid of every character in a character set (most commonly ASCII), and then to render a string of text each relevant character is drawn out from the grid in the correct sequence. This allows arbitrary text to be rendered from individual hand-drawn characters.

    Note we are not looking for an identical clone of the third-party plugin; this specification makes some changes, additions and removals, some of which are also relatively subtle.

    Properties:

    Sprite font [Edit] - opens the image editor for the sprite font image

    Character width, Character height - size of each cell in the image

    Character set - the sequence of characters displayed in the image, so the plugin can look up which cell to retrieve for each character

    Text - initial text

    Scale - a multiplier to scale the drawn text with. Effectively the font size, but just done by stretching the drawn images.

    Initial visibility - visible/invisible

    Horizontal alignment - left/center/right

    Vertical alignment - top/center/bottom

    Hotspot - top-left/center

    Wrapping - word/character

    Character spacing - extra pixel width to add between characters, default 0

    Line height - extra pixel height to add between lines, as per the Text object, default 0

    Other properties from Mipey's plugin should be omitted. In particular the 'Effect' property must be omitted since that is now handled by the built-in 'Blend mode' property. The plugin should handle wrapping as the official Text object does (drawing to the full extent of the object's bounding box, but never outside the bounding box).

    Conditions:

    Compare text (match the official Text plugin's condition)

    Actions:

    Set text

    Append text

    Set scale

    Set character spacing

    Set line height

    It should also be possible to specify variable width characters. I think this would best be done by having an action to set a narrower width than usual for a specific cell. E.g.

    Set character width

    For example, "Set character 'i' width to 3 px". Any attempts to set a width wider than the cell width should be ignored. After that action, any 'i' characters that are drawn should only occupy 3px of width, rather than the full character width, so narrow 'i' characters do not appear with unnecessary space around them. Narrower characters should probably be drawn left-aligned in their cell, since if they were centered then the rounding of odd sizes could cause pixel-perfectness issues.

    Expressions:

    CharacterWidth

    CharacterHeight

    CharacterScale

    CharacterSpacing

    LineHeight

    Text

    TextWidth

    TextHeight

    Note TextWidth and TextHeight should mimic the official Text plugin, which returns the extent of the actually drawn text. For example if the string "foo" was displaying in a 1000x1000 sized text object, the TextWidth and TextHeight are the size of the box enclosing the characters of the string "foo".

    Default sprite font

    A default sprite font should be provided as the initial image, so something useful can be rendered immediately after inserting the plugin. We must have copyright permission to redistribute this image, so it would be best if you come up with an original, or at least find an acceptably licensed example online. We will need to add features to Construct 2 to support loading this as the default image, but we will do that ourselves.

    The default image must be a power-of-two size.

    Editor rendering

    It is not necessary to have accurate sprite font rendering in the editor, since this can be time-consuming and difficult to get right. A reasonable placeholder is acceptable, although if you can manage full edit-time rendering we would be very impressed!

    Technical aspects

    The plugin should support any size image. Specifically it must not require a wide image with all the characters on a single line, since this is likely to be wasteful on devices where the GPU places the image on a power-of-two surface internally. The plugin must work with power-of-two size images, and we will document that this is recommended for use with the plugin. Given any size image, the cell sequence starts in the top-left corner and continues after wrapping at the edge of the image.

    The character set should support unicode characters. In other words it should work correctly if the user enters a sequence of Russian characters for the 'character set'. You should check if some languages involve surrogate pairs (where two code points are emitted for a single typed character), and this should be handled correctly (the character must not span two cells in this case).

    The plugin should perform well and create a minimum of garbage. Rendering the object continuously whilst setting any of its properties to different values every tick should create virtually zero garbage, if reasonably possible. All official plugins are written with this aim. See this blog post.

    The plugin should not allocate any images or create any canvases other than the single sprite font image, to minimise image memory use. Note Mipey's plugin allocates additional images or canvases; this should not be done in this plugin. It should be possible to draw arbitrary strings directly from the single sprite font texture. It must support both canvas2D and WebGL renderers. It must support Construct 2's layout-by-layout texture management in WebGL mode (the Tiled Background object is a suitable example of how to do this).

    The plugin must be tested and verified that all features work on all Construct 2's supported platforms, including when minified. Specifically CocoonJS may be problematic, but it must work with the subset of features that CocoonJS provides. We can help with testing if you don't have access to particular devices, since we have lots of devices in our office.

    Copyright

    It is absolutely prohibited to re-use any code from Mipey's plugin, since we do not have copyright permission to use it. It should not be necessary anyway, since the features described here should be achievable by most competent programmers.

    You are free to re-use/rip/adapt/hack any code from any official code, especially the Text plugin (from which it might be useful to steal some word wrapping code).

    Maintenance

    Any bug reports we receive relating to the plugin, even long after release, we will forward to you and expect you to fix in a relatively timely manner (before the next stable release, which usually occurs every 6 weeks, or at the next stable release after that if already close to a stable release). The contract will also cover payment for maintenance work. We may also decide to alter the code of the plugin ourselves, after which we will notify you and send you our updated version. We do not expect maintenance work to be too time consuming (probably a couple of hours every couple of weeks in the long term).

    Obviously we have expertise with the Construct 2 engine, the Javascript plugin SDK, and general Javascript coding; we are happy to offer help and assistance as needed (but obviously it's preferable if you can be mostly self sufficient).

    Code quality

    We expect well-written, professional code. It should be at least reasonably readable and practical for another developer to understand and maintain.

    Documentation

    We think it is simplest that we provide the documentation, since the use of the plugin should be straightforward. Therefore you do not need to worry about writing the manual entry or any tutorials.

    Future work

    We are interested in contracting similar jobs in future, where we contract to have certain plugins or behaviors developed. High-quality work on this job will put you in a good position when we have other projects in future!

    Application

    This job has now been assigned to a developer. Look out for future work postings!

    Please email applications to ashley@scirra.com, with a CV or references to your past work. Things which will count heavily in your application are: experience with Construct 2; experience with writing previous plugins or behaviors in the Construct 2 Javascript SDK; any other Javascript programming experience; availability in the long term to perform maintenance work (on the order of a couple of hours every couple of weeks).

  • Ashley Thank you!!! I use this plugin in all of the projects I work on.

  • let it be

  • I hope some one takes this contract :) I think it would be well worth it for some :)

  • I love this initiative.

  • good idea <img src="smileys/smiley20.gif" border="0" align="middle" />

  • thank... you... finally haha

  • Yesssssss. This is the most important third party plugin i ran into. 8)

  • Try Construct 3

    Develop games in your browser. Powerful, performant & highly capable.

    Try Now Construct 3 users don't see these ads
  • Pretty stoked about this but wouldn't it be better to have it use individual sprite frames/instances for the characters instead of a single texture a la Rexrainbow's "text by sprite" plugin? It'll be much more versatile that way..for instance, you can set the properties of individual characters or words in a single string or apply shaders, or have each character play an animation or something as the string is being typed out. Doesn't look like that'll be possible with this one.

  • Tokinsom

    I agree in that it would give you a lot more control, but that would create other issues such as a lot of instances.

    Obviously that wont work for mobiles.

    So the question is should there be a separate option for frames rather than a single texture?

    Can that even be done?

  • SpriteFont plugin breaks in v133 so I'am stuck to v132 until someone makes this plugin official. Looking forward for the official release.

  • I vote single texture one, since portable (could run at all platforms, included moblie devices)is more important then flexible, for official plugin.

  • Yes, let us yet again lower our standards solely to run our games on platforms they struggle immensely with in the first place.

  • There's no reason a sprite version wouldn't work on all platforms. But at first guess I would say this first spec would be easier, cheaper, perform better, and be simpler to use. I'm not going to change the scope of this job after posting, but I'm not ruling out any other plugins.

  • Great news!

    +1 for easier cheaper simpler

Jump to:
Active Users
There are 1 visitors browsing this topic (0 users and 1 guests)