Text

TypeScript in focus - getting started with TypeScript Turbulenz

SDK 0.25.1 is a minor update to SDK 0.25.0 and contains a few fixes and updated documentation. If you’ve just updated to 0.25.0 this update should be a breeze.

TypeScript in Focus

There’s now a whole new section in the “Getting Started Guide” that goes into depth about how to build against Turbulenz TypeScript modules. With a walkthrough example and commands that you can use with your own build system. You should be up and running in no time. Future developments will include a standardised build structure, so watch this space.

More and more COLLADA updates

We’re continuously making updates to our dae2json tool; supporting additional features and making improvements. There’s so much going on we can get them out fast enough. See the detailed release notes to find out what’s new.

A fistful of fixes

Fixes in this release include a bug in the soundDevice.listenerGain property on canvas and the correction of a few missing files in the SDK. See the release notes for details.

Text

TypeScript version of Turbulenz Engine now available

Type check… one, two - TypeScript support rocks Turbulenz

image

SDK 0.25.0 has been a long time coming, but we hope it will be a significant step in helping our developers make awesome games. This SDK includes the first public release of TypeScript versions of our libraries. With improved syntax checking and validation using TypeScript should help you streamline your development process and avoid silly bugs and runtime errors down the line. It compiles to JavaScript and works with other existing JavaScript libraries.

You don’t need to use TypeScript to use Turbulenz, but we now provide type definitions for all of our libraries, which is just one good reason to try it out!

For more information on TypeScript check out: http://www.typescriptlang.org

Features

TypeScript

The SDK now includes tslib and jslib (generated from tslib) as well as TypeScript versions of apps and samples.

This feature is in beta and we need your help to try it out! Make sure to read the detailed release notes and the TypeScript recommendations.

  • Existing developers: Use the standard jslib as usual. If you have your own modifications, compare your code to the tslib version which has a similar layout to previous jslib releases. Investigate whether TypeScript would help you with your project.
  • New developers: Start your project with either of tslib or jslib depending on preference. 

interesting blog article of his findings during developmentOur TypeScript guru Duncan has written an . Definitely worth a read.

Video support

The GraphicsDevice now supports the creation of video objects that can render video data as a texture. This feature can be used for cut-sequences and other media playback in the game engine. The video sample shows how this can be used in conjunction with audio to playback a video. Check graphicsDevice.isSupported to find out if the browser supports WebM or MP4 video formats.

imageimage

Physics snapshots

The PhysicsManager now supports snapshots for creating and restoring snapshots of dynamic physics objects on the scene.

Ideal for resetting the state of physics simulations.

Clean-up outstanding API requests

A new destroy function has been added to the RequestHandler to help clean-up outstanding request callbacks and stop them from accessing invalid state on destruction. Make sure to add this to your existing shutdown code.

UV transformation support for the renderers

DefaultRendering, DeferredRendering and ForwardRendering now support uvTransform allowing you to rotate, scale and translate UVs. See the release notes for more details.

Updates for dae2json

dae2json, the COLLADA import tools for models, animations, materials and more has had a number of bug fixes and improvements. It has better support for various exporters from Maya/Max to Sketchup. Notable is the addition of the NvTriStrip command which is a recommended step for optimising meshes.

image

Fixes

  • T152 - An issue where deploygame tool was unable to upload to the Hub.
  • A rounding error for certain values in storeitems.yaml that caused an error on the Hub.
  • Various fixes to dae2json to avoid crashing and give more warnings for incorrect/unsupported files.
  • Fixed an issue where JSProfiling was unable to generate array information in the latest Chrome.

See the 0.25.0 release notes for more details.

The SDK is available to download from the developer service at hub.turbulenz.com.

Text

(Mostly) Painlessly migrating a 3D game engine to TypeScript

Introduction

At Turbulenz we are developing a platform for high quality online games.  Part of our technology offering includes a JavaScript library of about 100,000 lines of code, covering many areas of game functionality from rendering APIs that wrap WebGL, to an optimized 3D physics engine, and interfaces to online services.

A production-quality game using the engine can run to well over the same amount of code again (Our pre-alpha game PolyCraft already has about 85,000 lines of runtime JavaScript). The burden of maintaining JavaScript projects of this scale is already known to be significant, and this has been echoed in our experience over 3 years of developing our game engine, as well as several 3D and 2D game titles.

Catching coding errors early can make a huge difference to programmer productivity.  We regularly use static analysis tools such as jshint, as well as automated testing to try and identify problems as code changes are made. However, the lack of type information in JavaScript limits the class of problems that tools can identify, and automated testing can never feasibly cover all execution paths.

TypeScript is one of several projects that attempt to introduce static typing, allowing offline tools to identify a larger class of errors and to provide richer functionality in the IDE.  This article describes the method we used to migrate our JavaScript code base to TypeScript, while keeping development active.

Static Typing Solutions

TypeScript is not the only project that attempts to tackle the problems associated with weak typing in JavaScript. I cannot claim it is better than any of the other solutions out there, but there were a few factors that made us commit developer time to checking out TypeScript.

  • Ease of migration. As a small company with a reasonably large existing code base, it is difficult to justify and a full port to another language.  Even if development resources were not a problem, a full port would be a big commitment to make before being sure our code was compatible with static typing.  With TypeScript we were able to proceed in steps, gradually merging changes into the mainline as we went along.
  • Complexity. This is not so much the code as configurations.  A subsection of our engine has multiple implementations. In the default case everything runs directly in the browser using HTML5 and related standards. For older browsers with limited support for modern standards we provide a plugin that includes a native implementation of some of our lowest-level libraries. TypeScript provided a clear way to deal with multiple implementations of the same interface, where one of those implementations was hidden away as native code.
  • Timing. There happened to be a lot of news and activity around TypeScript just as we were discussing the shortcomings of JavaScript both internally and with external developers. This had some influence on our decision to try static typing at the time we did, and to do it with TypeScript.

Again, I’m not claiming that TypeScript is the only way to address these issues.  If conditions had been different we may have been tempted by one of the other available solutions. Particularly if we were just starting out with a new code base.

Migration Path

Initially, it was not clear whether TypeScript would be entirely suitable for our project.  Many questions needed answering:  Was it stable?  Was it compatible with how we define and instantiate JavaScript classes?  Was our API and code even amenable to static typing, or had we embraced dynamic typing to the point of no return?

It was important to be able to quickly try it out and catch any show-stopping problems early.  At the time there were relatively few public accounts of TypeScript being used in production, so we could not rule out the possibility of later finding either a bug or language feature that made it impossible for us to proceed.  In the worst case we would need to revert everything back to pure JavaScript.

We were also keen to eliminate any impact on developers in terms of interface and performance.  I was already reasonably sure that we had enough control over the generated JavaScript to avoid sacrificing performance, but it was not clear whether changes to the public API would also be necessary.

Finally, there was the issue of integration.  Development of the engine would have to continue while we simultaneously “ported” the code.  Handling development changes and keeping merge conflicts (and mistakes) to a minimum would be vital until we were confident enough to adopt TypeScript in the main code line.

As TypeScript is a super set of JavaScript, it seemed to offer as smooth a migration path as we could expect from any solution. After becoming reasonably familiar with the language and the compiler we ended up migrating in the following way, at each stage validating that we were doing the right thing.

Step 1 - A trivial build

The first step I took was to simply rename each of our .js files to .ts and create a trivial build step to convert the each of these new .ts files to JavaScript.  The code was left unchanged at this point (apart from a few small workarounds for bugs in the TypeScript compiler), the JavaScript library had the same layout as before and everything could be merged back into the main code line.

The advantage of this apparently trivial step was that regular development could continue while we gradually expanded the type definitions in the same files.  This approach is only really viable because TypeScript extends rather than replaces JavaScript, and it’s actually very important.  If we were porting to a whole new language we would have to hand pick changes to the original files into the ported version, and could only switch development over to the new files once a port was complete and fully tested.  No doubt some static typing solutions allow the port to be done in sections, merging individual modules back to the main line as they are ready, but having an almost effort free way of keeping all changes in the same files meant we could rely on the version control software to handle almost all of the merges automatically.

A secondary advantage of switching to .ts files and introducing a build step was to give developers a chance to iron out any problems with workflow and IDEs.  Previously, no build step was required, and for our developers working on the engine the code that appeared in the browser debugger was the original JavaScript source itself

In practice, for various reasons (including limited available time for the project) we ended up keeping much of the work in a branch for long periods of time.  In hindsight, we could have integrated earlier, but it felt like too big a leap into the unknown at that stage.  Thankfully, git was aware of the file renaming and handled the integrations from the main line extremely well. If the change management and integrations had not been as easy as they were I am quite sure our investigation into static typing would have ended here.

Step 2 - Type checking

As this stage, the build did not catch any errors apart from syntax errors.  The next step was to enable all the type checks. When this type checking build passed we could be more confident about the type-correctness of the code in our engine.

For the simple build I added an —ignoretypeerrors flag to the compiler to make it only output error messages and exit with non-zero values if there was a syntax error in the code.  For the type checking build I had to add —failonerror, which stops the compiler writing output files if there are type errors in the code.  Without this, build systems may not try re-run the compiler during a rebuild after errors have occured.  (The default compiler always outputs a .js file but exits with 1 unless there are no type errors.  Our custom version is available on Github)

In this stricter mode it was no longer possible to blindly build each .ts file into a corresponding .js file. Since some files relied on types declared in other files, the build had to be aware of dependencies between different parts of the code and build everything in the correct order.  As a simple (fictional) example, if the ‘engine’ module references classes in the ‘platform’ module, ‘platform’ must be built (and the ‘platform.d.ts’ file generated) before ‘engine’ can be compiled.

This may seem like an over complicated approach.  Indeed, for many projects it would be possible to just build all .js files in a single step. In our case we were forced to divide up the code in this way for a couple of reasons:

  • Some of the code represented the ‘canvas’ (HMTL5) implementation of the low-level engine that may or may not be replaced by our browser plugin.
  • Building all the .ts files at once would result in a single huge .js file. It is important that our engine remain modular so that game developers can include only the parts that they need and keep the download size of their final code as small as possible.

This stricter build mode is referred to as ‘modular’ in our system, since it allows developers to express the build as modules and dependencies between them. It then resolves the list of .ts and .d.ts files required for each module and handles building everything in the correct order.  As an example of a module specification, the following is an extract from the build files for our SDK:

utilities_src :=

platform_src := platform.ts
platform_deps := utilities

jsengine_src := $(wildcard jsengine/*.ts)
jsengine_deps := platform

From this, the system automatically determines that in order to build jsengine, say, it must generate the type declarations for utilities and platform, and use both of those declaration files in the build command for jsengine.

Step 3 - Adding static type information

After Step 2, we had two builds that could be run side-by-side. A “crude” build that generated the production version of our library (with exactly the same file layout and functionality as the original JavaScript), and a stricter build which would, when it passed, generate .js files and .d.ts declaration files for each module.

Note that the crude build could always be relied upon to produce working JavaScript, so throughout this process all samples and applications could be built, and the generated code could be tested in exactly the same way as before.

As one would expect, the modular build initially failed at a very early stage. I had already added a lot of type information while experimenting with the compiler and adding build steps, but a lot more was required to fix all the compiler errors.  So the next step was to get this stricter build to run without errors.

The plan was to make the modular build pass as soon as possible by adding only the minimal amount of type information.  We could then enable type checks on the build machine and ensure that at least any new code would be consistent with existing type declarations.  Later go back and add more and more type information as time allowed.

It turned out to be a lot of work just to make this build pass, and some of the changes were invasive enough that I decided to keep them out of the main line until the build succeeded.  Potentially this stage could have been achieved by just adding ‘interface’ declarations for each of our classes, and I initially start with this approach. However, I quickly switched to doing wholesale conversions to TypeScript classes.  This generated much better .d.ts files and avoided a few problems with symbols not being found by the compiler.

The compiler may be much more robust now, but at the time everything was more stable using classes in .ts files.  It was something that we would end up doing anyway, and in most cases it was possible to do this without reordering functions within a file, so integrations from the main line remained surprisingly smooth.

The details here may be informative for people who are new to TypeScript, but some may want to skip the remainder of this section.Our original classes took this form:

function MyClass() { };
MyClass.prototype.method = function ()
{
    return this.y;
};
MyClass.create = function()
{
    var myClass = new MyClass();
    myClass.x = 123;
    return myClass;
};

Note that there are two member variables x and y mentioned here. The following is the minimal declarations that will satisfy TypeScript when building the code above:

interface MyClass
{
    x: number;
};
declare var MyClass :
{
    create(): MyClass;
    new(): MyClass;
    prototype: any;
};

(We also needed to make the MyClass constructor function return this.)

The declare statement deals with the global constructor MyClass. Here the static create function and the constructor are declared, as is the existence of the prototype, which at this stage is given type ‘any’ for simplicity. The interface refers to instances of the class. We have had to declare the x member, referenced in the static create function, but not the y member referenced in the method. (This is presumably because the prototype is marked as any and therefore could have any members.)

The advantage of this form is that it can be dropped at the top of the file and does not usually require any changes to the existing body of code. In theory we could just flesh these declarations out as required and keep the TypeScript and old JavaScript separated for the time being. Integrations become trivial and if we decided to move back to JavaScript it would just be a matter of deleting a few lines.

However, the declaration of the global constructor did not make it into the generated .d.ts file, and in some cases TypeScript could not find certain methods or properties when compiling dependent code. This may have been fixed in the latest version of the compiler, but switching to classes was the simplest way to this these problems at the time and made everything much more reliable. The resulting code:

class MyClass
{
    x: number; y: number;
    method()
    {
        return this.y;
    };
    static create()
    {
        var myClass = new MyClass();
        myClass.x = 123;
        return myClass;
    };
};

was a bit more of a commitment in terms of code changes. The main code body has to change slightly, and we now have to declare all members.  However, we have not had to re-order any functions, so comparing with the original it’s clear that most upstream changes can be merged with relatively little hassle. 

So I made the leap to classes for almost all of our code and by the time the modular build finally passed I had made more changes than I had hoped, but a large amount of the final type information was in place and the whole process had revealed several bugs. The next step was to build our application code against the generated declarations to catch any remaining holes in the type information.

Step 3.5 - IDE support

As it became clearer that TypeScript was effective at catching problems and reducing the cost of code maintenance, we started to look more seriously at the logistics of developing our game engine entirely in TypeScript.  Inevitably, the issue of IDE support came up very quickly.

The TypeScript plugin for Visual Studio provides excellent tooling when configured correctly, however our developers work across Windows, Linux and Mac OS X, and use a variety of editors. Editors that provide good support for JavaScript do not always have the same level of support for TypeScript. In many cases TypeScript support is in development for these editors, so we can expect the situation to improve drastically in the future. The TypeScript site has links to integrations for Vim, Emacs and Sublime Text which gives developers a reasonable amount of choice. Our build system can be launched in a syntax checking mode (to builds just enough to validate a given file and output the errors only for that file) which can be used for on-the-fly syntax checking (as with emacs flymake) or for validate-on-save checks.

Debugging is also more difficult with TypeScript since the browser is reading and executing generated code rather than the original source. However the TypeScript compiler can already generate code maps for browsers that support them, so we can expect this situations to improve as well.

So for now there has been a slight decrease in functionality of the development environment for some of our engineers, depending on the editors used, but overall productivity should improve as we have stronger checks much earlier in the development workflow.

Step 4 - Building applications

This part of the process is still going on. We currently have a fairly complete set of .d.ts files that will be shipped with the next version of our SDK, and we are gradually transitioning all of our sample and application code to TypeScript.

It has caught several bugs in the application code, as well as a few missing pieces of the TypeScript declarations. One common problem was optional parameters. A method declared:

method(requiredParam: Type1, optionalParam: Type2): number
{
   ...
};

numberwill not be flagged unless client code tries to call it without the optional parameter. Therefore to actually find many of these issues we must build with as much application and test code as possible.

Now that the our TypeScript declarations are released in the SDK, we hope that developers will try building their games against them and give us feedback.  If everything continues to go well then we certainly plan to migrate more of our projects to TypeScript.

Take a look

If you’d like to take a look at the Turbulenz HTML5 game engine and SDK which contains both the TypeScript and JavaScript APIs you can download the latest version (>= 0.25.0) from the Turbulenz Hub.

Text

Leaderboards, multiplayer, physics and debugging all bumped up in Turbulenz SDK 0.24.0

It’s a been a busy few months since we released an SDK, so 0.24.0 comes complete with some bite-sized features and everyone’s favourite: bug fixes.

We have for you a new Leaderboards sample demonstrating how to build an in-game leaderboard complete with scrolling/paging, user avatars and a sliding window. Having spent time on the multiplayer system, we’ve added a few tools and a bit of advice about developing multiplayer games. Try out the NetworkLatencySimulator and have a read of the games development tips and tricks. Always sniffing out the best way to help developers make their games as fast as possible, we’ve made a few tool changes to allow you to strip out debug code such as asserts. Leave them in for debugging, remove them for release, simple. See the new ‘debug’ object, which is now automatically removed by maketzjs. Here’s a quick summary of features and fixes.

Features

Engine loading

The new Turbulenz Loader updates should allow multiple engines to run side-by-side. This means games on turbulenz.com can be built to work with different engines. This is ready to support turning on the feature on turbulenz.com very soon.

Networking

NetworkLatencySimulator object can be used to simulate spikes in latency and help with real-world multiplayer testing.

Tools

The maketzjs tools now runs the strip-debug tool, removing specific debug code, such as asserts in release mode.

Node.js is now included in the SDK. Perfect for use with Uglify.

Physics

A new calculateTransform function has been added to RigidBody, CollisionObject and Character.

Contact callbacks have been added for interactions between RigidBody, CollisionObject and Character.

Added the concept of a ‘trigger’ CollisionObject.

Turbulenz Services

The Leaderboards sample demonstrates the best way to create in-game leaderboards.

Input

The inputDevice now has a function isSupported. This can be used to check if pointer lock is available.

Icons

The Hub now supports the automatic re-sizing of leaderboards and store icons. Provide a 256x256 icon and it will be scaled to fit the correct places on turbulenz.com.

Fixes

Corrected the standard deviation in Profile.

T1292 - Fixed crash when not specifying callback in makePublic, updated docs.

T1246 - Fixed Websockets implementation on plugin not handling fragmented messages. Corrected for Windows/Mac.

T1299 - Updated documentation for additional Mac/Linux commands

T1243 - Fixed issue where plugin hideMouse and showMouse didn’t behave as described in the docs

See the 0.24.0 release notes for more details.

The SDK is available to download from the developer service at hub.turbulenz.com.

Text

Play-before-sign-in added to Turbulenz

Turbulenz SDK 0.23.0 is now available on the hub.

The main update in this release is to add support for “Play before sign-in”. This allows users to try games before signing into the game site. The web services are smart enough to then allow users to create accounts later and keep all the badges, scores and their game progress.

New Features

  • Support for Internet Explorer 10 has now been added.
  • Support has been added in Turbulenz Services for play before sign-in. Games that are built with this version of the SDK will automatically support play before sign-in, when available on turbulenz.com

Fixed

  • In previous versions, calls to Turbulenz.setInterval() in plugin mode could generate callbacks at 60Hz independent of the interval value passed in. This has been fixed.
  • The previous version of the Turbulenz Engine installer (0.22.0) for Mac OS X unconditionally replaces parts of existing plugins, even if a newer plugin is already installed. This has been fixed, but users installing 0.22.0 after later versions of the engine should be aware of this behaviour and should ensure that they (re)install the newest Turbulenz Engine after 0.22.0 if they wish to continue using the 0.22.0 engine alongside newer versions.
  • Callbacks from the NetworkDevice are now called asynchronously, fixing an inconsistency between the canvas and plugin versions.
  • Sending of websocket data >8kb was being incorrectly buffered in the plugin (T1221)

The full release notes are available online at docs.turbulenz.com.

Text

Physics and multiplayer technology updated in Turbulenz SDK 0.22.0 release

Summary

Turbulenz SDK 0.22.0 is an update for both the Turbulenz Engine Installer and SDK components.

Full release notes are available in the documentation online.

The SDK can be downloaded directly from the Turbulenz Developer Hub.

The SDK is available for Windows, Mac OS X and Linux.

New Features

Payments

Turbulenz payments for local and the Hub is now supported. To use the Turbulenz payments see the documentation for the StoreManager object. Please note that the game site does not yet support payments. Any games published to the game site should not use the StoreManager object.

Leaderboards

The leaderboards.yaml now takes an optional set of default scores for the leaderboards.

Physics

Physics2DDevice object added for high performance 2D physics simulations with Turbulenz. This is a complete 2D physics engine built from the ground up, and optimised for JavaScript.

Physics2D comes with 3 new samples: Physics2D, Physics2D-Constraints and Physics2D-Callbacks demonstrating the main features of Physics2D and co-operation with Draw2D library.

Math

Added 2D vector types and operations to VMath and the MathDevice.

Badges

Badges now allow you to specify an optional predescription, which if specified is used as the description until the badge is unlocked. See Defining your game’s badges.

Debugging Tools

Added DebuggingTools which allows data breakpoints to be set on object properties and array indices.

Rendering

Transient IndexBuffers are now supported: this kind of IndexBuffer is optimized for dynamic single use geometries.

The only change required to use them is to set as true the parameter transient when creating the IndexBuffer.

Multiplayer

The Multiplayer functionality exposed via the TurbulenzServices object has moved into the MultiplayerSessionManager object, please see the documentation for full details.

The behaviour of the createSession function is different to the behaviour of the old createMultiplayerSession function and will now always create a new multiplayer session. If you want the old behaviour please use joinOrCreateSession.

The new functions queryFriendsSessions and joinAnySession allow you to find friends’ multiplayer sessions or join a friend’s multiplayer session automatically.

getJoinRequestQueue replaces the previous methods for responding to multiplayer join requests originating from the game site.

New user session information can be displayed on the game site. The API to add per-player meta-data is exposed on the GameSession object via the setTeamInfo and setPlayerInfo functions.

Services

The DyanmicUI and BridgeServicesSimulator allow you to easily build powerful dynamic user interfaces and preview your integration into the games site while developing games on the local server or the Hub. A version of these tools is included in the MultiWorm sample provided with the SDK. To try them out in your own project simply copy across the contents of the js folder into your own project, add the file duimanager.js to your scripts directory, add duimanager.css to your css folder and add the following lines to the header of your html template:

<link rel=”stylesheet” type=”text/css” href=”css/dynamicui.css”>

<script type=”text/javascript” src=”js/jquery-1.7.1.js”></script>

<script type=”text/javascript” src=”js/duiserver.js”></script>

<script type=”text/javascript” src=”js/bridgeservice.js”></script>

Changes

Engine

The engine loader will now respect the engine version specified for your game. This can be done in the Manage tab for the game in the local development server or directly in the game’s manifest file by adding the line (for instance with the current engine version):

engine_version: ‘0.22.0’

For the game to be publishable, this engine version must be a three-part string (of the form X.Y.Z).

Fixed

Fix for a deficiency in Draw2D for Draw2DSprite objects that previously assumed a 1:1 ratio between Draw2D coordinates and screen pixel coordinates. This previously led to a visible slack in updating of rotations when Draw2D viewport resolution was significantly smaller than that of the screen.

The canvas version of SoundDevice no longer generates 404s on Firefox when sound source stop() is called.

Input events now cause all callbacks to happen outside of the game loop in both canvas and plugin modes. Previously canvas and plugin modes were inconsistent with some callbacks being made during the call to InputDevice.update. Note that InputDevice.update should still be called to ensure all events are reliably delivered to the game.

Fix for the leaderboardResult scrolling functions throwing an exception when a callback argument is provided in TZJS and release builds.

Fix for custom objects appearing as functions when passed from Safari to plugin JavaScriptEngine.

Text

Lock & Load: More Weapons In The Fight For Better Browser Games

Lets face it, developing for lots of different configurations can be a pain. That’s why in this release of the Turbulenz SDK we’ve added functionality to make it easier to check the things you need and not be concerned with the things you don’t. Here are a couple of examples:

Which sound files do I need to load?

The Sound Device has built in checking for supported file formats. It can tell you what a browser supports, saving you from loading megabytes of the wrong file type.

How do I check what version of Turbulenz a user has?

In short, you don’t need to. The new Turbulenz loader takes away the hassle of checking which version a user is running. You request the version of the engine you need and if the user has it, the loader will run it. When on turbulenz.com the site is aware of what the user’s configuration supports and can direct them to the most compatible version of your game. You don’t need to do anything apart from provide the game builds. Cool, huh?

Read More

Text

Multi-player, Multi-configuration, Multi-ple choices!

This release of the Turbulenz SDK is all about multiplying the possibilities. We’ve spent some time making it easier to develop for different target configurations simultaneously. Using the new makehtml and maketzjs tools you can write code once, create a canvas and a plugin compatible version of your game at the same time.

Now that you can target multiple configurations, why not add multiple players? We’ve introduced a new multi-player match making service. When integrated into your game it automatically pairs players with their friends ensuring that you’re not playing alone when you could be playing together.

There’s a new place for the full set of release notes.

Read More

Text

Robust input, robust loading and robust profiling

Are you interested in a more flexible method of detected user input? If so, then this release of the Turbulenz SDK is for you. We’ve added additional callbacks and input state detection, so now you can tell if a user has clicked on your game and when they navigate to a different window. We’ve also bundled a robust request handler that deals with lost internet connections. Lose a connection, stay in the game!

The full release notes are available on Github - you need access to the Turbulenz SDK repository to read these. Get in touch if you want early access.

Read More

Text

Turbulenz SDK 0.17.0 now available

Have you been working on a HTML5 game using canvas? Turbulenz SDK 0.17.0 introduces canvas support, providing the first step in bringing your game to the Turbulenz platform, not to mention making it playable on browsers that lack canvas compatibility. In this SDK we’ve also revamped our input support providing a system of mapping keys that works for Windows/Mac and across different keyboard configurations.

The full release notes are available on Github - you need access to the Turbulenz SDK repository to read these. Get in touch if you want early access.

Read More

Text

Turbulenz SDK 0.16.0 now for Mac OS X

After enough people asked for it, we’ve let the Mac OS X version of the Turbulenz SDK escape. What’s in it? Well exactly the same features as the Windows version.

It can be downloaded right now from Github.

The download comes as a binary payload embedded in a Shell script. Just execute the script and it will ask where the SDK should be installed and then build everything. Nice and simple.

Read More

Text

Turbulenz SDK 0.16.0 now available

Stop the press! This release of the Turbulenz SDK 0.16.0 comes with a special feature that we at Turbulenz are proud to make available to users and developers.

Introducing Apple Mac OS X support for the Turbulenz Engine. Now you can access the Turbulenz game site and other services using your Mac. We’ve been working towards a goal of ensuring a great user experience on each of our supported platforms, so we hope you enjoy it.

The full release notes are available on Github - you need access to the Turbulenz SDK repository to read these. Get in touch if you want early access.

Read More

Text

Turbulenz SDK 0.15.0 now available

A new version of the Turbulenz SDK is now available!

The Turbulenz Team has been busy in the lab cooking up some new features and we’re excited about what the Turbulenz SDK 0.15.0 brings for our developers! This release introduces new Turbulenz Services: ‘Leaderboards’, ‘Badges’ and ‘User Profiles’ to developers. With added support for Firefox 4/5 and Internet Explorer 9, speed improvements and WebGL support, there’s a lot crammed in there, so read on to find out more.

The full release notes are available on Github

Read More

Text

Turbulenz SDK 0.14.0 now available

The next version of the Turbulenz SDK is ready.

In this release, we bring you a range of new samples to aid your development with Turbulenz technology.

We have also included improved graphics support:

  • Closer alignment with OpenGL ES 2.0
  • Compatibility with older graphics chipsets and graphics drivers with known OpenGL implementation issues

The full release notes are available on Github - make sure you’re signed in to see them.

Read More

Text

Turbulenz SDK 0.13.0 now available

A new version of the Turbulenz SDK is now available! 

In this release, we’ve added another Turbulenz Service API and improved the Turbulenz Engine installer to be as easy as possible.

The full release notes are available on Github - make sure you’re signed in to see them.

Read More

Archive Random Next page Page 1 of 2