Subscribe to GameFromScratch on YouTube Support GameFromScratch on Patreon

20. December 2012

GarageGames have announced the 2.0 release of the recently open-sourced Torque 3D game engine.


Torque3D game engine screen shot

So, what is new?


  • Project Manager, a Qt based project creation tool, for creating projects from Torque Templates
  • A dedicated Linux game server, guess this is easily the biggest new feature of this release
  • Various smaller bug fixes and improvements


Plus a series of small improvements and bug fixes:



  • Fix some PHP 5.3.0 errors and warnings (Issue 42)
  • Fixes the dllmain.h template file to include MIT header (Issue 16)
  • Added support for FMOD 4.42.03 Stable (Issue 3)
  • Torque 3D Toolbox fix for project launching (Issue 12)
  • Prevented #define for in VS2012 (Issue 39)
  • Made Item network members properly in the editor. (Issue 37)
  • Required changes to the Torque3D to make it Linux-compatible. (Issue 19)
  • Fix for Issue #54 for PhysX client crash on exit (Issue 54)
  • Fix for Issue #56 for ShapeEditor save crash (Issue 56)
  • AI related bug fixes and improvements. (Issue 11)
  • Fix for Issue #62 for Large decal disappears (Issue 62)
  • Fix for Issue #64 for GuiTabBookCtrl rendering (Issue 64)
  • Rename AiPlayer::produce() to AiPlayer::spawnAtLocation() (Issue 67)
  • Fix for Issue #66 for Skinned mesh crash (Issue 66)
  • SpawnSphere leaves its spawned object at the origin (Issue 44)
  • Fix for Issue #88 for River Editor Snapping (Issue 88)
  • Fix for Issue #90 for Camera orbit object bug (Issue 90)
  • Fix for Issue #94 for Cubemap render bug (Issue 94)
  • Fix for Issue #96 for DAE updating crash (Issue 96)
  • Issue #106 Convex Shapes Consume Too Much Bandwidth (Issue 106)
  • Issue #108 Turret assumes "heading" node is parented to node with zeroed rotation (z-up) (Issue 108)
  • Issue #111 Fix various bitstream issues (Issue 111)
  • Issue #110 T3D 1.2 - Particle Emitter ejectionPeriodMS has 1000 limit (Issue 110)
  • Issue #114 FootStepSounds issue has occurred again (Issue 114)
  • Issue #116 Crash with text using high-numbered unicode characters (Issue 116)
  • Issue #118 Collada Importer doesn't render meshes without materials from blender (Issue 118)
  • Issue #120 ArrayObject Sort - Desc Parameter is inverted (Issue 120)
  • Issue #122 Issue in Material Editor Setting for Sounds (Issue 122)
  • Issue #124 CustomMaterial Back Buffer Refraction (Issue 124)
  • Issue #126 TCPObject gives "Got bad connected receive event" (Issue 126)
  • Issue #128 Soldier shadow displayed in 1st-person view looks wrong with no feet (Issue 128)
  • Issue #130 Decals not obeying smoothing groups on meshes (Issue 130)
  • Issue #132 RenderOcclusionMgr uses fixed function rendering (Issue 132)
  • Issue #134 VS2010 and .rc files (Issue 132)
  • Issue #136 Zoning Bug in Underwater Cave (Issue 136)
  • Issue #138 guiArrayCtrl Clip Rectangle Fix (Issue 138)
  • Issue #69 RayInfo distance with ContainerRayCast (Issue 69)
  • Issue #71 BitVector don't have copy-constructor/operator= (Issue 71)
  • Issue #141 Remove Toolbox and all game binaries (Issue 141)
  • Issue #61 GuiHealthTextHud - a C++ replacement for the scripted numerical health hud. (Issue 61)
  • Issue #151 New gitignore for Project Manager (ssue 151)
  • Issue #155 Billboard Creation on Dedicated Server (Issue 155)
  • Issue #158 Partial revert of changes from Pull #125 (Issue 158)
  • Issue #152 Unmatched Bitstream changes in Pull Request #112 (Issue 152)
  • Issue #166 Client does not completely load with a dedicated server (Issue 166)
  • Issue #170 Some assets do not load under Linux dedicated server (Issue 170)
  • Issue #172 Dedicated server - Crash when a turret fires at an enemy (Issue 172)
  • Issue #174 Player turret weapon targets the wrong direction (Issue 174)



You can read the official announcement thread here.

You can download the Torque3D source code on Github.

You can browse the documentation here.

While the new project manager is available here.


Good job on the new release Torque team, keep 'em coming.


18. December 2012


I have added a pair of books, and replaced a duplicate entry with a different book on the Unity 3D Book Round-up. Another two Unity 4 books have been announced with release dates in March of 2013.


The first newish entry is Essential 3D Game Programming which replaced the duplicate entry of Unity 3.x Scripting on the list ( thanks for the heads up in comments! ).  This book has been on my radar for some time but had minimal information, now there is a bit more available.  That said, something about this book is really setting off my warning alarms… starting with the fact the artist on the cover graphic doesn’t match the author of the book.  Caveat emptor and all of that!


The other two are from established publishers, so no concern in that regard, both are upcoming books on Unity 4.


The first is Learn Unity 4 for iOS Game Development published by APress.

The second is Unity 4.x Cookbook published by Packt Press.  Oddly enough, this book isn’t yet up on Amazon.  Will edit the links when this changes.


As stated earlier, both of these books ( as well as Beginning 3D Game Development with Unity 4 all ship in March of 2013.

News ,

17. December 2012

This math recipe is a bit different.  It is in direct response to a question I received about how to give your sprite the ability to shoot.  That is exactly what we will be doing in this recipe.  There is no actual new math, it actually is just applying our prior recipes on Velocity and our recipe on Rotating to face a point.  As those prior recipes both explained how they work, this particular entry is going to be light on description.



Just the Math

// calculate the speed relative to the mouse click distance

bullet.speed *= (bullet.y - bullet.targetY)/100;


// now calculate the angle between the bullet and mouse click

bullet.angle = Math.atan2(bullet.targetY - bullet.y, bullet.targetX - bullet.x );

bullet.angle = bullet.angle * (180/Math.PI);


bullet.onTick = function(delta){

    var velocityX = Math.cos((bullet.angle) * Math.PI / 180* (bullet.speed * delta);

    var velocityY = Math.sin((bullet.angle) * Math.PI / 180* (bullet.speed * delta);


    bullet.x += velocityX;

    bullet.y += velocityY;






Click anywhere on screen to shoot. The location determines the angle of the shot, while distance from the jet determines the speed


The actual description behind the mathematics are available at the two linked tutorials at the beginning and end of this recipe.  This is just a quick explanation of exactly what this application does.  We are creating an Array of bullet objects, a class we define ourselves inline.  The bullet simply contains its location (x,y), the location it is targeting (the user click position, targetX and targetY), the angle, speed ( pixels per second ) and finally a graphic that we will create in a moment.  We set the users speed using a multiple relative to the click distance away from the jet sprite.  For example, if the user clicks at 40 on the Y axis, the bullet be moving at  50 * (340-40)/100 == 50 * 3 == 150 pixels / second.  For the record, don't click at 340 in the Y axis or your bullet won't go anywhere! :)

Now that we have the speed, we calculate the initial angle between the jet and the location the user clicked.  Next we register an on tick() method that will be called each frame to update the bullet.  We simply check to see if the bullet is completely off screen in any direction, and if it is, we remove it from our array.  Otherwise we apply our velocity along our given angle, and update the X and Y values accordingly.  The remains of the tick function simply draw the newly updated bullet.


Complete Code

<!DOCTYPE html>



    <script src=""></script>


        var jetSprite;

        var stage;

        var bullets;



        document.addEventListener('DOMContentLoaded', demo,false);


        function demo(){

            bullets = new Array();

            stage = new createjs.Stage("theCanvas");


            stage.canvas.onmouseover = function(e){

       = "crosshair";



            stage.canvas.onclick = function(e){


                userClicked = true;


                var bullet = {

                    x: 200,









                // calculate the speed relative to the mouse click distance

                bullet.speed *= (bullet.y - bullet.targetY)/100;


                // now calculate the angle between the bullet and mouse click

                bullet.angle = Math.atan2(bullet.targetY - bullet.y, bullet.targetX - bullet.x );

                bullet.angle = bullet.angle * (180/Math.PI);



                bullet.onTick = function(delta){


                    if(this.x < -10 || this.x > stage.canvas.width+10 || this.y < -10 || this.y > stage.canvas.height+10){


                        // Remove this bullet from the bullet list

                        var idx = bullets.indexOf(this);


                        console.log(idx + " " + bullets.length);

                        //console.log("Bullet destroyed");



                    var velocityX = Math.cos((bullet.angle) * Math.PI / 180* (bullet.speed * delta);

                    var velocityY = Math.sin((bullet.angle) * Math.PI / 180* (bullet.speed * delta);


                    bullet.x += velocityX;

                    bullet.y += velocityY;

                    if(this.bulletGraphic !== null)


                    var g = new createjs.Graphics();





                    this.bulletGraphic = new createjs.Shape(g);






            jetSprite = new createjs.Bitmap("jetsprite.small.png");

            jetSprite.regX = 30// Half image width

            jetSprite.regY = 40// Half image height

            jetSprite.y = 360;

            jetSprite.x = 200;




            jetSprite.image.onload = function(e){



            //And go...



            // onFrame will be called each "tick". Default is 50ms, or 20FPS




        function onFrame(elapsedTime) {

            // Convert from milliseconds to fraction of a second

            var delta = elapsedTime /1000;


            for(var i = 0; i < bullets.length; i++){









<canvas width=400 height=400 id="theCanvas" style="background-color:black" />



See Also

See Velocity and Angular Velocity for information on how to move the bullet along a given angle at a given speed.

See Rotating to face another object for details on how to calculate the angle between the jet and the mouse click location.



14. December 2012

Whoops.  I generally keep on top of new Blender releases, but this one slipped past my radar.  So, this new is a bit dated.

Blender 2.65 splash


Anyways, Blender 2.65 was released a couple days ago.  This post takes a look at what's in this release of interest for game developers.  At first glance, not too much.  At second glance, quite a bit actually.  At third glance, you are glancing too much and it's time to simply look!



First off, stability.  Over 200 items were knocked off the bug list.  More stability is always nice.


Stuff not really all that gamedev related

  • Fire simulation and smoke flow force field added
  • Open Shading language support added to Cycles renderer
  • anisotrophic shading node added
  • anti-aliased viewport drawing


Game dev related additions

  • decimator modifier rewritten and now preserves UV 
  • new smooth modifier that can preserve edges and volumes
  • triangulate modifier which can be used for creating baked normal maps
  • bevel now includes round and no longer sucks
  • a symmetrize tool was added
  • a tool for transferring vertex weights between objects



There is not a ton to the bevel controls:

Blender Bevel

 Basically you have offset and segment.


 Offset is the amount to bevel by


 Segments is the number of iterations or edges to use when composing the bevel



More impressive are the results, before bevelling multiple edges was… ugly.  Now:

Bevel Results


















So how exactly does Symmetrize work in Blender?  Remarkably well actually…  Check this out.



Blender Symmetrize Before



















Blender Symmetize After



















Too damned cool.  So, basically it's like a mirror modifier… that you can apply after the fact.  I like.  Options are pretty simple over all. 


Mirror Direction









Basically you just pick the axis and direction you want the symmetry applied along.  Again, very cool.


Great job on the release Blender team.  Head on over and download it here.

Art, News

13. December 2012


Some months back we announced that Torque3D had gone open source, now it’s 2D cousin has gone open source as well. 


Torque2D is a 2D version of the Torque game engine that also includes WYSIWYG level editing tools and it’s own scripting language, TorqueScript.


As you can see from the picture to the right, iTorque2D, the iOS version of Torque2D, is being folded in to this release.  Torque2DMIT will be released early next year.  However there is one gotcha with that release date:


In order to work in an open source environment as soon as possible, we made a decision to publish our initial version of Torque 2D MIT without the editors; in other words, the initial version will be an API only engine with tool development to follow thereafter.


So basically that WYSIWIG level editor I just mentioned?  Well, it wont be ready day one.


As to the license, the MIT license is one of the least restrictive open source licenses available.  Basically you can do what you want with it.


You can read more details about Torque2D here.


Pretty cool news over all.  When Torque3D was open sourced, they moved pretty quickly to release the source code, so hopefully the same happens here.


Month List

Popular Comments

Tiled 0.16.2 Released
Subscribe to GameFromScratch on YouTube Support GameFromScratch on Patreon

8. July 2016


Tiled, a popular open source 2D map editor, just released version 0.16.2.  If you are interested in learning more about Tiled we have a complete tutorial series here on GameFromScratch.


The 0.16.2 is composed entirely of fixes, including:

  • JSON plugin: Fixed loading of custom properties on terrains
  • Lua plugin: Fixed missing export of object layer drawing order (#1289)
  • Fixed tile index adjustment when tileset image changes width (#1242)
  • Fixed --export-map [format] option (#1307)
  • Fixed shortcuts for some tools when language is set to Dutch (#1280)
  • Fixed a painting related bug affecting the top edge after AutoMapping (#1308)
  • Fixed issues when compiling against Qt 5.6 on OS X and Windows (#1309)
  • Fixed crash on maximizing with Maps view open on Windows (#1153, #1268, Qt 5.6.1)
  • Fixed focus issue while typing predefined object types (#1244, Qt 5.6)
  • Fixed silent fail when saving to restricted location on Windows (#965, Qt 5.6)


You can read the entire notes release here.

GameDev News

blog comments powered by Disqus

Month List

Popular Comments